2. 以标准化方式从数据表中提取信息
前面的章节中,我们介绍了数据源和数据源的概念,并且介绍了如何往数据源中填充金融数据。在这一章节中,我们将介绍如何从数据源中提取对我们有用的信息,而不仅仅是读取数据。
QTEASY数据管理模块: 
2.1. 信息 != 数据
在量化交易中,我们需要准备大量的金融数据,然而,数据并不是最终的目的,我们需要从数据中提取有用的信息。在交易策略中,我们使用这些信息作出交易决策。
信息不等于数据,有些信息是可以直接从数据表中读出来的,比如股票的收盘价,开盘价等。但是,有些信息是需要通过一定的计算才能得到的,比如股票的复权价格等。
例如,我们在交易策略中需要用到股票的前复权价格,我们知道,复权价格是用股票的价格以及复权因子计算得到的,分别保存在下面两张表中:
stock_daily:股票日K线行情表,包含了股票的开盘价、收盘价、最高价、最低价等信息。stock_adj_factor:股票复权因子表,包含了股票的复权因子信息。
此时,上面两张表中已经保存了我们需要的数据,但它们并不是我们需要的信息,我们需要通过计算才能得到我们需要的信息。
因此,为了获取复权价格这条信息,我们无法避免繁琐的计算过程。
而且,还必须考虑到,如果我们需要的不是复权日K线价格,而是复权后的小时K线价格,还需要把日K线数据转换为小时K线数据,这样的计算过程更加复杂。
在交易策略的实现过程中,如果每次使用复权价格时都要考虑上面的转换和计算过程,那么会使得策略的实现变得复杂,而且容易出错。也会让我们把有限的精力 分散到这些琐碎的计算过程中,而不是集中在策略的实现上。
因此,我们需要一种方法,能够把这些琐碎的计算过程封装起来,使得我们在实现策略时,只需要关注策略本身,而不需要关注这些琐碎的计算过程。
为此,qteasy数据管理模块提供了一种标准化的方式,用于从数据表中提取信息。这种方式就是DataType对象。
2.2. DataType对象
DataType对象是QTEASY数据管理模块中的一个重要对象,它在v1.4版本中正式引入,它封装了标准化的数据处理逻辑,用于从数据表中提取信息。使得用户只要定义好一个DataType对象,就不需要再将精力分散在琐碎的数据信息获取计算过程中,而是可以专注于策略的实现。
qteasy提供了大量内置预定义的DataType对象,用户也可以根据自己的需求自定义DataType对象。
举一个简单的例子,假设我们需要获取股票的后复权价格,可以直接使用内置的DataType: close|b对象,如下所示:
# 获取格力电器 2025-02-01 到 2025-02-27 的后复权收盘价
import qteasy
from qteasy.datatypes import DataType
close_b = DataType(name='close|b', asset_type='E', freq='D')
# 获取数据
close_b.get_data_from_source(
datasource=qteasy.QT_DATA_SOURCE,
symbols='000651.SZ',
starts='2025-02-01',
ends='2025-02-27',
)
ts_code 000651.SZ
trade_date
2025-02-05 9234.85
2025-02-06 9194.82
2025-02-07 9295.95
2025-02-10 9245.38
2025-02-11 9199.03
2025-02-12 9220.10
2025-02-13 9232.74
2025-02-14 9268.56
2025-02-17 9201.14
2025-02-18 9066.29
2025-02-19 8836.63
2025-02-20 8817.67
2025-02-21 8714.43
2025-02-24 8695.47
2025-02-25 8533.23
2025-02-26 8621.72
2025-02-27 8729.18
2.3. 所有 DataType 清单(罗列并简短介绍)
qteasy 2.0 内置了大量 DataType,每种数据类型由 name(名称)、freq(频率)、asset_type(资产类型)唯一确定,并对应到具体数据表及列或计算方式。完整清单可通过 qteasy.datatypes.get_dtype_map() 获取,返回的 DataFrame 索引为 (dtype, freq, asset_type),列包含 description(用途描述)、acquisition_type(获取方式)等。
获取完整清单
import qteasy
from qteasy import datatypes
# 仅内置类型
dtype_map = datatypes.get_dtype_map()
print(dtype_map.head(20))
# 含用户自定义类型(若有)
dtype_map_all = datatypes.get_dtype_map(include_user_defined=True)
常见数据类型示例
name(名称) |
freq |
asset_type |
用途简述 |
|---|---|---|---|
trade_cal |
d |
None |
交易日历 |
close|b |
D |
E |
股票后复权收盘价 |
close|f |
D |
E |
股票前复权收盘价 |
open, high, low, close, vol |
D/1min/5min/… |
E/IDX/FD 等 |
K 线开高低收、成交量 |
open|b, high|b 等 |
D |
E |
后复权开高低收 |
stock_symbol, stock_name, industry |
None |
E |
股票代码、名称、行业等基本信息 |
wt_idx|% |
d |
E |
指数成分股权重 |
… |
… |
… |
完整列表见 get_dtype_map() 输出 |
上表中 freq 常用取值:D 日线,1min/5min 等为分钟线,None 表示与频率无关(如基本信息)。asset_type:E 股票,IDX 指数,FD 基金,None 表示不限定资产。每种类型的详细说明、对应数据表及列见 get_dtype_map() 返回的 description 与 kwargs。
当需要在同一时间轴上同时携带多只标的、多种数据类型(例如 OHLC 与成交量一并参与计算或出图)时,下一章 HistoryPanel(历史数据面板) 介绍如何把 get_history_data 的结果收拢为三维面板;制图入口则见再下一章 HistoryPanel 可视化。