金融事件採樣的 CUSUM 濾波器完整解析
從對數報酬累積與門檻重設開始,了解 CUSUM 如何挑選事件時點,以及門檻、收盤時間與回測成本如何影響結果。
本指南內容CUSUM 挑選事件時點,不預測方向
簡短摘要
CUSUM 濾波器將連續對數報酬分別累積為正向與負向路徑;任一側越過門檻,就記下一個事件並重設該側的累積值。它回答的是「何時抽取樣本」,不是「下一步漲跌如何」,也不會自行產生預測標籤或交易訊號。
CUSUM 挑選事件時點,不預測方向
固定時間間隔的採樣,可能讓平靜時段與劇烈波動時段取得相同數量的樣本。事件採樣只留下達到預先設定價格變動條件的時點,讓研究者聚焦在累積移動發生之後的資料。改變樣本的時間軸,不代表已經找到交易機會。
Page 在 1954 年探討持續檢查過程中的累積和方法;金融機器學習使用的 CUSUM 濾波器,則把「持續累積偏差,達到門檻便觸發事件」的概念套用到價格變動。Page 的論文和 《Advances in Financial Machine Learning》第 2 章可作為方法背景。mlfinpy 過濾文件說明如何選出供後續標記或建模使用的事件時點。
過濾器與後續工作必須分開:它決定何時開始觀察;特徵與模型決定使用哪些資訊;標籤規則才描述事件之後的結果。每根 K 線各建立一個預測樣本,和只在事件觸發時建立樣本,代表不同的採樣問題。
正向與負向累積值如何更新
令 (P_t) 為時間 (t) 的收盤價,兩個相鄰收盤價之間的對數報酬為:
\[ r_t=\ln(P_t/P_{t-1}). \]
令 (S^+_t) 和 (S^-_t) 分別表示非負的正向累積值,以及非正的負向累積值:
\[ S^+_t=\max(0,S^+_{t-1}+r_t),\qquad S^-_t=\min(0,S^-_{t-1}+r_t). \]
採用對稱門檻 (h>0) 時,本文使用嚴格觸發條件:(S^+_t>h) 或 (S^-_t<-h) 才記錄事件,並將觸發側重設為零。另一側仍依照各自的遞迴式更新;發生事件不表示兩側狀態一律同時歸零。
濾波器通常輸出事件時間戳或觸發事件的收盤資料列。它不是每個事件的方向標籤,也不是價格目標。實作還能支援隨時間變動的 (h_t);門檻固定或動態都一樣,累積值與門檻必須使用相同的報酬單位。
逐步計算對稱門檻範例
假設收盤價依序為 100.00、100.20、100.40、100.60、100.40、100.20、100.00,且 (h=0.005) 個對數報酬單位。以下價格只是說明規則的假設例子,並非實際市場行情或成交資料。
前三段正向對數報酬約為 0.001998、0.001994、0.001992。因三段都往同一方向累積,到 100.60 時正向總量為
\[ \ln(100.60/100.00)=0.005982\text{(約 }0.598\%\text{)}. \]
這個數值大於 0.005,因此 100.60 收盤時觸發正向事件,接著將 (S^+) 重設為零。價格之後回跌,向下累積從重設後的狀態開始;從 100.60 回到 100.00 的總對數變化為
\[ \ln(100.00/100.60)=-0.005982. \]
所以 100.00 收盤時觸發負向事件,並重設 (S^-)。此前曾經上漲,不會妨礙回跌後再次形成事件。兩次事件之間有多少根 K 線,取決於實際價格路徑,不是固定間隔。
門檻單位、等號邊界與動態調整
此處 (r_t) 與 (h) 都是無單位的對數報酬。以百分比表示,0.005 約相當於 0.5% 的連續複利報酬幅度;它不是貨幣價格,也不能直接和其他單位的指標比較。價格變動很小時,對數報酬接近簡單報酬,但兩者並不完全相同。
教學文字有時將觸發條件寫成達到或超過門檻((\geq h));mlfinpy 目前的對稱濾波程式則使用嚴格大於與小於((S^+>h)、(S^-<-h))。請同時參考文件和實作程式碼。連續價格剛好落在邊界的情況可能少見,但資料四捨五入後,恰好等於門檻時是否觸發會影響可重現性;研究時應明確選定並固定比較方式。
固定門檻容易理解和重現,但不同波動狀態下的事件密度會改變。動態方案可以依歷史波動尺度調整 (h_t),例如將歷史報酬波動估計乘上預先選定的常數。估計必須符合因果順序:處理時間 (t) 的報酬時,只能使用當時已取得的資料,並記錄估計視窗、更新頻率與門檻所屬時間。用全樣本估計波動後再回填歷史門檻會洩漏未來資料。動態門檻會讓事件間隔隨尺度變化,但不保證預測未來波動或找到最佳門檻。
對數報酬要求價格為正
(\ln(P_t/P_{t-1})) 要求兩期價格都大於零。遇到零價、負價或不適合對數報酬的序列時,公式沒有定義,或已不再具有原來的解釋。不要只為了讓程式繼續執行,就默默取價格絕對值或任意平移價格;這會改變測量對象。應選擇適合資料的報酬或價格變動定義,並相應調整門檻、說明單位及檢查資料清理規則。
用於事件採樣的價格序列也要定義清楚:交易價、買賣中間價、結算價,還是還原收盤價?不同序列可能產生不同觸發時點。股票分割等造成的機械式跳價、報價缺漏或時間戳錯置,也可能產生不是市場變動訊號的累積值。
時間 K 線、事件時間與收盤資訊
資料可以取自每分鐘、每小時或每日收盤價;CUSUM 只在越過門檻的 K 線留下事件,因此相鄰事件的時間間隔通常不規則。事件時間不是等速時鐘:有些時段不會出現事件,也可能在短時間內連續觸發。下游模型若使用時間間隔、波動或持有期間,應明確將間隔納入處理,不能假設每兩個樣本就相隔一個固定交易日。
若 (r_t) 使用收盤價,必須等收盤價形成且可見後,才能計算該根 K 線的報酬和觸發結果。因此以該收盤價偵測訊號,又假設能零延遲地以同一價格成交,並不符合實際時序。回測應依資料可取得的時間安排決策,並用下一個可執行報價或成交價模擬下單;若使用盤中資料,也要說明當時實際可見的價格,以及資料和下單延遲。
門檻會改變事件密度與雜訊取捨
門檻較低時,累積路徑較容易觸發,事件數通常增加;這能留下更多小幅移動,也會增加雜訊樣本、手續費和執行負擔。門檻較高時,事件較少,只有較大的移動才會被記下,但小幅或快速反轉可能遭到忽略。調整門檻不只影響樣本數,也會改變事件分布、重疊情況及模型接收的資料,因此不能只挑回測績效最高的門檻,再把它當成事前就定好的設計。
先在訓練期間或研究設計階段決定候選門檻,再以依時間排序的樣本外區間評估事件率、事件間隔和後續任務。如果嘗試過多個門檻、資產和日期區間,應說明篩選過程;只呈現最佳結果會誇大證據。門檻沒有脫離預測目標、市場和資料頻率仍通用的最佳值。
驗證、交易成本與三種不同的 CUSUM 用途
驗證時要保留時間順序,每個訓練折只能用當時已知資料估計動態門檻。若後續標籤會用到多個未來時間點,訓練和測試事件的結果區間可能重疊,應依標籤區間採用剔除重疊樣本或隔離期間的規則。評估模型也要納入買賣價差、手續費、滑價、資金費率、借券費用和實際成交條件;事件愈頻繁,成本愈可能改變淨結果。
價格事件濾波器必須與回歸穩定性檢定區分。回歸 CUSUM 通常累積遞迴殘差,並以統計界限檢驗回歸係數是否穩定;它檢驗的是模型殘差和相關假設,不是本篇以價格對數報酬設定雙側門檻的事件濾波器。延伸閱讀:回歸 CUSUM 結構穩定性檢定指南。
事件濾波器也不會代替三重障礙法建立結果標籤。先由 CUSUM 選出事件開始時點,再依研究者預先訂定的停利、停損與時間期限規則,從之後的價格路徑計算 (y)。請參閱三重障礙法金融事件標記指南。觸發只代表指定的累積變動越過門檻;它不預測方向、不保證平穩性或流動性,也不能證明扣除交易成本後有獲利優勢。
常見問題
Q1CUSUM 事件觸發代表看漲或看跌訊號嗎?
不代表。正向或負向觸發說明某一側的累積變動越過門檻,用來標記觀察時點。若要預測下一段方向,必須另行定義特徵、預測目標和驗證方法。
Q2累積值剛好等於門檻會觸發嗎?
取決於採用的慣例。過濾文件的文字有時寫作「大於或等於」,mlfinpy 目前實作則採嚴格的大於或小於。研究與程式應採用相同規則,並固定邊界處理。
Q3CUSUM 濾波器能保證樣本平穩或策略獲利嗎?
不能。它依累積價格變動挑選事件,不會證明報酬平穩、成交有足夠流動性,或策略扣除成本後獲利。模型假設、樣本外結果和交易成本都需要分別檢查。
資料來源與延伸閱讀
回報問題
我們會準備一封包含本文連結的電子郵件。寄出後,Mark 才會收到你的回報
快速檢查
讀完指南後,用 3 道題檢查一下
問題 01
正向累積值第一次嚴格大於門檻 h 時,依本文規則應如何處理?
選擇答案即可查看解釋