Tushare 量化实战 05:数据库存储与SQL查询优化
前一篇解决了批量数据获取的速度问题,这篇解决数据持久化:如何将获取的数据存入数据库,并进行高效的SQL查询。选择数据库数据库对比数据库优点缺点适用场景SQLite轻量,单文件,零配置并发性能差开发环境,小规模MySQL成熟稳定,并发好需部署,配置复杂生产环境,中等规模PostgreSQL功能强大,支持JSON资源占用大大型项目,复杂查询MongoDB文档存储,灵活不支持复杂SQL半结构化数据选择:SQLite(开发)+ MySQL(生产)表结构设计股票基础信息表-- stock_basic 表CREATETABLEstock_basic(ts_codeVARCHAR(20)PRIMARYKEY,-- 股票代码symbolVARCHAR(10)NOTNULL,-- 股票代码(不带后缀)nameVARCHAR(50)NOTNULL,-- 股票名称areaVARCHAR(50),-- 所属地域industryVARCHAR(50),-- 所属行业list_statusVARCHAR(1)NOTNULL,-- 上市状态(L 上市/D 退市/P 暂停)list_dateDATE,-- 上市日期delist_dateDATE,-- 退市日期updated_atTIMESTAMPDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP);-- 索引CREATEINDEXidx_industryONstock_basic(industry);CREATEINDEXidx_list_statusONstock_basic(list_status);日线行情表-- daily_quotes 表CREATETABLEdaily_quotes(idBIGINTAUTO_INCREMENTPRIMARYKEY,-- 自增IDts_codeVARCHAR(20)NOTNULL,-- 股票代码trade_dateDATENOTNULL,-- 交易日期openDECIMAL(10,4),-- 开盘价highDECIMAL(10,4),-- 最高价lowDECIMAL(10,4),-- 最低价closeDECIMAL(10,4),-- 收盘价pre_closeDECIMAL(10,4),-- 前收盘价changeDECIMAL(10,4),-- 涨跌额pct_chgDECIMAL(10,4),-- 涨跌幅volDECIMAL(15,2),-- 成交量(手)amountDECIMAL(20,2),-- 成交额(万元)created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,updated_atTIMESTAMPDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,-- 唯一索引,避免重复数据UNIQUEKEYuk_code_date(ts_code,trade_date));-- 索引CREATEINDEXidx_code_dateONdaily_quotes(ts_code,trade_date);CREATEINDEXidx_dateONdaily_quotes(trade_date);CREATEINDEXidx_pct_chgONdaily_quotes(pct_chg);股票列表表(沪深300/中证500等)-- index_weight 表CREATETABLEindex_weight(idBIGINTAUTO_INCREMENTPRIMARYKEY,index_codeVARCHAR(20)NOTNULL,-- 指数代码ts_codeVARCHAR(20)NOTNULL,-- 股票代码trade_dateDATENOTNULL,-- 交易日期weightDECIMAL(10,6),-- 权重created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,UNIQUEKEYuk_index_code_date(index_code,ts_code,trade_date));-- 索引CREATEINDEXidx_index_codeONindex_weight(index_code,trade_date);CREATEINDEXidx_ts_codeONindex_weight(ts_code,trade_date);数据库操作封装基础数据库类创建src/db/database.py:"""数据库操作封装"""fromsqlalchemyimportcreate_engine,textfromsqlalchemy.ormimportsessionmaker,SessionfromtypingimportOptional,List,Dict,AnyimportpandasaspdclassDatabase:"""数据库操作类"""def__init__(self,url:str):""" 初始化数据库连接 Args: url: 数据库连接字符串 SQLite: 'sqlite:///data/db/quant.db' MySQL: 'mysql+mysqlconnector://user:pass@localhost/quant' """self.engine=create_engine(url,pool_pre_ping=True)self.Session=sessionmaker(bind=self.engine
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2410909.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!