市場狀態偵測:3 種狀態,如何衡量與檢驗
三種可衡量的狀態(趨勢、盤整、高波動)涵蓋了指數期貨的大多數情況。用 ATR、ADX 與市場廣度的讀數對照固定門檻,為每根 K 棒貼上標籤,把標籤當作過濾條件或切換開關,只有在它改善樣本外(OOS)結果、且門檻小幅變動後仍然成立時才保留。
作者 Soren Huang · 發佈 · 更新於 · 編輯原則
目錄
什麼是市場狀態?期貨交易者該關注哪三種狀態?
市場狀態是指價格在一段時間內以某種可辨識的方式運行。對指數期貨交易者來說,三種狀態涵蓋了大多數情況:趨勢、盤整與高波動。每一種狀態用一兩個指標在 K 棒收盤時讀取,把讀數轉成標籤,再由標籤決定要執行哪些規則、用多大的部位。
這三種狀態由兩件可以衡量的事來定義,而不是憑主觀意見。第一是方向持續性:價格是否連續多根 K 棒朝同一方向走?第二是 K 棒的波動幅度:K 棒是小、正常,還是異常大?趨勢狀態的方向持續性高、K 棒幅度正常。盤整狀態的方向持續性低、K 棒幅度正常。高波動狀態則是 K 棒在兩個方向上都異常大,不論方向持續性如何。
值得在意的原因是,大多數期貨策略屬於兩大類,而每一類在某種狀態下表現良好,在另一種狀態下表現不佳。順勢策略(價格向上突破就買、向下突破就賣)在趨勢狀態中賺到獲利,在盤整狀態中則反覆承受小額虧損。均值回歸策略(逆著走勢操作,賭價格回到平均)則剛好相反。高波動對兩者都不利,因為停損容易被雜訊觸發,滑價也會擴大。實務上,狀態分析只是在決定要執行什麼之前,每天問一次現在處於三種中的哪一種。
如何用簡單的指標衡量目前的市場狀態?
三個輸入就足以在每根 K 棒收盤時標出狀態:波動度、趨勢強度與市場廣度。每個輸入用單一門檻轉成是/否的讀數,三個讀數合起來就是標籤。這些是多數交易者圖表上本來就有的市場狀態指標;真正的功夫在於固定好你怎麼讀它們。
波動度。ATR(平均真實波幅)是在選定的 K 棒數內,K 棒完整波動範圍的平均大小,包含與前一根收盤之間的任何跳空。單看 ATR 沒有太多資訊,因為某一年的正常 ATR 在另一年可能算很大。應該拿它與自己較長期的歷史比較。本文唯一的公式就是波動率比值:
波動率比值 = ATR(14) ÷ 最近 100 根 K 棒 ATR(14) 的平均值
這裡 ATR(14) 是最近 14 根 K 棒的 ATR,分母則是同一個 ATR 值在最近 100 根 K 棒上的簡單平均。比值接近 1.0 表示今天的 K 棒大小正常。比值明顯高於 1.0 表示 K 棒異常大。用一個門檻,例如 1.5,就能把它轉成「高波動:是或否」。
趨勢強度。ADX(平均趨向指標)是衡量價格朝單一方向移動強度的指標,範圍從 0 到 100,但不會告訴你方向。數值低表示價格原地打轉;數值高表示持續的走勢。另一個回答同樣問題的較簡單做法,是以 ATR 為單位,衡量價格與長期移動平均線的距離,讓不同年份的距離可以比較。無論哪種方式,用一個門檻就能得出「趨勢:是或否」。
市場廣度。市場廣度是指數成分股中,站上各自移動平均線的比例,例如標普 500 成分股中站上 50 日均線的百分比。它回答了單看價格無法回答的問題:這波走勢是由大多數股票推動,還是只靠少數權值股?市場廣度來自現貨市場,每天更新一次,所以即使你的策略交易的是日內 K 棒,它也是日資料的輸入。兩個門檻(一個低、一個高)可得出「廣泛上漲」、「廣泛下跌」或「分歧」。
| 輸入 | 回答的問題 | 常用指標 | 趨勢(示意) | 盤整(示意) | 高波動(示意) |
|---|---|---|---|---|---|
| 波動度 | 波動大嗎? | ATR(14) 對其 100 根 K 棒平均 | 比值接近 1.0 | 比值接近或低於 1.0 | 比值高於 1.5 |
| 趨勢強度 | 波動有方向性嗎? | ADX(14),或價格與 200 根 K 棒均線的距離(以 ATR 為單位) | ADX 高於 25 | ADX 低於 20 | 任何數值 |
| 市場廣度 | 走勢是廣泛還是集中? | 站上 50 日均線的成分股百分比 | 高於 70% 或低於 30% | 介於 30% 與 70% 之間 | 常快速下滑 |
測試的順序很重要。先檢查波動度:如果比值高於門檻,標籤就是「高波動」,其他兩個讀數不會改變它。只有在波動度正常時,才由趨勢強度與市場廣度來決定是「趨勢」還是「盤整」。
該用策略內的狀態過濾,還是策略外的狀態切換?
先從策略內的狀態過濾開始,因為它只多一個條件、一個門檻,容易誠實地檢驗。只有在過濾已經證明有效,而且你有多個策略可以選擇時,才進一步採用策略外的狀態切換。
狀態過濾是一個額外的進場條件,必須與策略自己的訊號同時成立,才會下單。「突破時做多,但只在 ADX 高於 25 時」就是一種狀態過濾。策略仍然是同一個策略,只是多了一個參數。過濾條件不成立時,策略就不交易。
狀態切換則是位於多個策略之上的獨立模型,依據狀態標籤決定哪個策略執行,或用多大的部位。「趨勢時執行突破規則,盤整時執行均值回歸規則,高波動時部位減半或空手」就是狀態切換。它更有彈性,讓你在每種狀態下都有事可做,而不是閒置。代價是多了第二個可能被過度配適的東西:切換模型有自己的門檻,而且因為狀態很少變化,它的決策歷史很短。
| 策略內的過濾 | 策略外的切換 | |
|---|---|---|
| 是什麼 | 一個額外的進場條件 | 在策略或部位大小之間分派的獨立模型 |
| 新增參數 | 一到兩個 | 好幾個,再加上每個策略本身的參數 |
| 容易與基準比較檢驗 | 容易:有條件與無條件對照 | 較難:基準是未過濾策略組成的投資組合 |
| 狀態判斷錯誤時的表現 | 錯過一些交易 | 執行了錯誤的策略 |
| 最適合的第一步 | 是 | 在過濾證明有效之後 |
如何檢驗狀態過濾是否真的帶來價值?
過濾條件要通過與同一策略未過濾版本的三項比較,才值得保留:扣除成本後更好的樣本外結果、被濾掉的交易大多是虧損單,以及門檻往兩個方向小幅移動時結果仍然相近。僅憑過濾版本的一次回測什麼也證明不了,因為過濾條件是在看過資料之後才選的。AlphaPrime(Valynox) 回測對過濾版和未過濾版用同樣的手續費、滑價與下一根 K 棒成交,第一項扣除成本後的比較就站在相同的設定上。
依下列順序進行檢驗:
- 先不加過濾條件執行策略,這就是基準。記錄扣除手續費與滑價後的淨損益、交易筆數與最大回撤,樣本內與樣本外期間分開記錄。如果你還沒切分資料,推進分析那篇文章說明了如何把歷史切成樣本內與樣本外的視窗。
- 加入事先固定好門檻的過濾條件,例如常見的 ADX 25,或 ATR 比值 1.5。在執行任何東西之前先把門檻寫下來。
- 在兩個期間比較兩個版本。樣本內的比較告訴你過濾條件對它所建構的資料做了什麼。真正重要的是樣本外的比較。
- 檢視被過濾條件濾掉的交易。把它們列出來,檢查它們的平均損益。濾掉的大多是虧損單,代表過濾條件做到了你的本意。若濾掉的是隨機混合的賺賠單,那只是減少了交易筆數,而較少的交易筆數可能讓任何曲線偶然看起來更平滑。
- 把門檻上下移動幾個級距後重跑。結果應該是逐漸改變。如果只在某個精確數值有效、鄰近數值就失效,代表門檻配適到的是雜訊。
假設性範例
某指數期貨的突破策略在樣本外期間有 400 筆交易,扣除成本後平均每筆損益為 0.8 個指數點。加上 ADX 25 的過濾後,交易剩 280 筆,平均每筆損益 1.4 點。被濾掉的 120 筆交易平均為 −0.6 點,其中 85 筆是虧損單。把門檻改為 20、22、28 與 30 重跑,平均每筆損益介於 1.1 到 1.5 點之間。這個過濾條件通過了三項比較。如果被濾掉的交易平均是 +0.2 點,或者 22 與 28 的結果掉回 0.8,即使 25 看起來不錯,這個過濾條件也會被捨棄。
為什麼狀態模型會過度配適?如何讓自己的模型保持誠實?
狀態模型會過度配適,是因為狀態很少變化,用少數幾個狀態轉換去調整幾個門檻,可以完美貼合過去,卻毫無意義。十年的日資料可能只包含十來次明確的趨勢、盤整與高波動之間的切換。為了抓住這十來個事件而選出的門檻,學到的是日期,而不是市場。
可以拿天氣規則來比較。如果去年下了六天雨,你根據這六個讀數建立規則,總能找到一個預測全部六天的規則。這個規則是配適那六天的。隔年它就失靈,因為六個樣本不足以區分真正的規律與巧合。Bailey 等人(2014)在回測中展示了同樣的效應:在同一段歷史上嘗試許多變體時,很容易找到強勁的樣本內結果,而它在樣本外往往縮水。帶有兩三個門檻的狀態過濾,正是這樣的一組變體。
四個習慣能讓模型保持誠實:
- 在檢驗前固定狀態數量與門檻。三種狀態、標準門檻,並寫下來。看到結果後再修改,就是手動調整,策略生成中的過度最佳化那篇文章說明了為什麼這會讓之後的每個數字都被誇大。
- 只用已完成的 K 棒計算標籤,並套用在下一根 K 棒。前視偏誤是使用了決策當下無法取得的資訊。如果第 N 根 K 棒收盤時的指標值產生了標籤,那個標籤只能影響第 N+1 根 K 棒的決策。把它套用在第 N 根 K 棒自己的進場,就是用收盤價去決定一筆發生在收盤之前的交易。
- 把過濾條件的參數算進策略裡。有四個參數的策略再加上兩個參數的過濾,就是六個參數的策略。它的樣本內結果應該以此來評斷,而它的推進視窗必須把過濾條件納入最佳化,而不是事後才加上去。
- 偏好有道理可說的門檻。ATR 比值 1.5 表示 K 棒比平常大一半。ADX 25 是多數教科書提到的水準。像 23.7 這種由最佳化程式跑出來的門檻沒有道理可說,也無法移植到別的市場。
指數期貨今天的狀態模型長什麼樣子?
一個可運作的狀態模型是一張小表,在日 K 棒收盤後每天讀一次:三個讀數、三個門檻、一個標籤,以及一條寫好的規則,說明每個標籤會改變什麼。填寫只需要一分鐘,卻能用可重複的檢查取代每天對市場在做什麼的爭論。當人們搜尋美國市場目前的狀態時,這張表就是他們真正想找的答案,用 ES 或 NQ 搭配標的指數的市場廣度來計算。
這張表有四個部分:
- 讀數。ATR 比值、ADX 值與市場廣度百分比,全部來自已完成的 K 棒。市場廣度是現貨市場的日資料;ATR 與 ADX 可以用日資料,也可以用你的策略所交易的 K 棒週期。
- 門檻。與上一節檢驗過的固定數值相同,不會每天變動。
- 標籤。先檢查波動度。如果比值高於門檻,標籤就是「高波動」。否則由 ADX 與市場廣度決定是「趨勢」還是「盤整」。
- 動作。每個標籤一行,事先寫好:哪些規則執行、部位多大。讀取當下不再決定其他事。
假設性範例
今天收盤時,ATR 比值讀數為 0.9,門檻為 1.5,所以波動度正常。ADX(14) 讀數為 17,門檻為 25,所以沒有趨勢。市場廣度讀數為 48% 的成分股站上 50 日均線,介於 30% 與 70% 的門檻之間,所以走勢分歧。標籤是「盤整,波動正常」。該標籤事先寫好的動作是:均值回歸規則以全部位開啟,順勢規則關閉。明天的 K 棒依此規則交易,並在明天收盤後再次填寫這張表。
請保存每日標籤的紀錄。幾個月後,你可以看出標籤變動的頻率、每種狀態持續多久,以及你寫下的動作是否與你實際的做法相符。這份紀錄也是下一輪檢驗的原始材料,因為它告訴你,你的門檻實際上經歷過多少次狀態轉換。
如果你使用 AlphaPrime,這代表:狀態過濾和其他進場條件一樣,所以你可以在策略生成中,以固定的參數範圍納入趨勢強度與波動度條件,再讓策略檢驗把有過濾與無過濾的候選策略,放進相同的推進視窗與門檻中檢驗,讓過濾條件在樣本外資料上接受評斷,且它的參數也算作策略的一部分。
常見問題
三種市場狀態是什麼?
指數期貨實用的三種狀態是趨勢、盤整與高波動。趨勢是指價格持續朝同一方向移動,K 棒大小正常。盤整是指價格來回震盪,K 棒大小正常。高波動是指 K 棒遠大於近期平均,不論方向,且它的優先順序高於另外兩種標籤。
哪個指標能顯示目前的市場狀態?
沒有單一指標能做到,因為狀態有兩個維度。ADX,或價格與長期移動平均線的距離,衡量市場的方向性。ATR 與自己較長期平均的比較,衡量 K 棒有多大。市場廣度則補上走勢是由大多數股票還是少數股票推動。用固定門檻來讀這三者。
狀態過濾與趨勢過濾一樣嗎?
趨勢過濾是狀態過濾的一種。它只在趨勢指標,例如 ADX 或移動平均線的斜率,高於門檻時才允許進場。完整的狀態過濾還會檢查波動度,常常也包括市場廣度,因此即使趨勢指標看起來不錯,也能在快速、大幅震盪的市場中關閉策略。
狀態標籤應該多常更新?
每完成一根建構標籤所用資料的 K 棒就更新一次,多數交易者使用日 K 棒。市場廣度是現貨市場的日資料,所以每日更新是自然的節奏。收盤時算出的標籤套用在下一根 K 棒,絕不套用在產生它的那一根。
狀態過濾會過度配適嗎?
會,而且很容易,因為十年的資料只有少數幾次狀態轉換可供門檻學習。請在檢驗前固定門檻,在樣本外資料上比較過濾後的策略與未過濾的基準,檢查被濾掉的交易大多是虧損單,並確認鄰近的門檻值得到相近的結果。
參考資料
- Bailey, D. H., Borwein, J., López de Prado, M., & Zhu, Q. J. (2014). Pseudo-Mathematics and Financial Charlatanism: The Effects of Backtest Overfitting on Out-of-Sample Performance. Notices of the American Mathematical Society, 61(5), 458–471.

