買下 tick 模型,卻忽略 tick 來源
模型只是下拉選單裡的一行,來源卻是另一個完全不同市場的紀錄。在上面那次 GBP/JPY 執行中,更換來源付出了 0.22 的獲利因子並讓回撤翻倍,而在同一份來源上升級到真實 tick 只付出 0.02。一個寫明模型卻不寫明供應商的商品頁,告訴你的是比較小的那一半。
Tick 資料是某個商品每一次單獨價格變動的紀錄——每一筆都帶著自己的時間戳記與買賣報價——也正是 MT5 在「以真實 tick 為基礎的每個 tick」模式下重播的東西,而不是自行在 K 棒之間編造一條路徑。
亦稱:tick 歷史, 真實 tick 資料
更新於 · 審閱於
K 棒資料每根 K 線只留下四個價格:開、高、低、收。Tick 資料留下的是它們之間的一切——每一次價格變動,依序排列,並帶著那一刻實際存在的點差。只有當一筆交易在同一根 K 棒之內開倉又平倉時,兩者的差距才真正決定什麼,而那裡正好就是多數 EA 行銷居住的地方。
回測只能交易你交給它的價格。K 棒資料交給測試器的是每根 K 線四個價格,然後任由它自行編造中間的路線,因此任何在 K 棒之內進出的策略,交代的都是一條沒有人記錄過的路徑。Tick 資料把編造換成紀錄。接著我們自己的執行又補上一個令人不安的第二個發現:你從哪裡取得這些 tick,對結果的影響遠大於把編造的 tick 換成記錄下來的 tick。
一個 EA、一個區間、三次執行。TidewellSlack 在 M15 上自 2019-01-01 起交易 GBP/JPY,我們用三種方式跑它,把商品頁慣常混為一談的兩件事拆開來看:tick 從哪裡來,以及測試器是重播它們還是編造它們。
三次執行中有兩次沒有通過本站自己的關卡,而活下來的那一次跑的是產生式 tick。這就是為什麼商品頁公布的是它的商品名稱與模型編號,而不是「真實」這個形容詞。
計算 更換來源:獲利因子 −0.22,回撤 +8.26 個百分點。在此之上再升級到真實 tick:−0.02 與 +0.02。
結果 資料來源把結果推動的距離,是 tick 模型的十一倍
讀 tick 資料時,先對照持倉時間,再對照資料來源。目標相對於 K 棒越細,結果中由路徑決定的部分就越多——但來源決定了這個結果有多少能被帶到別的地方去。
| 區間 | 含義 |
|---|---|
| 日內或剝頭皮 EA,真實 tick,且點名了供應商 | 站得住腳的情形。路徑被記錄下來,陌生人光憑商品頁就能重建這次執行。 |
| 多日持倉的波段系統,跑在由 K 棒產生的 tick 上 | 通常足夠。一根 K 棒的內部路線,很少決定一筆持有一週的交易。 |
| 真實 tick,但只有單一來源 | 只是半個答案。本站的 GBP/JPY 執行在一個來源上通過,在另一個來源上卻以相同規則、相同區間失敗。 |
| 宣稱「真實 tick」,卻沒有供應商也沒有模型編號 | 無從查核,而缺席的這兩個欄位,恰好就是決定那個數字的兩個。 |
本站公開的 23 次執行中,十一次使用模型 4,十二次使用模型 0,而每一次模型 4 的執行,商品名稱都帶著 `_DUKA` 後綴,因為匯入的 tick 只能住在自訂商品上。那十一次裡有十次,運行清單的價格來源欄位仍然寫著經紀商的 M1 歷史,那是它們遷移出來的血統留下的殘餘。讀模型編號與商品名稱;圍繞在它們周圍的文字老得快得多。
模型只是下拉選單裡的一行,來源卻是另一個完全不同市場的紀錄。在上面那次 GBP/JPY 執行中,更換來源付出了 0.22 的獲利因子並讓回撤翻倍,而在同一份來源上升級到真實 tick 只付出 0.02。一個寫明模型卻不寫明供應商的商品頁,告訴你的是比較小的那一半。
這個百分比量的是歷史對受測區間的涵蓋有多完整,而不是由哪一個模型產生。KestrelHover 背後那次模型 0 的影子執行印出 100%——與它真實 tick 的同胞執行印出的是同一個數字。一個兩種模型都能達到的數字,無法用來分辨它們。
在模型 4 上,測試器以 tick 檔案自己的賣價減買價成交,完全不理會這個欄位;把同一個 USD/JPY 測試以 `Spread=10` 跑一次、再以 `Spread=100` 跑一次,得到的逐筆點差完全相同。這項設定在執行中什麼都沒有改變,卻悄悄改變了作者相信這次執行量測了什麼。
在一個 tick 自 2019 年才開始的來源上從 2015 年起測試,會把早期年份插值出來、把後期年份重播出來,再把兩者當成單一結果回報。Ticks 分頁會說明它持有的範圍;測試器永遠不會警告你,你的區間超出了它。
它們填平的是價格那一半,成交那一半原封未動。延遲、重新報價、部分成交以及經紀商的政策都留在模擬之外,所以一次真實 tick 的執行,依然是對成交結果的一份樂觀說法——只不過這份樂觀說法,是建立在一條真正發生過的路徑之上。
| TidewellSlack — GBP/JPY,M15,自 2019-01-01 起 | 交易筆數 | 獲利因子 | 最大回撤 | 歷史品質 | 本站關卡 |
|---|---|---|---|---|---|
| 經紀商 M1 歷史,模型 0(Model 0,已公開) | 303 | 1.35 | 9.92% | 99% | PASS |
| 匯入的 tick,模型 0 | 351 | 1.13 | 18.18% | 99% | FAIL |
| 匯入的 tick,模型 4(Model 4)真實 tick | 345 | 1.11 | 18.20% | 100% | FAIL |
第一列到第二列只改了資料,其他一律不動:相同規則、相同區間、相同測試器模型。 獲利因子掉了 0.22,回撤大致翻倍。第二列到第三列只改了模型,其他一律不動—— 把產生式 tick 升級成同一份封存檔裡記錄下來的真實 tick——獲利因子掉了 0.02, 回撤只動了 0.02 個百分點。兩列匯入 tick 的執行都沒有通過本站關卡;活下來的 那一次,跑的是產生式 tick。
這個先後順序並非放諸四海皆準,而這正是誠實的那一部分。KestrelHover 走的是另一個方向:真實 tick 上 291 筆交易、獲利因子 1.33,對上經紀商產生式 tick 上的 292 筆交易與 1.30,而且兩次執行都通過了。有時候來源就是全部的故事,有時候 它只是雜訊——而你只有跑第二次才會知道是哪一種。把 TidewellSlack 的商品頁與那一頁擺在一起讀,道理自己就會浮出來。
本站公開的 23 次執行中,十一次使用模型 4,十二次使用模型 0。每一次模型 4 的執行,
交易的商品名稱都以 _DUKA 結尾,因為匯入的 tick 無法住在經紀商自己的商品上——
你要在商品視窗裡建立一個自訂商品,再把封存檔匯入其中。本目錄裡沒有任何一個
經紀商原生商品曾經跑到真實 tick 模型,這就是那麼多公開回測不使用它的實際原因:
模式是免費的,它背後的庫存不是。
這也打破了「相信一個百分比」這種常見的捷徑。KestrelHover 背後那次模型 0 的影子 執行印出 100% 歷史品質,與它真實 tick 的同胞執行印出的數字一模一樣,所以這個 數字分不出兩者。建模品質回答的是另一個 問題——歷史對受測區間的涵蓋有多完整——而且它對兩種模型都給得出答案。
Tick 資料的第二份禮物是記錄下來的買價與賣價,而它也是最常被丟掉的一份。在模型 4
上,測試器以每一筆 tick 自己的賣價減買價來成交,並忽略你設定的點差:把同一個
USD/JPY 測試分別以 Spread=10 與 Spread=100 跑一次,得到的逐筆點差完全相同,
共有 227 個不同的數值,範圍從 10 點到 350 點。這個欄位看起來像個控制項,行為
卻像個註解。
幾乎也沒有人量測由此產生的成本。本站 23 次執行中,恰好只有一次寫出了量測到的 平均點差——19.14 點,在測試器內部記錄——而那一次用的是模型 0,不是真實 tick。 所以對多數真實 tick 主張(包括我們自己的好幾次)誠實的讀法是:路徑被記錄下來了, 走完這條路的成本卻從來沒有被加總。