2. 金融市场基础与数据源
量化因子研究的起点是理解交易品种与获取高质量数据。本章将系统梳理股票、期货、ETF 等常见标的的核心特征,解析 K 线、财务与另类数据的结构,并对比国内主流数据提供商(Wind、Tushare、AKShare)的适用场景。
2.1 常见交易品种
不同交易品种在交易规则、数据频率、因子逻辑上存在显著差异。下表列出三类核心品种的关键属性:
| 品种 | 交易场所 | 交易时间 | T+0 / T+1 | 最小变动单位 | 典型因子方向 |
|---|---|---|---|---|---|
| 股票 | 上交所、深交所、北交所 | 9:30-11:30 / 13:00-15:00 | T+1 | 0.01 元 | 动量、价值、质量、低波 |
| 期货 | 中金所、上期所、大商所、郑商所 | 日盘 + 夜盘(品种各异) | T+0 | 合约规格决定 | 期限结构、动量、持仓量 |
| ETF | 沪深交易所 | 同股票 | T+1(部分跨境 T+0) | 0.001 元 | 行业轮动、折溢价、资金流 |
实战提示:期货的夜盘数据对隔夜跳空因子影响显著,处理时需将夜盘与次日日盘合并为完整交易日。股票因子回测必须考虑涨跌停板与停复牌对价格序列的干扰。
2.2 三类核心数据结构
2.2.1 K 线数据(高频/日频)
K 线是量化因子最基础的输入。标准 OHLCV 结构包含:
- Open(开盘价)—— 当日第一笔成交价
- High(最高价)—— 当日最高成交价
- Low(最低价)—— 当日最低成交价
- Close(收盘价)—— 当日最后一笔成交价(含集合竞价)
- Volume(成交量)—— 当日总成交股数/手数
- Amount(成交额)—— 当日总成交金额
分钟级 K 线用于高频因子(如分钟反转、成交量分布),日频 K 线用于传统截面因子(如动量、波动率)。
2.2.2 财务数据(季度/年度)
财务数据是基本面因子的核心原料。关键字段包括:
| 类别 | 常用字段 | 因子应用 |
|---|---|---|
| 利润表 | 营业收入、净利润、扣非净利润 | 盈利因子(ROE、ROA) |
| 资产负债表 | 总资产、净资产、负债合计 | 杠杆因子、市净率 |
| 现金流量表 | 经营活动现金流净额 | 现金流质量因子 |
| 估值衍生 | PE、PB、PS、PCF | 价值因子 |
数据对齐陷阱:财务数据发布存在滞后(年报截止次年4月底,季报截止季后1个月)。因子计算时必须使用“可获取时间戳”,避免未来函数。建议使用财报发布日期而非报告期。
2.2.3 另类数据
另类数据是近年因子挖掘的热点方向,常见类型包括:
- 舆情数据:新闻情感、社交媒体热度、分析师研报标题
- 产业链数据:上游价格、中游开工率、下游出货量
- 高频微观数据:逐笔委托、Level-2 行情、订单簿不平衡
- 卫星/物流数据:停车场车流、集装箱吞吐量、航班轨迹
2.3 常见数据提供商对比
国内量化研究者主要依赖以下三类数据源。下表从数据范围、更新频率、成本、编程接口四个维度进行对比:
| 提供商 | 数据范围 | 更新频率 | 成本 | 编程接口 | 适合场景 |
|---|---|---|---|---|---|
| Wind | 全品种(股/债/期/基/衍生品) | 实时 + 日终 | 高(机构年费) | WindPy(Python)、COM、Excel | 机构投研、组合管理 |
| Tushare | 股票、基金、期货、指数 | 日频为主,部分分钟 | 积分制(免费+付费) | tushare(Python SDK) | 个人研究、因子回测 |
| AKShare | 股票、期货、外汇、宏观、另类 | 日频 + 实时(部分接口) | 免费开源 | akshare(Python 库) | 快速原型、教学、小规模策略 |
选型建议:机构团队优先 Wind(数据质量与客服支持最好);个人研究者推荐 Tushare Pro(性价比高);教学与快速验证场景使用 AKShare(零成本、接口丰富)。多数据源交叉验证是避免数据错误的行业最佳实践。
2.4 数据获取流程架构
下图展示从数据源到因子计算的标准数据管道:
2.5 数据获取代码示例
以下展示使用 AKShare 获取 A 股日频 K 线数据的典型代码:
import akshare as ak
import pandas as pd
# 获取平安银行(000001)日频 K 线
stock_zh_a_hist_df = ak.stock_zh_a_hist(
symbol="000001",
period="daily",
start_date="20230101",
end_date="20231231",
adjust="qfq" # 前复权
)
# 查看数据结构
print(stock_zh_a_hist_df.head())
# 输出列名
print(stock_zh_a_hist_df.columns.tolist())
# ['日期', '开盘', '收盘', '最高', '最低', '成交量', '成交额', '振幅', '涨跌幅', '涨跌额', '换手率']
数据频率选择:日频数据适合周度/月度调仓的因子(如价值、质量);分钟级数据适合高频因子(如日内动量、成交量分布)。初学者建议从日频数据开始,降低数据清洗复杂度。
2.6 数据质量检查清单
在因子计算前,务必完成以下数据质量检查:
- 缺失值检查:检查 OHLCV 是否存在 NaN,尤其是停牌日与节假日
- 复权处理:股票必须使用前复权或后复权数据,消除分红送股对价格序列的跳跃
- 异常值检测:检查涨跌幅是否超过涨跌停板限制(A股主板 ±10%,科创板/创业板 ±20%)
- 时间戳对齐:确保不同数据源的时间戳格式一致(推荐使用 datetime 类型)
- 代码映射:统一股票代码格式(如 000001.SZ 与 000001 的转换)
行业经验:数据清洗通常占因子研究总工作量的 60% 以上。建议建立自动化数据校验流水线,每次获取新数据后自动生成质量报告(缺失率、异常值数量、时间跨度覆盖度)。