4、数据准备与清洗:收益率计算、数据频率选择、缺失值处理、异常值识别与调整

历史模拟法的核心逻辑是“用过去的真实分布推断未来的风险”,因此数据的质量直接决定了VaR(风险价值)估计的可靠性。如果输入数据存在偏差、缺失或异常,无论后续的模型参数如何精妙,输出的风险计量结果都可能严重失真。本章将系统拆解数据准备与清洗的四大关键环节:收益率计算、数据频率选择、缺失值处理以及异常值识别与调整,帮助学员建立一套严谨、可复用的数据工程流程。

数据准备与清洗四阶段工程链路 ① 原始行情数据 价格/指数/利率序列 ② 收益率计算 简单/对数收益率 复利/多期收益 ③ 频率选择与缺失值 日/周/月频选择 插值/删除/填充 ④ 异常值识别 统计/业务规则 Winsorize/剔除 关键决策点:数据频率选择(日频 vs 周频 vs 月频) 影响样本量、波动率估计精度、VaR置信区间宽度 数据质量校验清单 ✓ 时间戳连续性(交易日历对齐) ✓ 价格非负性(股票/指数) ✓ 收益率极值(|R| > 50% 需复核) ✓ 停牌/退市/除权除息标记 输出:干净收益率序列 → 用于历史模拟法排序 → 用于参数估计(EWMA等) → 用于压力测试情景生成 → 用于回测与模型验证

上图展示了数据准备与清洗的完整工程链路。从原始行情数据出发,经过收益率计算、频率选择与缺失值处理、异常值识别与调整,最终形成可用于风险计量的干净收益率序列。每一个环节都有其特定的方法论和注意事项,下面将逐一深入展开。

4.1 收益率计算:简单收益率与对数收益率的选择

核心原理:收益率是风险计量的基础输入。在金融计量中,常用的收益率有两种:简单收益率(算术收益率)和对数收益率(连续复利收益率)。简单收益率定义为 R_t = (P_t - P_{t-1}) / P_{t-1},直观反映了资产价格的变化百分比;对数收益率定义为 r_t = ln(P_t / P_{t-1}),其数学性质更优,尤其在多期收益率的加总上具有可加性。

判断方法:对于历史模拟法,选择哪种收益率取决于资产特性和分析目标。对数收益率在统计上更接近正态分布,且时间可加性使得多期VaR计算更为便捷。然而,对于包含分红、拆股等公司行为的个股,简单收益率在调整后更易解释。实务中,若组合包含大量衍生品或需要高频计算,对数收益率是首选;若仅需日频VaR且资产价格无极端跳跃,两者差异不大。

维度简单收益率对数收益率
公式(P_t - P_{t-1}) / P_{t-1}ln(P_t / P_{t-1})
多期加总需连乘后减1直接相加
分布特征右偏,有下限 -100%近似对称,无下限
适用场景单期收益、业绩归因多期VaR、时间序列建模
极端值影响对极端下跌更敏感平滑极端波动
实务建议:在历史模拟法中,建议优先使用对数收益率。原因在于:其一,对数收益率的可加性使得计算N日VaR时无需重新排序;其二,对数收益率在统计建模中更稳定,减少了因极端值导致的VaR估计偏差。若资产价格出现0或负值(如某些商品或汇率),则只能使用简单收益率。

4.2 数据频率选择:日频、周频与月频的权衡

核心原理:数据频率决定了历史模拟法使用的样本窗口长度和VaR估计的时效性。高频数据(如日频)能捕捉更多市场波动细节,但可能引入微观结构噪声(如买卖价差、收盘价异常);低频数据(如月频)虽然噪声少,但样本量不足,导致VaR估计的置信区间过宽。

操作流程:选择频率时需考虑三个因素:持有期(监管要求通常为1天或10天)、样本量(至少需要250-500个观测值)、数据可得性。若持有期为1天,应使用日频数据;若持有期为10天,可使用日频数据滚动计算,或直接使用10日收益率(但样本量会急剧减少)。

  • 日频数据:样本量大(一年约250个交易日),能反映短期波动聚集,但需处理隔夜跳空和节假日效应。
  • 周频数据:通常取每周最后一个交易日的收盘价,样本量适中(一年约52个),能平滑部分噪声,但可能遗漏周内极端波动。
  • 月频数据:样本量小(一年12个),仅适用于长期资本配置或低流动性资产,VaR估计的置信区间极宽。
经验法则:对于流动性好的股票、外汇和主要商品,使用日频数据并回溯至少2-3年(约500-750个观测值)。对于流动性差的私募股权或房地产,可退而求其次使用月频数据,但需在报告中明确披露样本量限制。

4.3 缺失值处理:插值、删除与填充策略

