共形强化学习交易:给 RL 动作一个可验证的覆盖保证
RL 输出一个 Q 值就下单,但点估计不带可靠性凭证——分布一漂移就「自信地犯错」。共形预测包裹任意预测器输出预测区间,有限样本+分布无关保证以 ≥1−α 覆盖真实收益,唯一假设是可交换性。据此设计带可验证下限的交易规则:仅当共形收益下界>0 才出手。纯 numpy 分裂共形+局部自适应,异方差+协变量偏移合成 bandit 上实测:同分布目标覆盖 90% 实测 91.1%(保证兑现);门控把开仓即盈利命中率从 76.9% 抬到 97.4%,代价出手率降到 17.1%。诚实翻车:可交换性破坏→偏移 3.0 时覆盖从 90% 崩到 53.8%;边际覆盖达标≠处处达标——普通等宽区间高波动区只覆盖 49%、低波动区 98%,需局部自适应共形拉回 87%~92%。拆穿保证=永真/边际=条件/区间=预测准/无分布=无假设/覆盖达标即可交易五类陷阱(中阶)。
先说结论:RL 智能体给每个动作打一个 Q 值就下单,但这个点估计不带任何可靠性凭证——分布一漂移,它可以「自信地犯错」。共形预测(Conformal Prediction)能包裹任意预测器,吐出一个「预测区间」,在有限样本、分布无关的前提下,保证以至少 1−α 的概率覆盖真实收益。据此可设计一条带可验证下限的交易规则:只在贪婪动作的共形收益下界 > 0 时才出手。 在异方差 + 协变量偏移的合成环境上实测:同分布下目标覆盖 90%、实测 91.1%,保证兑现;出手门控把”开仓即盈利”的命中率从 76.9% 抬到 97.4%。但也要诚实:唯一的假设”可交换性”一旦破坏,保证立刻失效——协变量偏移拉到 3.0,覆盖率从 90% 崩到 53.8%。

