2. 金融数据基础
任何概率预测与置信区间建模,第一步都不是选模型,而是把“数据对象”定义清楚。金融时间序列里最容易被误用的,就是把价格直接当作可建模的平稳变量。价格序列通常带有趋势和单位根,而收益率更接近平稳序列,因此本章的核心任务是:建立一套从原始行情到可建模特征的标准化数据管线。
一、核心原理:价格、收益率与波动率的关系
设资产在 t 时刻的价格为 Pt,则简单收益率 rt = (Pt − Pt−1) / Pt−1,对数收益率 rt = ln(Pt / Pt−1)。两者在数值较小时近似相等,但对数收益率具有时间可加性:多期对数收益率等于各期之和,这一性质在跨周期聚合、风险归因和置信区间推导中非常关键。
波动率不是收益率的直接观测值,而是收益率二阶矩的刻画。常见定义包括:滚动标准差、EWMA 加权波动率、GARCH 条件波动率,以及已实现波动率(Realized Volatility)。波动率具有聚集性、均值回复和杠杆效应,这三点决定了它不能简单用固定方差假设处理。
二、方法流程:从原始行情到建模特征
- 数据获取与对齐:确定标的、频率、时间范围与复权方式,统一时区与交易日历。
- 清洗:处理停牌、缺失、重复时间戳、异常跳点,区分真实跳空与数据错误。
- 收益率计算:优先使用对数收益率,保留价格序列用于回测与可视化。
- 平稳性检验:ADF、KPSS 检验,必要时做差分或去趋势。
- 波动率估计:滚动窗口、EWMA、GARCH 族模型,输出条件方差序列。
- 相关性与分布诊断:滚动相关、偏度、峰度、QQ 图、尾部极值统计。
- 特征落库:形成“时间戳 + 收益率 + 波动率 + 相关性 + 分布标签”的宽表。
# 示例:对数收益率与滚动波动率
import numpy as np
import pandas as pd
df = pd.read_csv("prices.csv", parse_dates=["date"]).set_index("date")
df["log_ret"] = np.log(df["close"] / df["close"].shift(1))
df["vol_20"] = df["log_ret"].rolling(20).std() * np.sqrt(252)
df = df.dropna()
print(df[["log_ret", "vol_20"]].describe())
三、分布特征与相关性:置信区间的隐含假设
金融收益率普遍呈现尖峰厚尾、负偏、波动聚集等特征。若直接用正态分布构造 95% 置信区间,尾部风险会被低估。实务中常用 t 分布、广义误差分布(GED)、极值理论或历史模拟法来修正。相关性同样不稳定:危机期间相关性上升,分散化效果减弱,因此滚动相关矩阵比静态相关矩阵更可靠。
| 数据对象 | 典型特征 | 建模用途 | 常见陷阱 |
|---|---|---|---|
| 价格序列 | 非平稳、有趋势 | 回测、可视化 | 直接回归导致伪回归 |
| 对数收益率 | 近似平稳、可加 | 预测、置信区间 | 忽略复权与停牌 |
| 波动率 | 聚集、均值回复 | 风险度量、区间宽度 | 用固定方差 |
| 相关性 | 时变、危机上升 | 组合分散、风险归因 | 静态相关矩阵 |
| 分布特征 | 尖峰厚尾、负偏 | 尾部风险、VaR | 默认正态假设 |
四、案例与场景:用波动率修正置信区间
假设某股票日对数收益率均值为 0.0005,样本标准差为 0.02。若按正态近似,95% 置信区间约为 0.0005 ± 1.96 × 0.02,即 [−0.0387, 0.0397]。但若用 GARCH 估计出当日条件波动率为 0.035,则区间应扩展为 [−0.0681, 0.0691]。这说明:置信区间的宽度必须由条件波动率驱动,而不是由全样本方差驱动。
五、常见误区与复盘
- 误区一:用价格算收益率却忘记复权。除权除息会造成虚假跳空,直接污染波动率与相关性。
- 误区二:忽略停牌与缺失值。简单前向填充会人为制造零收益,压低波动率。
- 误区三:默认正态分布。厚尾环境下 VaR 与置信区间会被系统性低估。
- 误区四:静态相关矩阵。危机时相关性跃升,组合风险被低估。
- 误区五:频率混用。日频波动率与分钟频波动率不可直接比较,需统一年化口径。
完成本章后,你应当能够独立构建一条从原始价格到收益率、波动率、相关性与分布标签的标准化数据管线,并清楚每个环节对最终置信区间宽度与覆盖率的影响。这是后续概率预测模型能够稳定工作的数据地基。