3. 数据获取、存储与数据类型
3.1. 1. 数据层在整体中的位置
数据层为策略层与运行层提供“按类型、按窗口”的历史信息。策略不直接访问原始数据表,而是声明自己需要哪些 DataType 以及多长的 window_length;运行前,引擎根据这些声明从 DataSource 中取出对应数据、整理成数据窗口并注入策略。这样既保证了回测与实盘使用同一套数据视图,也从机制上避免了策略使用“未来数据”。
3.2. 2. 从原始数据到本地存储
2.1 数据流
外部数据源(如 Tushare、东方财富等)→ 拉取与清洗(格式统一、去重、对齐)→ DataSource(文件或数据库)→ 以统一结构写入多张数据表。
2.2 DataSource 的角色
统一存储抽象:无论底层是 CSV/HDF/Feather 文件还是 MySQL 等数据库,对上层而言都是“按表名、按列”读写。
多引擎支持:可配置为 file(csv/hdf/fth)或 db(mysql 等),满足不同部署需求。
不主动拉数:DataSource 只负责读写本地已存在的数据;从网络拉取与更新由用户或定时任务调用数据接口完成,再写入 DataSource。
因此,数据层设计把“拉取”和“存储”分开:拉取得到的数据经清洗后写入 DataSource,策略与回测只消费 DataSource 中已有的数据。
3.3. 3. 数据表
内置表划分:qteasy 预定义了多张数据表,大致包括行情类(如日线、分钟线)、财务类(利润表、资产负债表等)、宏观与指数等。每张表有固定的表名、主键与列结构。
表结构与 DataType 的对应关系:一种“可被策略引用的信息”往往对应某张表的某列(或若干列经计算得到)。DataType 的 name(及 freq、asset_type)与数据表/列的映射在系统内维护,策略只需通过 DataType 或 dtype_id 声明需求,无需关心具体表名或列名。
3.4. 4. DataType:从“表里的数据”到“策略可引用的信息”
4.1 name、freq、asset_type 与 dtype_id
name:数据类型名称(如 close、open、total_mv、pe),对应某类可用的信息。
freq:数据频率(如 d/w/m/q),与数据表的时间粒度或重采样方式相关。
asset_type:适用的资产类型(如 E、IDX、ANY),用于区分股票、指数等。
dtype_id:由上述三者生成,规则为
name_assettype_freq,例如close_E_d、total_mv_E_q。策略在get_data(dtype_id)时使用该 id。
4.2 内置 DataType 与数据表/列的映射
系统内置大量 DataType,分别映射到不同数据表的列或衍生列。具体表名、列名及获取方式见《下载并管理金融历史数据》与 API 文档中的数据类型与数据表说明;本系列仅强调:策略只通过 DataType(dtype_id)引用数据,不直接依赖表结构,这样表结构演进时只需调整映射关系,而不必改策略代码。
3.5. 5. 小结:为什么策略只接触 DataType 而不直接读表
一致性:回测与实盘都通过同一套“声明 DataType + 引擎按窗口注入”的路径取数,避免两套逻辑。
防未来函数:引擎严格按当前时间步和 window_length 准备过去的数据窗口,策略无法访问未注入的将来数据。
接口统一:所有策略都用
get_data(dtype_id)取数,dtype_id 与 DataType 一一对应,便于维护与扩展。
更多数据配置与 API 用法见《下载并管理金融历史数据》与 API 参考。