4. 数据准备与预处理:获取组合持仓数据、市场因子数据,并进行清洗与对齐

数据是风险归因与稳定性巡检的基石。在进入模型计算之前,必须完成持仓数据与市场因子数据的获取、清洗与时间对齐。本章节将系统梳理数据准备的标准流程与关键校验规则。

4.1 数据源概览与字段清单

组合风险归因需要两类核心数据:组合持仓数据(描述“投了什么”)与市场因子数据(描述“市场环境如何”)。两者的时间频率与字段结构必须严格匹配。

数据类别 典型来源 核心字段 频率要求
组合持仓数据 交易系统、托管行、组合管理系统 证券代码、持仓市值、持仓数量、成本价、行业分类、币种 日频 / 周频(取决于归因周期)
市场因子数据 Wind、Bloomberg、Barra、自建因子库 因子收益率、因子暴露度、无风险利率、基准指数收益率 日频(与持仓频率对齐)
辅助数据 公司行动公告、汇率中间价 分红、拆股、配股、汇率 事件驱动 + 日频
关键提示: 持仓数据中的“证券代码”必须使用统一标识(如 ISIN、SEDOL 或内部统一编码),避免因代码不一致导致因子暴露匹配失败。

4.2 数据清洗核心步骤

原始数据通常包含缺失值、异常值、重复记录与逻辑错误。以下为清洗的标准流程:

  1. 缺失值处理:检查持仓市值、因子收益率是否为空。对于缺失的因子收益率,使用前值填充或行业均值替代;对于缺失的持仓市值,标记为可疑数据并剔除。
  2. 异常值检测:使用 Z-score 或 IQR 方法识别极端值。例如,单只股票日收益率超过 ±20% 需人工复核。
  3. 重复记录去重:按“日期 + 证券代码”去重,保留最新或平均记录。
  4. 逻辑校验:持仓市值不应为负;因子暴露度应在合理范围(如 Barra 风格因子暴露通常在 ±3 之间)。
  5. 公司行动调整:分红、拆股后需复权处理,确保收益率序列连续。
实战案例: 某组合在 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 数据准备流程总览

下图展示了从原始数据到归因输入表的完整流程:

数据准备与预处理流程 原始持仓数据 原始因子数据 辅助数据 数据清洗:缺失值填充 / 异常值剔除 / 去重 / 复权 时间对齐:日频 JOIN / 周频聚合 / 节假日处理 质量校验:市值偏差 / 因子缺失 / 代码匹配 / 日期连续

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 列式格式,按日期分区,便于后续大规模归因计算时快速读取。