ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

随机过程先验+Transformer:期权波动率曲面预测的实战指南

随机过程先验+Transformer:期权波动率曲面预测的实战指南 简介本资源是一份聚焦随机过程Transformer模型在期权波动率曲面预测中应用的专题文档共27页适合金融工程、量化研究及对机器学习在衍生品定价领域感兴趣的读者。文档依据完整目录展开从期权与波动率曲面基础、随机过程与Transformer结合原理到数据处理、特征工程、模型训练优化及实验结果分析均有系统论述并配有金融机构风险管理、投资组合配置、期权定价与交易策略制定等方面的实际案例内容结构清晰、便于按章节查阅。资源包包含1个PDF文件整体大小约2.05MB以文字、图表和目录索引为主要内容形式适合用于学术研究参考、课程学习或作为搭建相关预测模型的入门指引。目前已有71人学习具有一定参考热度。文档内容完整、条理清晰可帮助读者快速建立起对随机过程Transformer模型用于期权波动率曲面预测的整体认知框架并了解其在实际金融场景中的应用方式与改进方向。1. 随机过程 Transformer这份期权波动率曲面预测方案值得人工复现一遍期权台工作过的朋友应该都有这种体验每天收盘后拿交易所或经纪商的隐含波动率曲面做一遍参数化校准SVI、Heston、SABR 轮着换一组参数好不容易稳定下来第二天开盘一小时就变脸。这份 PDF 的思路很直接——把整张波动率曲面当成带随机过程先验的时空序列用 Transformer 一次预测下一个交易日的整张曲面而不是逐点重新校准。核心思想是“用先验约束 Transformer用 Transformer 去补先验的残差”。适合做权益期权、外汇期权量化定价的人也适合刚进场想搞懂曲面预测怎么落地的同学。我完整拆了一遍下面把原理、参数、踩坑一次讲清楚。2. 随机过程先验怎么进 Transformer从曲面坐标到核位置编码的四种落点2.1 曲面数据的天生问题为什么普通 Transformer 会伸不开腿隐含波动率曲面是一个 (K, τ) 的二维网格K 方向的横截面是“微笑”反映同一到期时间下虚值、平值、实值期权对波动率溢价的不同要求τ 方向的纵向剖面是“期限结构”反映波动率水平随剩余时间延长的变化。这两个方向的统计性质完全不一样。K 方向有很强的凸性约束同一个到期时间下虚值和实值的 IV 会比较高平值附近相对低形状像一个向上开口的碗τ 方向则表现为强时序相关和均值回复今天方差水平高了过几天会向长期均值收敛这就是常说的 volatility mean reversion。普通 Transformer 的 sinusoid 位置编码对这两个轴一视同仁patchify 之后也不区分方向模型很容易学到“色块统计”而不是期权市场结构。具体表现就是整体预测误差看着还行但一到近月快到期、τ 很小的地方就开始乱跳或者把整个曲面预测成一个平滑的平板把微笑全部抹掉。这个问题不是模型容量不够而是先验不对。曲面不是一个自由的图像它受无套利约束和随机波动率动力学约束模型需要被告知这种结构。PDF 的核心方案就是在 Transformer 里注入随机过程先验。最常见的工程落点是 OU 核。设 y log τOU 过程对应的相关函数可以写成K(y_i, y_j) exp(−κ |y_i − y_j|)这个核的物理含义很直观κ 控制均值回复速度κ 越大曲面在期限方向上的记忆越短τ 很小的地方相关衰减很快长期限区域则趋向同一个水平。把这个 K 直接当成 attention bias 加到 QK^T 上比让模型从零学位置编码要稳得多尤其在训练数据只有几年长度的情况下。κ 初始值一般取 0.5 左右可以冻结也可以作为可学习参数参与训练。2.2 三个先验落点位置编码、attention bias 与输出正则同样是随机过程先验放进 Transformer 的位置不一样效果和风险也不同。我拆 PDF 时把它整理成三种落点落点做法优点风险适用场景位置编码用 OU/Vasicek 核矩阵替代或叠加 sinusoid改动小核在任意期限长度上可泛化核参数只能手调模型学不到数据量小、快速验证attention bias核矩阵直接加到 QK^T logits模型先按核走再学偏差兼顾先验和灵活性序列长度变化时要重算核中等数据量、想保留注意力灵活性输出正则对输出加无套利软约束如 calendar spread 单调、butterfly 二阶差非负约束结果直接可用报价不会被套利约束过强会把微笑压平损失精度要上线报价的场合几乎是必选项实际做的时候PDF 的方案通常不是单选而是“位置编码 输出正则”的组合。位置编码保证预测稳定输出正则保证预测结果能直接拿去报价。attention bias 是精度要求最高的做法最接近原论文的“先验 残差”结构但实现和调试成本也最高。我给团队落地的一般顺序是先用 OU 核位置编码跑通再根据套利违规次数决定要不要加输出正则最后才上 attention bias。这里有一个容易搞混的细节先验不一定要绑死在标的资产的随机过程上。常见做法是把 OU 核放在方差水平轴上表示方差围绕长期均值回复而不是把 OU 核放在标的资产价格轴上。标的资产价格通常用 GBM 或局部波动率建模曲面本身则用均值回复过程建模两个层级不能混在一起。如果项目里有人把 GBM 的漂移项直接写进位置编码多半会导致预测曲面整体漂移训练很难收敛。2.3 输入输出怎么定delta 桶、残差标签与 mask数据层面曲面网格一般取 15×10 到 25×15 之间本文按 K 16、τ 12 讲。K 方向建议用 delta 桶而不是绝对执行价。用绝对执行价的问题是不同标的价格区间差很远同一张曲面上左侧是几百块的执行价、右侧是几千块模型很难抽象出统一的微笑形状。delta 桶把虚值程度标准化到 10D、25D、50D 这些档位不同交易日、不同标的之间可以直接对比这也是经纪商报价的标准格式。τ 方向建议用剩余期限的对数做分桶。近月合约到期快曲面变化剧烈需要更密的网格远月合约变化平滑桶可以稀一点。如果对 τ 做线性分桶近月只分到一两个格子远月却挤成一堆模型在近月的分辨率完全不够。τ 的下限我会裁到 0.02 年大约 7 个自然日再短的近月报价噪声太大模型很容易去拟合这些噪声。输入用过去 5 到 10 个交易日的曲面标签是下一交易日的曲面。直接预测 IV 水平容易让模型偷懒——直接把昨天的曲面搬过来当结果因为 level 本身就很平稳。我一般会先改成预测残差label log(IV_{t1}) − log(IV_t)残差比水平更平稳模型不用去背“曲面整体在哪个水平”这种静态信息可以专心学变化。还有一个容易忽略的点是 mask外盘曲面在深度虚值和近月快到期时流动性差、报价缺失这些格子不应该用 0 填充而是进一个 mask 让模型知道这里没有值。填 0 会让模型学到“低波动率”fillna 前向填充会引入未来信息两个都是坑。3. 复现路径数据管线、超参表和评估三件套3.1 从行情数据到曲面张量一段能直接改的预处理先把行情数据转成规整的曲面网格。下面这段代码是按项目常见做法写的用 pandas 就能跑输入是带 trade_date、expiry、strike、fwd、iv、volume 的明细数据输出是 (交易日 × K×T) 的曲面矩阵。import numpy as np import pandas as pd def build_surface(df, k_bins16, tau_bins12, ttm_clip(0.02, 3.0)): df df.copy() df[ttm] ( pd.to_datetime(df[expiry]) - pd.to_datetime(df[trade_date]) ).dt.days / 365.0 df[ttm] df[ttm].clip(*ttm_clip) df[log_moneyness] np.log(df[strike] / df[fwd]) df[k_bin] pd.cut(df[log_moneyness], binsk_bins, labelsFalse) df[tau_bin] pd.cut(np.log(df[ttm]), binstau_bins, labelsFalse) # volume 稀疏时加一个平滑项避免权重为 0 导致个别点消失 df[w] df[volume].fillna(0) 0.1 group_cols [trade_date, k_bin, tau_bin] weight_sum df.groupby(group_cols)[w].transform(sum) df[iv_w] df[iv] * df[w] / weight_sum surf df.groupby(group_cols)[iv_w].sum().unstack([k_bin, tau_bin]) return surf逻辑说明先算剩余期限 ttm裁到 0.02 到 3.0 年。τ 小于 0.02 的合约数值经常不稳定截断比强行保留更安全。k_bin、tau_bin 用 pd.cut 分别对 log-moneyness 和 log-ttm 分桶得到规则的 K×τ 网格。最后按 trade_date、k_bin、tau_bin 三列分组用成交量加权汇总 IV——具体做法是每行的 iv 乘以自己的权重再除以组内权重总和组内求和后等价于加权平均。参数说明k_bins16、tau_bins12 是权益期权比较稳的起点外汇期权可以适当加大 tau_bins。ttm_clip 的下限 0.02 年大约 7 个自然日再往前的近月数据噪声太大。0.1 的平滑项是给成交量极低的报价一个基础权重防止某些网格点算出来是 NaN。用 log-ttm 而不是 ttm 分桶是为了让近月的网格密度更细这一点直接决定了 Transformer 预测近月曲面的“锐度”。预处理完成后把 DataFrame 转成训练张量先按日期排序用过去 seq_len 个交易日预测下一交易日。实际落地时我会把时间维直接塞进特征通道也就是每个网格点一个 tokentoken 的 feature 维度是 seq_len 个历史值。曲面本身只有 16×12 个点变成 192 个 token显存压力很小如果反过来把历史日期也变成序列长度序列会到 1900 以上注意力计算成本直线上升收益却几乎为零。这个设计在 PDF 里应该有体现我自己第一次实现时没注意结果同样的数据训练时间翻了四倍。3.2 模型骨架与超参表照着这份配置跑基本不会翻车模型主体是标准的 encoder-only Transformer输入层是 patch embedding中间是自注意力层加前馈网络输出层是 MLP 直接输出每个网格点的残差值。下面是我按 PDF 的思路整理出来的训练配置config dict( k_bins16, tau_bins12, ttm_clip(0.02, 3.0), seq_len10, # 用过去 10 个交易日预测下一交易日 d_model128, n_heads8, n_layers4, ff_dim512, patch(1, 1), dropout0.1, lr1e-4, warmup_steps1500, batch_size32, epochs30, lossiv_mse_vega_weighted, priorou_kernel, prior_kappa0.5, reg_arbitrage0.01, )逐个说参数d_model128 对 192 个 token 的曲面来说足够了升到 256 会明显变慢但精度提升有限。n_layers4 是曲面的常规选择6 层以上在小数据上多数会过拟合。patch(1, 1) 意味着不 patch每个网格点直接是一个 token。曲面只有 192 个 tokenpatch 反而丢信息只有行情噪声特别大时才考虑 2×2 patch。prior_kappa0.5 是 OU 核的均值回复速度可以先冻结不训练如果发现预测曲面远期部分不够平滑就把 κ 降一点让核在期限方向拉得更长。loss 写成 iv_mse_vega_weighted意思是每个网格点按 vega 加权。这里有个容易搞错的点同一张曲面不同 delta 桶的流动性天差地别如果不加权模型会花大量精力去拟合深度虚值那些流动性极差、报价噪声很大的点。实践中我一般按 volume 加一个固定量做权重或者按 delta 桶离 ATM 的距离递减给权效果比纯 vega 更稳。纯 vega 在近月 ATM 附近极高会把整个训练拉偏。训练轮数和学习率也是曲面模型特有的敏感点。warmup_steps1500 对几千条训练样本来说是合理的因为曲面预测的 loss landscape 比较陡一上来就用大学习率很容易在初期把位置编码学坏。epochs30 配合早停验证集用滚动时间窗口。训练时用时间切分不要随机打乱切验证集——曲面是强时序数据随机分折等于把测试日的前一天曲面泄漏进训练集验证 RMSE 会虚低 20% 到 30%。我一般按日期滚动比如 2015–2021 训练、2021–2023 验证再往前滚动验证两次最后取平均。3.3 评估三件套RMSE 不是重点套利和对冲才是训练完不能只看 RMSE这是曲面模型区别于普通回归模型的地方。我习惯用三件套评估项指标作用曲面误差IV RMSE按 delta 桶拆分10D/25D/50D/ATM看预测精度在哪一段失效套利检查calendar spread、butterfly 违规次数看预测曲面能不能直接报价对冲损益按预测曲面做 delta 对冲后的 PnL 分布看模型对交易结果有没有正贡献第一项必须有但只有它不够。整体 RMSE 容易被 ATM 主导导致你根本看不出深度虚值区域已经偏到天上去了。第二项是报价核心一张预测曲面如果存在日历价差套利或蝶式套利拿到盘面上就是被人无风险薅羊毛再低的 RMSE 也没用。第三项最有说服力拿预测曲面对期权重新定价然后用 BS delta 做滚动对冲统计几天后的 PnL 分布模型的价值最终体现在这里而不是一张 RMSE 表。我还建议加一个 baseline直接用最近一天曲面做 persistence 预测。很多 Transformer 曲面模型真正的问题不是精度不够而是学成了延迟器永远预测出昨天的曲面。Persistence 对比能一票筛掉这种假模型。如果预测模型在 RMSE 上连 persistence 都打不过后面的套利检查和对冲回测都不用做了直接回炉调参。4. 避坑清单五个高频翻车点和对应解法4.1 训练阶段的三个高频坑坑一验证集用随机切分RMSE 虚低。现象是训练时 loss 一路下降验证集误差也漂亮一上实盘就露馅。原因是曲面是强时序数据训练和测试日期混杂模型已经见过“未来”的前一天曲面test 日期的预测几乎等于在背答案。解决方法是严格按日期滚动切分比如 2015–2021 训练、2021–2023 验证验证集不能和训练集有重叠交易日。我还见过更隐蔽的版本按行切分不按日期切分同一个交易日的不同 grid 点被分进训练和验证这同样算泄漏因为同一日期的曲面是由同一个市场状态生成的。坑二预测曲面过度平滑微笑被压没了。现象是 loss 不高但画出来的曲面像一块平板25 delta 和 50 delta 的 IV 只差零点几个百分点完全不像真实市场。原因是 patch 太大、OU 核 κ 设置过高先验权重把 K 方向上的凸性抹平了。解决方法是把 patch 调回 (1, 1)降低 κ 到 0.3 左右并检查 loss 里 vega 加权是否在 K 方向过度平滑。另一个隐藏原因是 tau_bins 太少近月微笑被并到同一个格子里模型根本没机会表达凸性。排查时可以先画一张预测曲面和真实曲面在 50 delta、25 delta 上的差值热力图通常一眼就能定位是哪个网格区域被抹平。坑三模型学成了延迟器只会抄昨天的曲面。现象是验证 RMSE 和 persistence baseline 差不多甚至更差。原因是标签直接用了 IV 水平值模型发现最简单的策略就是把昨天的曲面平移过来因为 level 本身很平稳残差很小。这种模型看似指标不错实际上没有任何预测能力。解决方法是改成残差标签 log(IV_{t1}/IV_t)并在评估时把 persistence 设成硬性 baseline。我这边的规则是预测模型在 rolling 窗口上至少要赢 persistence 15% 以上的 RMSE否则不算有效模型不值得继续投入。4.2 数据与上线阶段的另两个高频坑坑四预测曲面有套利进报价系统就被薅。现象是日历价差方向倒挂同一个 moneyness 下到期时间更长的期权反而更便宜或者 butterfly 出现负值虚值端被压得太低。原因是注意力输出不保证曲面凸性和单调性MLP 输出自由度太高模型在无约束情况下学到了局部最优的数值解但这种解在报价端就是无风险套利。解决方法是输出层用 log-variance 保证方差非负同时在 loss 里加 reg_arbitrage0.01 的软约束如果时间紧就用第 5 章的投影函数做一次后处理把 calendar arbitrage 直接抹掉。但要注意后处理会损失一部分模型学到的微笑细节所以理想状态还是训练时加上约束投影只做最后保险。坑五近月合约预测值经常突刺。现象是 τ 小于 0.05 年的点上IV 一会儿 12% 一会儿 28%完全没有稳定性。原因是 log-ttm 在 τ 趋于 0 时数值变化剧烈OU 核在这个区域衰减太快加上这些点对应的期权流动性极差报价噪声本身也大。解决方法是把 ttm 下限设到 0.02 年近月桶加密并且在 loss 里对 τ 0.05 的点调低权重。还有一个数据层面的细节不同交易所对近月到期报价规则不一样必要时把最后两个到期日合并成一个近月桶噪声会显著下降。不要为了追求网格精细把近月分得特别细曲面模型在近月真正需要的不是分辨率而是稳定性。5. 从预测曲面到对冲回测一条能直接上手的生产路径5.1 预测曲面进报价系统前的最后一道关卡模型输出的曲面不能直接拿去报价至少要做一次无套利投影。下面这个函数是生产里最简单的版本def project_to_tradable(surf, ttm_sortedTrue): var np.maximum(surf, 1e-8) ** 2 # 同一 moneyness 下IV^2 沿到期时间单调不减 for j in range(var.shape[1]): for i in range(1, var.shape[0]): if var[i, j] var[i - 1, j]: var[i, j] var[i - 1, j] return np.sqrt(var)逻辑说明先把 IV 截到正值再平方然后同一 moneyness 列上沿到期时间方向做单调化保证远期方差不低于近期。函数只修 calendar spread不修 butterfly所以它是最低限度的保险。更成熟的做法是在每个期限上用 SVI 拟合一次得到光滑且二次可导的微笑再跨期限做单调化。SVI 参数里σ 控制微笑的曲率如果模型输出的微笑太浅SVI 投影后也会被拉平这时要么调大 reg_arbitrage 权重要么检查 K 方向特征是否被过度平滑。每次上线新模型我都会把原始输出和投影输出放在一起对比看投影改动了哪些区域、改多少避免投影悄悄吃掉模型的预测能力。5.2 怎样证明预测有用一段回测流程想验证模型真的有用我的标准流程是按日期滚动训练预测下一交易日整张曲面在曲面上取 ATM straddle 和 25 delta 组合每天按模型曲面给的 IV 计算 BS delta持仓对冲扣掉手续费后统计 3 天滚动 PnL 分布。模型的价值不是 RMSE 数字而是 PnL 分布的均值是否转正、尾部是否比 baseline 收敛。一个 RMSE 很漂亮但 vega 方向判断错误的模型回测时会亏得结结实实反过来偶尔 RMSE 偏大但方向判断对的模型对冲 PnL 反而可能更稳定。另外我还会看预测曲面与实际曲面之间的 vega 敞口变化。简单说如果模型预测明天波动率上升你就不能只盯着误差大小要看这个方向判断在统计上有没有命中率。这类模型最值钱的能力不是精确复刻明天的曲面而是提前感知曲面形态的变化方向。从那以后我每次跑曲面模型都会强制走一遍“曲面误差、套利检查、对冲 PnL”三关三关都过了才敢把预测结果推到交易台。这已经是我的条件反射也希望帮到你。本文还有配套的精品资源点击获取
返回列表