
卡爾曼濾波期貨套利把會過期的均值換成遞推估計的四層拆解【免費下載鏈接】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),僅供參考