4. 数据准备与预处理:获取组合持仓数据、市场因子数据,并进行清洗与对齐
数据是风险归因与稳定性巡检的基石。在进入模型计算之前,必须完成持仓数据与市场因子数据的获取、清洗与时间对齐。本章节将系统梳理数据准备的标准流程与关键校验规则。
4.1 数据源概览与字段清单
组合风险归因需要两类核心数据:组合持仓数据(描述“投了什么”)与市场因子数据(描述“市场环境如何”)。两者的时间频率与字段结构必须严格匹配。
| 数据类别 | 典型来源 | 核心字段 | 频率要求 |
|---|---|---|---|
| 组合持仓数据 | 交易系统、托管行、组合管理系统 | 证券代码、持仓市值、持仓数量、成本价、行业分类、币种 | 日频 / 周频(取决于归因周期) |
| 市场因子数据 | Wind、Bloomberg、Barra、自建因子库 | 因子收益率、因子暴露度、无风险利率、基准指数收益率 | 日频(与持仓频率对齐) |
| 辅助数据 | 公司行动公告、汇率中间价 | 分红、拆股、配股、汇率 | 事件驱动 + 日频 |
关键提示: 持仓数据中的“证券代码”必须使用统一标识(如 ISIN、SEDOL 或内部统一编码),避免因代码不一致导致因子暴露匹配失败。
4.2 数据清洗核心步骤
原始数据通常包含缺失值、异常值、重复记录与逻辑错误。以下为清洗的标准流程:
- 缺失值处理:检查持仓市值、因子收益率是否为空。对于缺失的因子收益率,使用前值填充或行业均值替代;对于缺失的持仓市值,标记为可疑数据并剔除。
- 异常值检测:使用 Z-score 或 IQR 方法识别极端值。例如,单只股票日收益率超过 ±20% 需人工复核。
- 重复记录去重:按“日期 + 证券代码”去重,保留最新或平均记录。
- 逻辑校验:持仓市值不应为负;因子暴露度应在合理范围(如 Barra 风格因子暴露通常在 ±3 之间)。
- 公司行动调整:分红、拆股后需复权处理,确保收益率序列连续。
实战案例: 某组合在 2024-01-15 因股票分红未复权,导致当日因子归因出现异常。经清洗脚本自动检测到市值突变后,触发复权修正,归因结果恢复正常。
4.3 时间对齐与频率统一
持仓数据与因子数据的时间戳必须严格对齐。常见对齐规则如下:
- 日频对齐:持仓数据取 T 日收盘后快照,因子数据取 T 日收益率,两者在 T 日日期上 JOIN。
- 周频对齐:持仓数据取周五收盘快照,因子数据计算周累计收益率(周五收盘 / 上周五收盘 - 1)。
- 节假日处理:非交易日持仓不变,因子收益率为 0 或跳过该日。
以下为时间对齐的伪代码示例:
-- SQL 示例:持仓与因子日频对齐
SELECT
p.date,
p.security_id,
p.market_value,
f.factor_return,
f.risk_free_rate
FROM portfolio_holdings p
INNER JOIN factor_returns f
ON p.date = f.date
AND p.security_id = f.security_id
WHERE p.date BETWEEN '2024-01-01' AND '2024-12-31'
AND p.market_value > 0;
4.4 数据质量校验清单
在进入归因计算前,建议执行以下自动化校验:
| 校验项 | 预期结果 | 失败处理 |
|---|---|---|
| 持仓市值总和与组合净值偏差 | < 0.5% | 检查遗漏持仓或估值差异 |
| 因子收益率缺失比例 | < 1% | 填充或剔除该因子 |
| 证券代码匹配率 | > 99% | 检查未匹配代码的映射表 |
| 日期连续性 | 无跳日 | 补充缺失日期数据 |
注意: 数据质量不达标时,切勿强行进入归因计算。建议设置数据质量看板,每日自动生成校验报告,标记异常数据供人工复核。
4.5 数据准备流程总览
下图展示了从原始数据到归因输入表的完整流程:
4.6 输出数据格式规范
清洗对齐后的数据应输出为宽表格式,每行代表一个组合-证券-日期的唯一记录,包含以下字段:
-- 最终归因输入表结构示例
date DATE -- 交易日期
portfolio_id VARCHAR(20) -- 组合编号
security_id VARCHAR(20) -- 证券代码
market_value DECIMAL(18,2) -- 持仓市值(元)
weight DECIMAL(10,6) -- 持仓权重(%)
factor_1_exp DECIMAL(10,4) -- 因子1暴露度
factor_2_exp DECIMAL(10,4) -- 因子2暴露度
...
factor_n_exp DECIMAL(10,4) -- 因子n暴露度
factor_1_ret DECIMAL(10,6) -- 因子1日收益率
factor_2_ret DECIMAL(10,6) -- 因子2日收益率
...
factor_n_ret DECIMAL(10,6) -- 因子n日收益率
risk_free_ret DECIMAL(10,6) -- 无风险利率
bench_ret DECIMAL(10,6) -- 基准日收益率
最佳实践: 建议将清洗对齐后的数据存储为 Parquet 或 ORC 列式格式,按日期分区,便于后续大规模归因计算时快速读取。