一、Q 值的沉默:点估计不告诉你「有多可信」#
一个训练好的 RL / bandit 智能体,面对状态 ,给每个动作算一个 Q 值,选最大的那个下单。问题是:
- Q 值 = 2.3,这到底是”稳赚 2.3”还是”平均 2.3 但可能 −5 到 +9”?
- 模型在训练分布里见过这个状态吗?还是在瞎外推?
- 我凭什么相信这一单?
点估计沉默。它给你一个数,不给你任何”这个数有多可信”的凭证。而金融最要命的恰恰是尾部——一个高置信但错误的动作,可能就是爆仓那一单。
传统做法(贝叶斯后验、MC Dropout、深度集成)能给不确定性,但它们的置信区间没有覆盖保证:模型说的”95% 区间”实际可能只覆盖 70%,尤其在模型误设或分布偏移时。我们想要的是一个可验证的、不依赖模型正确性的保证。
这就是共形预测的舞台。
二、共形预测:给任意预测器套一层「覆盖保证」#
共形预测(Vovk et al.)的承诺极强:给定任意黑盒预测器 和一个显著性水平 ,我构造一个预测区间 ,使得
这个保证是有限样本的(不是渐近)、分布无关的(不假设数据服从任何具体分布)、模型无关的( 可以是任意烂模型)。 唯一的假设是:校准数据和测试数据可交换(exchangeable)——直觉上就是”同分布、可随意打乱顺序”。
最实用的变体是分裂共形(split conformal),三步:
- 训练:在训练集上拟合任意 (这里是每个动作一个 ridge 回归的 Q 估计)。
- 校准:在一个独立的校准集上,对每个样本算不符合度分数(nonconformity score),最简单就是残差绝对值 。取这些分数的 经验分位数(带有限样本修正)。
- 预测:新样本的区间就是 。
为什么这就够了?因为在可交换性下,测试样本的分数 与校准分数们同分布, 落在校准分数的 分位数以内的概率恰好 。就这么朴素,却给出严格保证。
三、纯 numpy 实现:分裂共形 + 局部自适应#
import numpy as np
# Q 估计:每个动作一个 ridge 回归
Qw = np.zeros((NA, d))
for a in range(NA):
Qw[a] = np.linalg.solve(Xtr.T@Xtr + lam*np.eye(d), Xtr.T@Rtr[:, a])
def Qhat(X): return X @ Qw.T
# ---- 校准:对"贪婪动作的实现收益"算残差分数 ----
g_cal = Qhat(Xcal).argmax(axis=1)
resid = np.abs(Rcal[np.arange(len(Xcal)), g_cal]
- Qhat(Xcal)[np.arange(len(Xcal)), g_cal])
def conformal_width(alpha, resid):
n = len(resid)
k = int(np.ceil((n + 1) * (1 - alpha))) # 有限样本修正
return np.sort(resid)[min(k, n) - 1]
alpha = 0.10
w = conformal_width(alpha, resid) # 对称半宽
def interval(X): # 预测区间
g = Qhat(X).argmax(axis=1)
c = Qhat(X)[np.arange(len(X)), g]
return g, c - w, c + wpython关键的一行是 ——这个 的有限样本修正是共形保证的核心,少了它保证就只在 成立。
四、实测:保证兑现,门控提纯信号#
同分布覆盖:目标 90%,实测 91.1%,区间平均宽度 4.06。保证兑现,且不保守过头。扫一遍 ,实测覆盖率紧贴对角线(见上方封面图)——这就是共形的价值:你要 90% 就给你 90%,要 95% 就给你 95%,说到做到。
带可验证下限的交易规则:只在贪婪动作的共形收益下界 时才开仓——即”下行风险被证明性地压在零以上”才出手。结果:
| 指标 | 始终贪婪(每步都交易) | 共形门控(仅下界>0 时出手) |
|---|---|---|
| 开仓即盈利命中率 | 76.9% | 97.4% |
| 出手率 | 100% | 17.1% |
| 每步平均收益 | 1.10 | 0.53 |
门控把命中率从 77% 拉到 97.4%——只在”证明有把握”时出手,信号被大幅提纯。代价是只出手 17% 的时间、每步平均收益减半。这是纪律换胜率的经典权衡:适合”宁可少做、不做错”的低频高确信场景。
五、诚实翻车之一:可交换性破坏,保证立刻失效#
共形保证有且仅有一个前提——可交换性。这个前提在金融里最脆弱,因为市场天天在漂移。我把测试集的协变量(特征 x0)逐步平移,模拟真实的分布偏移:

- 偏移 = 0(同分布):覆盖 90.4%,保证成立。
- 偏移 = 1.5:覆盖跌到 76.4%。
- 偏移 = 3.0:覆盖崩到 53.8%——名义 90% 的区间,实际只覆盖一半多。
保证不是永真符咒。 校准集在”旧世界”算出的分位数 ,一旦市场进入”新世界”(协变量分布变了、异方差结构变了),就不再是有效的分位数。这不是共形的 bug,是它诚实标注的适用边界:它保证的是”可交换假设成立时的覆盖”,不是”无论如何的覆盖”。 实盘部署必须配合分布漂移检测(如在线更新校准集、加权共形 Weighted Conformal)。
图里的蓝线(局部自适应共形)在这个协变量偏移下守住了——但注意,那是因为这里的偏移可以被 x0 的已知尺度函数吸收;换一种”分数分布本身变形”的偏移,它同样会崩。没有任何共形变体能在任意分布偏移下白嫖覆盖。
六、诚实翻车之二:边际覆盖达标 ≠ 处处达标#
这是共形最容易被误读的地方。它保证的是边际覆盖(marginal coverage):在整个测试分布上平均 90%。但平均达标不等于每个子群都达标。
我的环境是异方差的——波动随 |x0| 增大。普通共形用一个等宽区间 打天下,于是:

