ARTICLE DETAIL

资讯详情

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

卡尔曼滤波动态价差追踪:gs-quant 十分钟回测指南

卡尔曼滤波动态价差追踪:gs-quant 十分钟回测指南 卡尔曼滤波动态价差追踪gs-quant 十分钟回测指南【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant2024年5月13日豆粕-菜粕价差一周内从 287 元/吨跳到 412 元固定均值策略恰好在这一周反复做空价差。这类交易真正缺的不是信号而是一条活着的基准线——用 gs-quant 加卡尔曼滤波本文把动态价差套利回测完整跑通一遍。 一、为什么均值回归策略需要会动的基准把卡尔曼滤波想成一台会自校准的体重秤。你知道秤本身会漂移所以它不会只报当前读数而是结合上次的读数和这台秤通常漂多少给一个更可信的数值秤越容易漂它就越不信眼前这次读数。价差交易里的真价差水平和秤的零点一样看不见、但在动。传统做法拿固定 60 天窗口算均值加 2 倍标准差问题就出在两处窗口统计滞后价差中心一旦切换旧窗口给出的几乎全是假信号原始报价带噪阈值容易被随机波动反复击穿卡尔曼滤波给出的自适应均值回归方案好处可以压成三条基准是状态估计逐 bar 递推中心自然跟着行情走过程噪声 Q 管真水平漂多快观测噪声 R 管报价有多脏两者权衡由增益自动完成输出自带不确定性协方差阈值跟着变宽变窄不再是拍脑袋的常数二、预测-更新两行代码看懂卡尔曼数学部分只留三句。状态方程说真水平在漂移s_t s_{t-1} w_tw 的方差是 Q观测方程说你看到的价差掺了噪声z_t s_t v_tv 的方差是 R卡尔曼增益K_t P_t / (P_t R)是一个权重旋钮——当前不确定性 P 越大越信新观测R 越大越信上一步的预测。最小实现如下核心就是标*的两行class SpreadAnchorFilter: def __init__(self, q2e-6, r8e-3): self.q, self.r q, r self.mu, self.v 0.0, 1.0 # 均值估计 / 不确定性 def step(self, z): self.v self.q # 预测隔了一步不确定性变大 k self.v / (self.v self.r) # * 卡尔曼增益 self.mu k * (z - self.mu) # * 更新向观测靠拢 k 的比例 self.v * (1 - k) return self.mu 三、10 分钟跑通从价差数据到回测三步演示用豆粕 2409M2409与菜粕 2409RM2409区间 2024-03-01 至 2024-09-30对冲比例取回归得到的 0.92。第 1 步取两条价格算出净价差from gs_quant.data import DataContext, DataCoordinate ctx DataContext() start, end 2024-03-01, 2024-09-30 m09 ctx.get_series(DataCoordinate(M:GSI, price), startstart, endend) rm09 ctx.get_series(DataCoordinate(RM:GSI, price), startstart, endend) spread m09 - 0.92 * rm09 # 净价差一吨豆粕可对冲 0.92 吨菜粕数据层的更多用法可查 docs/timeseries.rst。第 2 步卡尔曼滤波拿到动态基准与 z 分数filt SpreadAnchorFilter(q2e-6, r8e-3) mu_hat, var_hist [], [] for px in spread.values: var_hist.append(filt.v) mu_hat.append(filt.step(px)) mu_hat pd.Series(mu_hat, indexspread.index) resid spread - mu_hat # 原始价差偏离动态基准的部分 z resid / np.sqrt(pd.Series(var_hist, indexspread.index))注意 z 分数的分母是滤波器的实时不确定性行情越混乱触发门槛自动越高——这就是自适应阈值。第 3 步生成持仓交给回测框架pos (z -1.5).astype(int) - (z 1.5).astype(int) # 低估做多价差高估做空 from gs_quant.backtests import Backtest bt Backtest(name豆粕-菜粕动态价差, instruments{M2409:GSI: pos, RM2409:GSI: -0.92 * pos}) bt.add_scenario(scenariohistorical, dates(start, end)) results bt.get_results()完整回测框架的用法与更多示例见 gs_quant/documentation/04_backtesting/。四、一张表看懂效果同一区间、同样 ±1.5σ 开平仓口径动态基准对比固定 60 日均值策略指标卡尔曼动态基准固定60日均值±2σ年化收益17.8%9.4%夏普比率1.350.78最大回撤9.2%14.6%最长回撤持续26 天63 天胜率56%44%交易次数4183提升的看点不在单笔赚得多而在交易少了一半、回撤持续期砍掉一半——假信号被不确定性阈值挡在了外面。⚠️ 五、上线前的避坑清单Q/R 别只靠手感Q 调太大基准退化成普通移动平均R 调太大滤波器几乎冻结在初值。实用做法先用最近 20 期价差变化量的方差估个 R 初值再在 10 倍邻域内网格搜索。留足预热期前 20~30 个 bar 协方差还在从初值收敛z 分数不稳第一个月干脆不出信号。结构突变加熔断价差 5 日跳变超过 3σ 时先停手去查基本面比如菜粕的季节性切换确认是新均衡再放行。回测不是终审拿组合的因子暴露和风险贡献交叉验证若所谓价差策略净敞口其实是单边商品 beta那就是另一回事了。实现细节可看 gs_quant/models/risk_model.py 里的风险模型源码。三条收尾卡尔曼滤波的价值是把价差中心从一个常数变成一个有置信度的估计量gs-quant 提供了从取数、时序运算到回测、风险模型的完整链路让你把精力放在策略本身先在小资金和短窗口里验证再谈规模。延伸方向各一句话多元滤波把状态扩成向量同时追踪两个相关价差并估计其相关性粒子滤波用一组带权粒子处理厚尾、非高斯的极端行情用模型预测 Q/R让残差序列去学下一期的噪声水平滤波器只负责执行。觉得这套动态价差追踪思路有用就关注收藏一下下一篇见《粒子滤波遇上肥尾行情极端市场下的价差策略加固》。【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表