49 種技術訊號,零個通過檢定
均線、KD、RSI、MACD、布林通道、燭台型態、費波那契回撤,加上多週期趨勢條件 —— 49 類訊號、178 萬個事件、11,025 個檢定格,通過 FDR 校正的有 0 個。但這篇文章真正想講的是:照著自己寫的規格做,我得到了 5 個顯著發現,其中 4 個是費波那契;擋下它們的是一個我原本不必跑的對照組,因為對照組也給出 5 個。
作者:Elnath Finance Academy
前一篇測完九類圖表型態之後,留下一張很誠實的缺口清單:技術指標算了但沒當成檢定標的、市場狀態算了但沒進檢定格、費波那契完全沒做。當時我寫了一句話:
這幾塊會分開做,測完一塊寫一篇。……不管測出來是「有」還是「沒有」,都會照原樣寫出來。
這篇就是那個承諾的第一次兌現。三個缺口全部補上,另外加了燭台型態。
結果:49 類訊號、1,779,160 個事件、11,025 個檢定格,通過 FDR 校正的有 0 個。
但那個零不是這篇文章的重點。重點是:在得到這個零之前,我先得到了 5 個「顯著發現」,其中 4 個是費波那契回撤位。它們全部是假的,而擋下它們的是一個我原本可以不必跑的對照組。
更難堪的是原因:我照著自己寫的規格做,而那個規格是錯的。照做反而讓結果更糟。
這是一篇實證研究與方法論文章。它描述一項檢定怎麼設計、得到什麼結果,以及這個結果的邊界在哪裡。它不是對任何證券或任何分析方法的推薦,也不是投資建議。
1. 這次補上了什麼
前一篇的缺口,逐項對照:
| 前一篇列為 | 這一篇 |
|---|---|
| ⚠️ 技術指標算了但只當原料 | ✅ 30 類訊號當成檢定標的 |
| ⚠️ 市場狀態算了但沒進檢定格 | ✅ 多週期趨勢展成 4 個狀態的條件維度 |
| ❌ 費波那契完全沒做 | ✅ 6 類回撤位,用已凍結的 ZigZag 樞紐定錨 |
| (新增) | ✅ 燭台型態 13 類(依 Nison 1991 的定義) |
合計 49 類事件,分七個家族。每一類都是機械規則,不是人眼判讀:
| 家族 | 類數 | 事件數 | 內容 |
|---|---|---|---|
| 均線 moving average | 10 | 525,942 | 5/10/20/120 日均線的黃金交叉與死亡交叉、多空排列、價格穿越半年線 |
| 燭台 candlestick | 13 | 348,487 | 錘子、吊人、吞噬、烏雲罩頂、晨星、夜星、三白兵、三烏鴉… |
| KD stochastic | 4 | 275,637 | 超賣區黃金交叉、超買區死亡交叉、進出超買超賣 |
| 布林通道 bollinger | 6 | 220,125 | 上下軌反轉、沿軌道行進、擠壓後突破 |
| MACD | 6 | 211,205 | 訊號線交叉、零軸穿越、多空背離 |
| 費波那契 fibonacci | 6 | 135,913 | 0.382/0.500/0.618 的支撐與壓力 |
| RSI | 4 | 61,851 | 離開超買、離開超賣、多空背離 |
依週期:日線 1,440,900、週線 284,673、月線 53,587。
參數在跑任何統計之前就凍結了,這一點和前一篇一樣重要。而且要說清楚:凍結指標參數時沒有改動任何數值 —— 5/10/20/半年線、KD、RSI、MACD、布林的參數,在這個研究題目被提出來之前就已經寫在設定檔裡了。沒有「先看看哪組參數比較好看」的空間。
費波那契怎麼變成可檢定的
費波那契是這批裡最難處理的一個,因為它最主觀:回撤位要從哪個高點量到哪個低點,本身就是判斷。 兩個人畫同一段行情,可以得到完全不同的 0.618。
處理方式是把那個自由度交給前一篇已經凍結的 ZigZag 樞紐:起訖點由程式依固定規則決定,不由人挑。代價寫在 Limitations 裡 —— 結論因此綁定在那組 ZigZag 參數上。但沒有這一步,費波那契根本不可能被檢定,只能永遠停在「你畫得不對」的循環裡。
多週期條件
「日線出現黃金交叉,但要看週線方向」是實務上很常見的講法。這次把它做成條件維度:把週線或月線的趨勢狀態展成四個 regime,讓每個日線訊號在各狀態下分開檢定。
三個組合:日線×週線條件、日線×月線條件、週線×月線條件。
2. 檢定設計:沿用前一篇,只講新增的
三層基準(市場調整/無條件/配對對照)、randomization 產生 p 值、學生化 bootstrap 產生信賴區間、Benjamini–Hochberg FDR 校正 q = 0.10 —— 這些前一篇第 2 節都講過了,這裡不重複。
只講一個新增的決定:指標訊號自成一個 FDR 家族,與圖表型態的 354 格分開校正。
分開校正比較寬鬆,所以我把代價量化了:合併校正之後,0 格結論翻轉 —— 沒有任何一格由不顯著變顯著,也沒有任何一格由顯著變不顯著。
這裡有一個反直覺的地方值得記:合併校正不是一律更保守。 BH 方法的 q 值同時取決於分母與排名,把一批更顯著的格子併進來,可能讓某一格的 q 反而變小。所以「翻轉」要雙向檢查 —— 我第一版的檢查只看單向,是另一個 session 抓到的。
3. 結果
五個研究,全部是零:
| 研究 | 檢定格 | 可靠格 | 事件數 | 顯著 | 最小 q |
|---|---|---|---|---|---|
| 基礎訊號 | 2,205 | 2,150 | 1,736,601 | 0 | 0.100 |
| 打散對照 ★ | 2,205 | 2,152 | 1,739,467 | 0 | 0.138 |
| 日線 × 週線條件 | 2,940 | 2,929 | 1,408,828 | 0 | 0.224 |
| 日線 × 月線條件 | 2,940 | 2,940 | 1,407,717 | 0 | 0.163 |
| 週線 × 月線條件 | 2,940 | 2,807 | 276,985 | 0 | 0.294 |
★ 打散對照是把事件日期打散後重跑的煙霧測試 —— 它也是 0 格,代表流程不會把純雜訊當成發現。(前一篇的教訓:這個測試通過不代表方法對。第 4 節就是它抓不到的那一類問題。)
整體分布:
| 指標 | 值 |
|---|---|
| 中位 |效果量| | 0.30% |
| 第 90 百分位 |效果量| | 4.29% |
| 中位命中率 | 50.2% |
最接近顯著的一格,最小 q 是 0.100 —— 卡在門檻上,差 0.0002 沒過。這件事我等一下會回來談,因為它正是下一節那個錯誤的入口。
4. 我差點發表的 5 個假發現
這一節是這篇文章存在的理由。
前一篇的架構文件裡寫著一條規格:randomization 的重抽次數 B = 10,000。而實際跑的程式用的是 2,000。這是規格與實作對不上,屬於該修的東西 —— 於是我把它拉到規格要求的 10,000,重跑。
結果變了:
| 最小 q | 顯著格數 | |
|---|---|---|
| B = 2,000 | 0.100 | 0 |
| B = 10,000 | 0.0315 | 5 |
5 格通過了 FDR 校正。其中 4 個是費波那契回撤位(0.382 與 0.500 的支撐),另一個是布林上軌反轉。
這看起來完全像個發現。效果量不小(−3.5% 到 −7.4%),方向一致(都是負的,也就是「支撐位並不支撐」),而且費波那契是這批裡最有話題性的一種。如果我在這裡停下來報告,那會是一個很有說服力的錯誤。
擋下它的是對照組
我同時把打散對照組也用 B = 10,000 重跑了一次。那是虛無世界 —— 事件日期已經被打散,裡面定義上不可能有真發現。
| 最小 q | 顯著格數 | |
|---|---|---|
| 真實資料 | 0.0315 | 5 |
| 打散對照(虛無) | 0.0441 | 5 |
虛無對照組產生了一模一樣多的顯著格。經驗 FDR = 100%。
那 5 格不是發現,是方法的產物。
為什麼會這樣:抽越多次,精度越假
原因在 randomization 的做法。前一篇解釋過,虛無分布是靠「把所有事件整體平移同一個位移量」重建的 —— 這樣才能保留事件擠在同一天的結構(那正是前一篇修掉的錯)。
但整體平移有一個內建的上限:位移量只能取 1 到某個最大值之間的整數,所以相異的虛無實現數是有限的。 抽再多次,也只是把同樣那幾個實現重複抽出來。
實測:
| 重抽次數 | 相異的虛無實現 |
|---|---|
| 2,000 | 79.2% |
| 10,000 | 36.4% |
抽 10,000 次,其中只有 36.4% 是相異的。名目 p 值因此高估了 2.74 倍精度 —— 分母寫著 10,000,實際獨立資訊只有那個數字的三分之一多一點。p 值被算得太小,於是通過了門檻。
這是一個違反直覺的結論:重抽次數越多,答案越糟。 一般的統計直覺是「多抽幾次只會更準」,在這個特定的虛無模型下不成立。
所以規格本身是錯的:B = 10,000 對這種 randomization 而言是錯誤的規定,而我照著做,反而製造出了假發現。 已改回 2,000 並修正規格文件(bootstrap 的 10,000 不受影響,那是另一種重抽)。
這是同一類問題的第二次
前一篇第 6 節記錄了一個被推翻的中間結論:16 格顯著,全部來自虛無分布建構錯誤(事件叢聚被打散,分布窄了 2.63 倍)。
這一次是另一個機制 —— 相異實現數不足,名目精度虛高 —— 但屬於同一類:
虛無分布本身建構錯誤時,報表上每一個數字都看起來正常,而且煙霧測試會通過。
兩次都是這樣。兩次都不是資料的問題、不是訊號定義的問題、也不是偷看未來,而是「拿來比對的那把尺」出了問題。
而兩次抓到它的方式也一樣:不是靠測試,是靠去量那把尺本身。 第一次是量虛無分布的寬度,這一次是數相異實現的比例。
如果這篇文章只留下一句話,我希望是這句:當你的方法產生了一個發現,先讓同一套方法跑一次不可能有發現的資料。
5. 結果的形狀:微弱、瀰漫、無法歸因
有了打散對照組當經驗虛無,就可以做一件單看零結果做不到的事:看看在較寬鬆的門檻下,真實資料相對虛無有沒有超額。
| 門檻 | 真實 | 虛無 | 超額 | 經驗 FDR |
|---|---|---|---|---|
| q ≤ 0.10(預先登錄) | 0 | 0 | 0 | — |
| q ≤ 0.20 | 43 | 8 | 35 | 19% |
| q ≤ 0.50 | 387 | 9 | 378 | 2% |
| p ≤ 0.001 | 14 | 9 | 5 | 64% |
| p ≤ 0.01 | 74 | 19 | 55 | 26% |
| p ≤ 0.05 | 258 | 66 | 192 | 26% |
真實資料確實比虛無多。 在 q ≤ 0.20 的門檻下多出 35 格,在 p ≤ 0.05 下多出 192 格。這不是零。
但要非常小心地讀它:
第一,門檻是凍結的,我沒有動它。 主結論一律以事前登錄的 q = 0.10 為準。上面這張表只用來理解結果的形狀,不能用來挑門檻 —— 「換個門檻就有發現了」正是這整套方法要防的東西。
第二,這個超額無法歸因到任何單一訊號類型。 它不集中在費波那契、不集中在均線、不集中在任何一個家族或週期。它是瀰漫的。
第三,也是最重要的:這個形狀反過來說明檢定不是瞎的。 如果這套方法什麼都看不到,真實資料與打散資料在每一個門檻下都應該長得一樣。它們不一樣。所以機器有鑑別力,只是那個訊號弱到跨不過事前定好的那條線。
我對這個形狀的解讀是:如果真的有東西,它比較像「市場裡有一層很薄的、到處都在的可預測性」,而不是「某個訊號有效」。而那層東西薄到什麼程度?薄到中位命中率 50.2%、中位效果量 0.30%,而且在扣掉交易成本之前。
6. 這個零有多可靠
一個測不出東西的檢定,和一個沒有東西可測的世界,報表長得一樣。前一篇是用效果量注入實測回答的:注入 1% 的效果,偵測率 100%。
這一篇沒有重跑那個實測,所以我不會宣稱同樣的數字。 能講的有三件事,強度不同:
一、樣本規模遠大於前一篇。 dev 期 1,779,160 個事件,中位可靠格的樣本數以萬計。同樣的效果量在更大的樣本下更容易被偵測到。
二、但樣本數不能直接換算成檢定力。 指標訊號的事件密度比圖表型態高兩個數量級以上,持有期大量重疊,有效樣本數遠低於名目樣本數。序列相依由 bootstrap 與整體平移處理了,重疊本身仍然降低檢定力。
三、而且有跡象顯示這套檢定偏保守。 打散對照組的 p 值中位數是 0.606(若完全隨機應該是 0.5),p < 0.05 的比例只有 3.02%(名目應該是 5%)。方向是安全的 —— 少報假陽性 —— 但也代表實際檢定力低於名目值。
所以誠實的說法是:這個零站得住,但它站的位置比前一篇那個零軟一點。 前一篇有實測的檢定力曲線,這一篇沒有;這一篇有的是大樣本、以及第 5 節那個「機器看得見東西、只是不夠強」的間接證據。
要把它補成硬的,就得對這批訊號重跑一次效果量注入實測。那是下一步該做的事,不是這篇文章能宣稱的事。
7. 這證明了什麼、沒證明什麼
一、範圍還是有限的,只是比上一篇寬。 這次測的是 49 類機械化定義的訊號、一組凍結參數、在 S&P 500 大型股、日/週/月三種週期上帶不帶資訊。不同的參數、不同的訊號定義、不同的市場或資產類別,結論都可能不同。
二、也還是沒有測「實用性」。 測的是資訊含量。沒有交易成本、沒有滑價、沒有部位大小、沒有風險控制。前一篇那句話這裡照樣成立:「測不到資訊」和「拿來交易會賠錢」是兩件不同的事。
三、把兩篇加起來,涵蓋範圍是這樣: 九類圖表型態 + 49 類指標與訊號 + 多週期條件,合計 11,379 個檢定格,通過事前登錄門檻的有 0 個。這是我目前能講的最寬的一句,而它離「技術分析無效」仍然有距離 —— 那是一個關於人怎麼綜合判斷的命題,而這裡測的全部是單一規則。前一篇第 7 節整節在講這個差別,這裡不重複。
如果你只想引用一句
49 類機械化定義的技術訊號,在 2000 到 2017 年的 S&P 500 大型股上,控制掉大盤漂移、個股特性與同期同類股之後,沒有任何一類在事前登錄的門檻下顯示可辨識的資訊。
不要簡化成「KD 沒用」「均線沒用」—— 測的是特定定義下的特定規則,不是那些工具的所有用法。也不要簡化成「技術指標不能賺錢」—— 本研究沒有測賺不賺錢。
這份研究本身的問題
- 倖存者偏誤。 yfinance 缺下市股,985 檔宇宙裡只有 674 檔有價格資料。結論偏向活下來的公司,方向是讓訊號看起來更有效。
- 檢定力未實測(見第 6 節)。這一版沒有重跑效果量注入。
- 訊號密度高、持有期重疊嚴重,有效樣本數低於名目值。
- 燭台型態的背景定義有主觀性。 錘子和吊人是同一個形狀,靠「前五根收盤的淨變動」區分方向。這個定義寫在凍結的設定檔裡,但它不是唯一合理的定義。
- 費波那契綁定在 ZigZag 參數上(見第 1 節)。
- 沒有計入交易成本。
- 資料商會回頭修訂歷史資料。
最終保留樣本仍然沒有動用
2022 年以後的資料整段鎖住,整個專案只能開一次,由程式強制執行。開發期 0 格顯著,代表沒有任何候選項可以拿去做最終檢驗,所以那一次機會沒有被消耗。
和前一篇一樣要講精確:訊號偵測本身跑遍全區間(訊號是價格的確定性函數,不碰前向報酬),被鎖住的是統計層。真正的防線仍然是參數在統計之前就凍結。
8. 為什麼這篇的重點是那 5 格
回頭看,這篇文章有兩個結果。
一個是預期中的: 49 類訊號、11,025 格、0 個通過。它與弱式效率市場假說一致,不意外,也不特別有趣。
另一個不是: 在得到那個零之前,同一套資料、同一個人、同一個下午,先得到了 5 個顯著發現,其中 4 個是費波那契。它們全部是假的。而它們之所以出現,不是因為我偷懶,恰恰相反 —— 是因為我把一個對不上規格的地方改成符合規格。
這件事的教訓不是「規格會錯」,而是更麻煩的一件:你沒辦法靠更用功來避開這一類錯誤。 那 5 格通過了所有既有的檢查:煙霧測試通過、參數凍結、沒有偷看未來、多重檢定校正做了。它們是在方法內部產生的。
唯一擋下它們的,是一個嚴格來說不必跑的東西 —— 拿同一套方法去跑一份不可能有發現的資料,看它會不會也「發現」什麼。
那個習慣不會讓你找到有效的方法。它只會在你以為自己找到的時候,告訴你沒有。
而在這個領域裡,那是更值錢的一件事。
研究區間 2000 年 1 月 1 日至 2017 年 12 月 31 日,對象為當時實際在 S&P 500 成分股名單內的個股,日線、週線與月線。所有數字由分析程式從原始結果檔重新計算產生,未經人工轉錄。
免責聲明
本網站內容由 Elnath Finance Academy 製作,僅供一般性資訊與教育目的,不構成投資建議,也不是針對任何個別讀者的個人化推薦。Elnath Finance Academy 並非註冊投資顧問(RIA),亦不提供受監理的投資顧問服務。所有數據與分析可能存在延遲或誤差,過往表現不代表未來績效。投資涉及風險,可能損失本金;任何投資決策請自行判斷並諮詢合格的專業人士。