3. IC分析所需数据准备:股票池构建与行情因子数据

IC(信息系数)分析的核心在于计算因子值与未来收益之间的截面相关性。因此,数据准备的精确性直接决定IC分析的可信度。本章聚焦于构建分析所需的三大数据支柱:股票池、行情数据与因子数据。

3.1 股票池构建:分析基石的选定

股票池决定了IC分析所覆盖的投资域。不同的股票池对应不同的市场风格与风险暴露,需根据研究目标谨慎选择。

股票池类型 成分股数量 适用场景 数据获取要点
全市场 全部上市股票(约5000+) 宏观因子测试、宽基选股策略 需剔除ST、*ST、退市整理及次新股(上市<60天)
沪深300 300只 大盘蓝筹风格、机构重仓股因子 每月/每季度按中证指数公司公告调整成分股
中证500 500只 中盘成长风格、中小市值因子研究 注意成分股调整日期,避免未来数据
实战建议: 在因子研究初期,建议同时构建全市场与沪深300两个池子。全市场池用于观察因子的普遍有效性,沪深300池用于检验因子在机构核心持仓中的表现。中证500池则常用于捕捉中小盘特有的反转或成长效应。

3.2 行情数据:日频收益率的精确计算

IC分析通常使用日频收益率作为预测目标。收益率计算需考虑复权价格,以真实反映投资者的实际回报。

  • 后复权价格:用于计算长期持有收益率,适合长周期IC分析(如月度IC)。
  • 前复权价格:保持当前价格不变,调整历史价格,适合回测与每日调仓策略。
  • 收益率公式:R_t = (P_t / P_{t-1}) - 1,其中 P_t 为第 t 日的复权收盘价。
# Python 示例:计算日频收益率
import pandas as pd

# 假设 df 包含 'close_adj' 列(复权收盘价)
df['return'] = df['close_adj'].pct_change()
df['return_1d'] = df['close_adj'].shift(-1) / df['close_adj'] - 1  # 下一日收益率
常见陷阱: 使用未复权价格计算收益率会导致分红、送股日出现异常跳变,使IC值失真。务必使用复权价格,并注意复权方式与IC预测周期的一致性。

3.3 因子数据:原始值、行业与市值

因子数据是IC分析的自变量。除了因子原始值外,行业归属与市值数据是后续进行中性化处理的必备字段。

数据字段 说明 数据来源
因子原始值 如市盈率、动量、换手率等,未经任何处理 财报数据库、行情衍生计算
行业分类 申万一级/二级行业、中信行业等 金融数据终端(Wind、聚宽、Tushare)
市值 总市值或流通市值,通常取对数 日频行情数据

3.4 数据准备全流程架构

下图展示了从原始数据到IC分析就绪状态的完整数据流。每一步都涉及关键的数据清洗与对齐操作。

IC分析数据准备流程 股票池构建 全市场 / 沪深300 / 中证500 行情数据 日频复权收盘价 → 收益率 因子数据 原始值 + 行业 + 市值 数据清洗与对齐 剔除ST/次新股 · 统一交易日索引 · 处理缺失值 · 去极值 因子预处理(中性化 + 标准化) 行业市值中性化 · Z-Score标准化 · 分位数映射 IC分析就绪数据

3.5 数据对齐的关键细节

在合并股票池、行情与因子数据时,必须确保时间戳与股票代码的严格对齐。以下是数据合并的典型步骤:

  1. 生成交易日历:确定IC分析的时间区间,生成完整的交易日序列。
  2. 构建面板数据:以 (日期, 股票代码) 为索引,左连接股票池、行情收益率与因子值。
  3. 前向填充因子:对于月度更新的因子(如财报类),使用前向填充法填充至下一个更新日。
  4. 对齐预测期:将 t 日的因子值与 t+1 日的收益率对齐,形成 (因子_t, 收益_t+1) 的配对。
# 数据对齐示例(伪代码)
import pandas as pd

# 假设已有三个DataFrame
stock_pool = pd.read_parquet('stock_pool.parquet')  # 列: date, code, in_pool
factor_data = pd.read_parquet('factor_data.parquet')  # 列: date, code, factor_value, industry, market_cap
return_data = pd.read_parquet('return_data.parquet')  # 列: date, code, return_1d

# 合并
merged = stock_pool.merge(factor_data, on=['date', 'code'], how='inner')
merged = merged.merge(return_data, on=['date', 'code'], how='inner')

# 筛选在池股票
merged = merged[merged['in_pool'] == True]

# 对齐:因子日期与收益日期已一致,直接使用
ic_data = merged[['date', 'code', 'factor_value', 'return_1d', 'industry', 'market_cap']]
关键检查点: 在完成数据准备后,建议随机抽取10只股票,手动验证某一天的因子值与次日收益率是否匹配。这一步能有效发现索引错位或未来数据泄露问题。

3.6 数据质量检查清单

在进入IC计算之前,使用以下清单进行最终确认:

  • ✅ 股票池是否已剔除ST、*ST、退市及次新股?
  • ✅ 收益率是否基于复权价格计算?
  • ✅ 因子数据是否包含行业与市值字段?
  • ✅ 面板数据是否存在缺失值?缺失比例是否超过阈值(如5%)?
  • ✅ 因子值与未来收益率的时间对齐是否正确?
  • ✅ 是否存在未来数据泄露(如使用未来信息填充因子)?

完成以上步骤后,数据已具备进行IC分析的条件。下一阶段将进入IC的计算与统计检验环节。