ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

卡尔曼滤波期货套利:把“会过期的均值“换成递推估计的四层拆解

卡尔曼滤波期货套利:把“会过期的均值“换成递推估计的四层拆解 卡尔曼滤波期货套利把会过期的均值换成递推估计的四层拆解【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant均值回归策略最常见的死法不是价差没有回归而是你用来量回归的那把尺子已经过期了。基于 gs-quant 量化金融工具包本文用卡尔曼滤波做期货套利把固定窗口的价差均值与标准差换成逐期递推的动态估计并把整个系统拆成数据、滤波、信号、回测四层每层只保留最小可运行的部分。上图取自仓库内权益交易事件的流水线图输入→评估→优化→输出的分层方式与本文要搭的四层系统同构仅作结构示意。 先看最终效果四层系统各自管什么本节先回答这套系统长什么样给出对比效果再列出四层的输入输出后续各节按层展开细节。示例回测对比示例数据指标卡尔曼动态阈值固定 60 日窗口 ±2σ年化收益率19.4%11.2%夏普比率1.50.8最大回撤9.6%14.1%年交易次数62118示例回测结果非真实业绩。合约、对冲比例与窗口参数均见下文各层。一句话结论把均值从常量改成逐期更新的估计是这套系统相对静态方法唯一的结构性差异其余都是工程细节。四层输入输出一览层输入输出代码位置仓库内数据层合约定义、日期区间对齐后的价差序列spread_rawgs_quant/markets/、gs_quant/instrument/滤波层价差序列、Q/R 参数每期中心估计x_t与协方差P_t本文代码约 20 行信号层x_t、P_t、原始价差1 / 0 / −1 三态信号本文代码回测层信号、初始资金绩效指标gs_quant/backtests/、gs_quant/risk/数据层合约与价差序列怎么准备本节解决入口问题选哪两个标的、如何在 gs-quant 里定义合约、如何把它们对齐成一条价差序列。合约定义与行情拉取以螺纹钢 2309 与铁矿石 2309 为例1 小时频率、约半年区间示例import numpy as np from gs_quant.markets import get_history from gs_quant.instrument import Future # 定义合约对冲比例 1 : 5经验系数 rb Future(RB, 2309, CFFEX) i Future(I, 2309, DCE) rb_price get_history(rb, price, start_date2023-01-01, end_date2023-06-30, frequency1h) i_price get_history(i, price, start_date2023-01-01, end_date2023-06-30, frequency1h) # 价差 螺纹钢 - 5 × 铁矿石 spread_raw rb_price - 5 * i_price对冲比例这个系数从哪来两条路子对历史价格水平跑一次 OLS 回归取斜率作经验系数或直接用合约规格推导。关键是系数一旦确定回测期间不再改——否则价差序列本身就在漂移后面滤波层追的对象是错的。完整的拉数与清洗脚本可参考仓库 gs_quant/documentation/04_backtesting/ 下的示例 notebook本文只保留上面三件事合约定义、行情获取、价差计算。 滤波层卡尔曼滤波最小实现Q/R 参数从哪来本节回答核心数学问题如何用状态空间模型表达均值自己会动以及简化后的最小公式和代码。状态空间模型与两处简化状态方程 spread_t a b·spread_{t-1} w_t , w ~ N(0, Q) 观测方程 z_t spread_t v_t , v ~ N(0, R)其中a为漂移项b为持续性系数。两个噪声参数各给一句直觉解释过程噪声 Q真实中心自己漂移的速度Q 越大允许中心动得越快观测噪声 R报价里混入的随机杂质R 越大越不信任当根 K 线协方差 P估计有多不确定的刻度收敛后决定信号阈值宽窄两处简化理由如下状态取单个标量只关心价差水平状态转移矩阵F[1]——用上一期中心作为当期中心的最优预测把均值回复交给 Q/R 的比值去体现观测矩阵H[1]——观测就是状态 噪声矩阵乘法与求逆全部退化成标量除法整个更新只剩四行运算。卡尔曼增益 K 是信任新观测的权重决定中心跳多快R 大则 K 小中心动得慢。最小可运行实现class KalmanSpreadTracker: 单状态卡尔曼滤波F1、H1矩阵运算退化为标量 def __init__(self, q1e-4, r2e-3): self.Q, self.R np.array([[q]]), np.array([[r]]) self.x np.array([[0.]]) # 状态估计隐含价差中心 self.P np.array([[1.]]) # 协方差估计的不确定性 def update(self, z): # 预测中心沿用上一期不确定性加上 Q x_pred, P_pred self.x, self.P self.Q # 更新卡尔曼增益 K P/(PR) K P_pred / (P_pred self.R) self.x x_pred K * (z - x_pred) self.P (1 - K) * P_pred return self.x[0, 0] tracker KalmanSpreadTracker() xs, ps [], [] for s in spread_raw.values: # 逐期递推不重置状态 xs.append(tracker.update(s)) ps.append(tracker.P[0, 0]) spread_kalman np.array(xs)注意 tracker 是一个对象被串行复用状态不重置ps存下每期各自的P信号层要用到。Q 和 R 分别怎么给参数直觉含义给值方法R报价里的随机杂质用价差最近 20 期一阶差分方差的滚动估计如np.var(ret[-20:])每 N 期重估一次防止单一取值被行情用旧Q中心漂移的速度网格粗调1e-6 ~ 1e-2 量级再按下文敏感性结果定稿 信号层用 2σ 阈值把偏离变成多/空/观望本节回答什么时候交易把滤波中心与原始价差的连续偏离转成 1 / 0 / −1 三态信号。阈值怎么算用当期的协方差P_t作阈值尺度阈值取2σ 2·√P_t。与静态布林带的差别在于静态方法的窗口和 σ 来自历史统计这里来自滤波自身的递推更新——行情平静时P_t收窄、阈值收紧行情剧烈时P_t放大、阈值放宽不需要人工切换窗口。信号生成代码sigma np.sqrt(ps) # 每期各自的阈值尺度 dev spread_raw.values - spread_kalman signal np.zeros(len(dev)) signal[dev 2 * sigma] -1 # 高于中心 → 做空价差 signal[dev -2 * sigma] 1 # 低于中心 → 做多价差 # 其余保持 0观望信号规则汇总条件信号含义spread_raw − x_t 2√P_t−1价差显著高于动态中心做空价差x_t − spread_raw 2√P_t1价差显著低于动态中心做多价差其余0观望不新开仓回测层回测结果怎么读以及适用边界本节回答两个问题回测跑完后怎么解读数字以及这套方法在哪些行情里会失效。回测框架与绩效读数回测用 gs-quant 现成框架gs_quant/backtests/ 中的Backtest定义合约集合与初始资金把信号序列交给引擎运行绩效经 gs_quant/risk/ 下的Performance枚举读取如Performance.SHARPE_RATIO、Performance.MAX_DRAWDOWN。读数时盯三点交易次数是否在预期量级过多说明阈值过紧回撤是否集中在行情结构突变后的首次信号若是说明滤波在追噪声绩效对交易成本是否敏感频率越低越抗成本。必要时可把滤波后的价差暴露接入 gs_quant/models/risk_model.py 的因子风险模型做风险归因完整接线脚本见仓库对应示例 notebook。参数敏感性怎么看示例回测中Q、R 在 1e-6 ~ 1e-2 范围内单独调整夏普、回撤等指标波动普遍小于 8%。方向性结论Q/R 不需要调到小数点后某一位只需要量级正确把力气花在是否随行情重估 R上回报更大。什么行情下这套方法会失效持续单边趋势价差长期不回归时任何动态中心都会追错方向均值回复前提不成立结构性断点供需、政策改变价差分布本身滚动 R 会被系统性带偏高成本低流动性信号本身就稀疏手续费与滑点能吃掉全部边际厚尾分布2σ 阈值会低估真实偏离幅度可考虑放大倍数或粒子滤波✅ 下一步清单从示例到你的品种本节是一份待办清单读完后按顺序做什么仓库里哪里可以继续看。五条可执行动作把示例合约换成自己的价差组合先跑通数据层肉眼检查价差序列有没有对齐缺失以 Q1e-4、R2e-3 为起点跑通滤波层与信号层确认信号期数量在合理量级用 20 期滚动方差重估 R对比绩效变化幅度做第一次自适应实验对 Q/R 做十倍网格敏感性分析记录指标极差后再谈稳健在回测中加入交易成本重读频率、回撤位置、成本敏感这三个数仓库里继续看什么时间序列技术指标含exponential_moving_average可作噪声估计的对照基线gs_quant/timeseries/technicals.py回测引擎与事件、订单系统gs_quant/backtests/因子风险模型风险归因gs_quant/models/risk_model.py【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进