halo 的技术博客

返回

你的 LSTM / XGBoost / 神经网络给了你一个精准的数字:「明天这只股票预期收益 +0.8%」。然后呢?

然后你拿这个点的预测去下单,却对它到底有多不准一无所知。金融收益有两个让「误差区间」特别难做的特点:

  1. 异方差:波动率集群——平静时误差小,恐慌时误差能翻好几倍。固定宽度的区间天然不匹配。
  2. 厚尾:动不动来个几十个 sigma 的跳空。任何「假设正态」的区间都会系统性低估极端风险。

共形预测(Conformal Prediction) 就是为这种「我不想假设分布,但我要一个可靠区间」的场景而生的。它不要求残差服从任何分布,只依赖一个温和的「可交换性」假设,就能给出边缘覆盖保证

P(YC^(X))1αP\big(Y \in \hat{C}(X)\big) \ge 1-\alpha

也就是说,长期来看,真实值落在你区间里的概率至少1α1-\alpha。本文用合成收益数据,对比三种区间构造法,所有图表与数字由文末代码真实生成。

一、三种区间,三种哲学#

设模型在点 xx 上的预测为 μ^(x)\hat{\mu}(x),校准集上算出的残差为 Ri=Yiμ^(Xi)R_i = |Y_i-\hat{\mu}(X_i)|

1) 朴素正态区间(baseline,常被滥用)

C^(x)=[μ^(x)±z1α/2σ^train]\hat{C}(x) = \big[\hat{\mu}(x) \pm z_{1-\alpha/2}\cdot\hat{\sigma}_{\text{train}}\big]

直接用训练残差标准差 σ^\hat{\sigma} 配正态分布分位。隐含假设:残差同方差且正态。金融里这两条都不成立。

2) 普通 Split-Conformal(分割共形)

把数据分成训练集和校准集,在校准集上取残差绝对值的经验的 (1α)(1-\alpha) 分位 q^\hat{q}

q^=Quantile ⁣({Ri}, (ncal+1)(1α)ncal),C^(x)=[μ^(x)±q^]\hat{q} = \text{Quantile}\!\left(\{|R_i|\},\ \frac{\lceil(n_{\text{cal}}+1)(1-\alpha)\rceil}{n_{\text{cal}}}\right),\qquad \hat{C}(x)=\big[\hat{\mu}(x)\pm\hat{q}\big]

不假设分布,区间宽度由校准集真实的误差分布决定。

3) 波动率感知 Conformal

把残差先除以一个波动率估计 σ^t\hat{\sigma}_t(比如 EWMA 波动),对「标准化残差」做共形,再乘回当前波动:

C^(x)=[μ^(x)±q^stdσ^t]\hat{C}(x)=\big[\hat{\mu}(x)\pm \hat{q}_{\text{std}}\cdot\hat{\sigma}_t\big]

这样区间宽度会随市场波动伸缩——平静时收紧给出精准区间,动荡时放宽兜住风险。

二、实验设定:平静训练,遇波动骤升#

合成一段 4000 点的收益序列:

rt=μ(Xt)+σtεt,εtt(df=3) (厚尾)r_t = \mu(X_t) + \sigma_t\varepsilon_t,\qquad \varepsilon_t\sim t(\text{df}=3)\ (\text{厚尾})

  • σt\sigma_t 为 GARCH 式波动聚集;
  • 关键设定:前 50%(训练段)波动平静,后 50%(校准+测试段)波动结构性抬升——这正是真实世界里「模型训于平静市、遇波动骤升」的场景;
  • 用 Ridge 回归做点预测(捕捉微小的可预测均值),残差主要由异方差+厚尾主导。

切分:训练 1998 / 校准 999 / 测试 1000。训练残差标准差 σ^train=1.614\hat{\sigma}_{\text{train}}=1.614(平静期尺度)。

三、边缘覆盖率:朴素区间系统性漏覆盖#

在 80% / 90% / 95% 三种名义水平下,看测试集真实覆盖率:

名义水平朴素正态普通共形波动率感知共形
80%0.6930.7630.797
90%0.7740.8880.897
95%0.8280.9460.944

三种方法在 80/90/95% 名义水平下的边缘覆盖率

结论一目了然:

  • 朴素正态区间彻底失守。名义 90% 它只覆盖了 77.4%——因为它用「平静训练期」的 σ^=1.614\hat{\sigma}=1.614 去套「高波动测试期」的误差,区间太窄,跳空一穿就破。名义 80% 更惨,只覆盖 69.3%。
  • 普通共形命中目标。90% 名义 → 实际 88.8%,95% → 94.6%,基本贴着名义线走。它不假设正态,阈值直接从校准集(同样是动荡期)的误差分布里取,所以厚尾和 regime shift 都扛得住。
  • 波动率感知共形同样命中(90% → 89.7%),还多了一项能力(见下节)。