核心原理:缺失值在金融数据中不可避免,原因包括停牌、休市、数据供应商错误、交易所延迟等。若直接忽略缺失值,可能导致收益率序列的时间戳错位,进而扭曲相关性结构和VaR排序。

判断方法:处理缺失值前,需先判断缺失机制:是随机缺失(MAR)还是完全随机缺失(MCAR),亦或是非随机缺失(MNAR)。对于停牌导致的缺失,通常属于非随机缺失,因为停牌往往与重大消息相关。

  1. 删除法:若缺失比例低于5%且为随机缺失,可直接删除该时点数据,但需确保前后收益率计算正确(使用前一个有效价格)。
  2. 插值法:线性插值适用于价格序列,但会低估波动率;更推荐使用前向填充(Forward Fill)或后向填充(Backward Fill),即用最近的有效价格填充缺失值,收益率计算时自动跳过。
  3. 模型填充:对于重要资产,可使用市场模型(如CAPM)或时间序列模型(ARIMA)预测缺失值,但需谨慎引入模型风险。
# Python示例:使用前向填充处理停牌缺失
import pandas as pd
# 假设df包含日期和收盘价,停牌日价格为NaN
df['price_ffill'] = df['price'].fillna(method='ffill')
# 计算收益率时,使用填充后的价格,但需标记填充点
df['is_filled'] = df['price'].isna()
# 收益率计算:仅使用非填充点之间的真实价格变化
df['return'] = df['price'].pct_change()
# 若填充点过多,建议剔除该时点的收益率
风险提示:切勿使用全局均值或中位数填充价格缺失值,这会严重扭曲收益率的波动率,导致VaR被系统性低估。对于连续停牌超过10个交易日的股票,建议直接剔除该股票或使用指数收益率替代。

4.4 异常值识别与调整:统计方法与业务规则结合

核心原理:异常值(Outliers)是指显著偏离正常分布的观测值,可能源于数据录入错误、市场操纵、流动性枯竭或真实的极端事件(如2020年3月美股熔断)。在历史模拟法中,异常值会直接影响VaR的分位数估计,尤其是尾部风险。

操作流程:异常值识别需结合统计检验和业务逻辑,不能单纯依赖数学规则。

  • 统计方法:使用Z-score(|Z| > 3)、修正的Z-score(MAD法)或IQR(四分位距)规则。对于收益率序列,IQR规则通常设定为 Q1 - 3*IQR 和 Q3 + 3*IQR 为异常边界。
  • 业务规则:单日收益率超过±20%(股票)或±10%(外汇)需人工复核;检查是否对应除权除息、拆股或重大公告。
  • 调整方法:若确认是数据错误,直接修正或删除;若为真实极端事件,可选择保留(因为历史模拟法本应包含尾部风险)或进行Winsorize处理(将极端值缩尾至指定分位数,如1%和99%)。
异常值类型识别方法处理策略对VaR的影响
数据录入错误价格跳变超过50%且无公告修正或删除高估VaR
真实极端事件市场指数同步暴跌保留(或Winsorize)合理反映尾部风险
流动性枯竭成交量极低但价格微变剔除或使用中间价低估VaR
除权除息未调整价格跳空但指数未变使用复权价格扭曲收益率
案例拆解:某投资组合包含一只港股(代码:0700),在2022年3月15日出现单日收益率-28%。初步检查发现,该日公司发布了盈利预警,属于真实极端事件。但进一步核查发现,数据供应商未对当日除权(每股派息0.5港元)进行调整。经复权处理后,实际收益率为-15%。若直接使用原始数据,VaR将被高估约40%。因此,异常值处理必须结合公司行为(Corporate Action)数据。

4.5 数据清洗的完整流程与质量校验

核心原理:数据清洗不是孤立的步骤,而是一个迭代的工程过程。建议建立标准化的清洗流水线,并输出数据质量报告,供风险管理人员审阅。

操作流程:

  1. 数据获取与对齐:将不同来源的数据按统一交易日历对齐,确保时间戳一致。
  2. 收益率计算:选择对数收益率,并处理公司行为(使用复权因子)。
  3. 缺失值处理:标记缺失原因,采用前向填充或剔除。
  4. 异常值识别:运行统计规则和业务规则,生成异常值清单。
  5. 人工复核:风险分析师逐条确认异常值,决定保留、修正或剔除。
  6. 数据质量报告:输出缺失率、异常值比例、处理方式等指标,存档备查。
总结复盘:数据清洗的最终目标是确保收益率序列能够真实反映资产的风险特征。常见误区包括:过度清洗导致尾部风险被抹平(VaR被低估)、忽略公司行为导致收益率失真、以及使用不匹配的频率导致样本量不足。建议团队建立数据质量看板,定期监控清洗前后的统计特征变化。