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分析就绪状态的完整数据流。每一步都涉及关键的数据清洗与对齐操作。
3.5 数据对齐的关键细节
在合并股票池、行情与因子数据时,必须确保时间戳与股票代码的严格对齐。以下是数据合并的典型步骤:
- 生成交易日历:确定IC分析的时间区间,生成完整的交易日序列。
- 构建面板数据:以
(日期, 股票代码)为索引,左连接股票池、行情收益率与因子值。 - 前向填充因子:对于月度更新的因子(如财报类),使用前向填充法填充至下一个更新日。
- 对齐预测期:将 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的计算与统计检验环节。