这正是共形预测最被低估的价值:它的覆盖率不依赖你对 residual 分布的任何信念。朴素方法一旦「残差其实不是正态」或「训练和测试分布漂移」,就会 silently 漏覆盖;共形方法用数据自己说话。

四、区间宽度随波动伸缩:波动率感知共形的真价值#

普通共形给出恒定宽度的区间。可市场是异方差的——恒定宽度意味着「平静时区间太宽(浪费精度)、动荡时区间太窄(兜不住)」。波动率感知共形把宽度绑到波动率上:

区间半宽随当前波动上升:波动率感知共形斜率≈1.59,普通共形为常数

散点清楚地显示:波动率感知共形的半宽与当前波动显著正相关(拟合斜率 ≈ 1.59),而普通共形是一条水平线。在 90% 名义下,普通共形平均半宽 3.754,波动率感知共形平均半宽 4.281——后者在动荡样本上自动加宽,在平静样本上自动收窄,宽度本身就携带了风险信息

把测试段前 400 个点的真实收益、点预测、共形区间带画出来:

共形预测区间覆盖真实收益:绝大多数落在带内

真实收益(蓝线)绝大多数时间都待在区间带(橙影)里,少数突破恰恰发生在波动放大的时刻——这正是区间该有的样子。

五、按波动分层的条件覆盖#

更严格地,把测试集按当前波动分成五分位,看每一层内的覆盖率(名义 90%):

条件覆盖:普通共形在高波动层略漏覆盖,波动率感知共形各层更贴近 90%

  • 普通共形在最高波动的 Q5 层覆盖率掉到 0.855——恒定宽度在区间该宽的时候没宽够。
  • 波动率感知共形让宽度跟着波动走,整体更贴合名义水平(其 Q5 偏宽到 0.96,说明对高波动样本宁可略宽也不漏;若配更精准的波动率模型还能进一步收紧)。

一句话:普通共形保住了边际覆盖(平均来看对),波动率感知共形进一步让覆盖在不同波动状态下都更稳——这对实盘更重要,因为你永远不知道下一周是平静还是暴风雨。

六、完整 Python 实现#

下面代码自包含(用 scikit-learnRidge,不依赖专用共形库),复现三种区间与全部指标。

alpha 换成 0.05 / 0.20,你就能量出正文那张覆盖表;把 rvte 画到横轴、半宽画到纵轴,就是宽度-波动图。

七、五个必须知道的坑#

  1. 共形保证依赖「可交换性」。校准集和测试集必须来自同一(联合)分布。如果你的测试是「训练之后」的真实未来、且发生了 regime shift,纯共形也会漏覆盖——本文正是用这个设定暴露了朴素方法的脆弱,而波动率感知共形靠「按波动缩放」部分缓解。真实场景里,记得定期用近期数据刷新校准集(滚动/在线共形)。
  2. 共形给的是「边缘覆盖」,不是「条件覆盖」。平均来看 90% 在区间内,但不保证「每一类样本都 90%」。普通共形在高波动子样本会掉队,这正是波动率感知共形要补的洞。
  3. 波动率代理要「合法」。共形缩放用的 σ^t\hat{\sigma}_t 必须只用 tt 时刻之前的信息(EWMA / 滚动窗口 / 历史 GARCH),不能偷看未来,否则区间有前视偏差。
  4. 分位取法要「对一点点」。阈值用 (n+1)(1α)/n\lceil(n+1)(1-\alpha)\rceil/n 分位(而非简单 np.quantile 的默认插值),才能保证有限样本下 P1αP\ge 1-\alpha 的理论界。
  5. 共形不改变点预测质量。它只给你的预测「套上区间」,底层模型该烂还是烂。先把 μ^(x)\hat{\mu}(x) 训好,共形负责把「不确定性」诚实地表达出来。

八、小结#

机器学习的点预测告诉你「预期是多少」,共形预测告诉你「你有多不确定」——而且这种「不确定」不靠任何分布假设,靠的是校准集上实实在在的误差经验分布。在金融这种异方差+厚尾+regime shift 三重叠加的市场里,朴素正态区间会静悄悄地漏覆盖(本文 90% 名义只覆盖 77.4%);普通 Split-Conformal 用数据说话,命中目标;波动率感知共形再进一步,让区间宽度随波动伸缩,把风险信息直接写进区间本身。

下次你准备把模型输出接进仓位管理之前,先给它套一层共形区间——你会惊讶地发现,原来「模型说 +0.8%」这句话,在不同波动环境下,该配的置信带能差出一倍多。

所有图表均由本文代码在合成数据上真实生成,数字可复现;落地时把第三步的合成数据换成你的真实特征与收益即可。

共形预测 Conformal Prediction:给机器学习收益预测套上误差区间
https://blog.halo26812.eu.org/blog/conformal-prediction-finance
Author halo
Published at 2026年7月12日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