- 低波动区(x0≈0):真实波动小,等宽区间太宽 → 过覆盖 98%(浪费,区间没用还宽)。
- 高波动区(|x0|≈3):真实波动大,等宽区间太窄 → 欠覆盖只有 49%(危险,你以为 90% 安全其实一半时间被击穿)。
边际上它确实是 91%——高低相抵的平均数。但如果你专门在高波动状态下交易,你实际拿到的是 49% 的覆盖,而不是 90%。这对风控是灾难。
修法是局部自适应共形(normalized conformal):用一个不确定性估计 归一化残差分数,区间变成 ——随局部波动伸缩。实测把各特征区间的覆盖从 49%~98% 的剧烈波动,拉回到均匀的 87%~92%。区间在该宽的地方宽、该窄的地方窄,条件覆盖才真正达标。
A. 实现细节#
- 预测器:每个动作一个 ridge 回归(λ=1)估计 Q,共形层完全模型无关,换成任何模型不改保证。
- 不符合度分数:贪婪动作的实现收益残差绝对值 ;局部版用 ,。
- 有限样本修正:分位数取第 小的分数,这是覆盖保证成立的关键。
- 数据划分:训练 4000 / 校准 2000 / 测试 6000~12000,三者独立采样,校准与测试同分布(可交换)以验证保证。
- 交易规则:仅当共形区间下界 时按贪婪动作开仓,否则空仓(收益 0)。
B. 已知偏差#
- 合成 bandit,非真实市场:单步 contextual bandit,无跨期状态转移、无交易成本、无冲击。真实 RL 交易是多步 MDP,共形在序贯决策上的覆盖保证要复杂得多(时序依赖破坏可交换性)。
- 可交换性是硬前提:这是最大的现实鸿沟。金融数据天然非平稳,严格可交换几乎不存在。第五节展示的覆盖崩塌不是特例而是常态,实盘必须叠加漂移检测 / 加权共形 / 在线再校准。
- 边际保证的误导性:第六节说明,若在特定 regime(高波动)集中交易,边际 90% 会退化成局部 49%。必须用局部自适应或按 regime 分组校准。
- 区间宽 ≠ 预测准:共形只保证”覆盖”,不保证”区间窄”。一个总是输出 的预测器覆盖率 100% 却毫无用处。区间宽度反映的是底层模型质量,共形层救不了烂模型。
C. 结果解读#
- 共形的真正卖点是”可验证”:不是让预测更准,而是给不确定性一个分布无关的凭证。同分布下实测覆盖 91.1% 紧贴目标 90%,这种”说 90 就是 90”的可靠性,是贝叶斯 / Dropout 给不了的。
- 门控是纪律工具:命中率 77%→97.4% 的提升全部来自”只在有把握时出手”。这不是更聪明的预测,而是更诚实的弃权(abstention)。适合低频、高确信、错一单代价极大的策略;不适合需要高换手、靠数量取胜的策略(出手率 17% 太低)。
- 保证的边界比保证本身更重要:第五、六节两处翻车才是这篇的核心。共形不是”永真保证”,它是”可交换假设下的保证”。把它当护身符盲目信任,反而比不用更危险——因为你会对一个已失效的区间产生虚假安全感。
- 局部自适应是异方差市场的刚需:金融波动天然随 regime 变化,等宽区间必然在高波动区欠覆盖。凡是要在不同波动状态下交易的策略,普通共形的边际保证都不够,必须上 normalized / Mondrian 共形做条件校准。
- 适用边界:数据近似平稳、可周期性再校准、追求可验证风控 → 共形大幅受益;强非平稳、regime 突变、无法及时再校准 → 覆盖保证会系统性失效,需配合漂移检测,或干脆不依赖其数值保证。
拆穿五类陷阱(中阶):① 保证=永真(错,可交换性破坏后覆盖从 90% 崩到 54%);② 边际=条件(错,边际 91% 在高波动区实为 49%);③ 区间=预测准(错,共形只保覆盖不保区间窄,救不了烂模型);④ 无分布=无假设(错,可交换性是硬假设,金融最难满足);⑤ 覆盖达标即可交易(错,出手率 17% 说明可验证≠可盈利,纪律换的是胜率不是总量)。