海龜策略 Turtle 實戰:Python 重建經典突破系統,四重改良與 319% 回測拆解|Quant Strategies Ep 4 筆記
第 4 課・共 18 課
目錄
海龜交易系統 Turtle Trading 大概是交易史上最著名的實驗:1983 年 Richard Dennis 與 William Eckhardt 為了證明「出色交易員可以後天培養」,把一套完整的突破進出場規則教給一群素人,讓他們用真錢操作。Algo-trading with Saleh 的 Saleh 在這條片中,用 ChatGPT o1 當「規則顧問」,把這套四十年前的系統用 Python 在 Jesse 框架上重建。標題上的「319%」是他特定設定下(BTC-USDT 永續合約、1 小時圖、2022 至 2024 年、倉位乘 1.8 倍再加參數優化後)的回測教學案例數字,並非實盤成績。
學習重點
- 海龜規則核心:價格升穿過去 20 日最高價買入、跌穿 20 日最低價沽空,即唐奇安通道突破;倉位以 ATR 反推,每單風險為本金 1% 至 2%(講者慣用 3%)。
- 程式陷阱一:計算通道時必須剔除當前未收市的 K 線,否則上軌會隨新高同步上移,突破訊號永遠追不上軌道。
- 程式陷阱二:追蹤止蝕只可向有利方向移動——每根 K 線收市後,新止蝕價與舊止蝕價取較優者,否則止蝕會越移越遠、永不觸發。
- 三重過濾逐次疊加:4 小時圖 200 期 SMA 定大方向、ADX 高於 30 確認趨勢強度、Choppiness Index 低於 40 剔除橫行市;最大回撤由 -43% 逐步壓至 -13%。
- 319% 的由來:未槓桿前淨盈利約 40%,倉位乘 1.8 倍後升至 106%,再經事後參數優化才達 319%(最大回撤 -18%)——是槓桿與優化的合成結果。
詳細筆記
海龜規則速覽
先補充歷史背景:當年 Dennis 相信交易可以拆解成一套規則傳授,Eckhardt 則認為交易天賦與生俱來,兩人於是登報招募學員,用兩星期授課後發放真實資金操作——這批學員被戲稱為「海龜」(取意於新加坡養龜場,寓意交易員可以像養龜一樣批量培養)。這個實驗之所以成為經典,在於它證明了一套完全機械化的規則確實可以複製,這也是海龜系統特別適合程式化的原因。
Saleh 第一步不是寫碼,而是直接問 ChatGPT o1:海龜策略的進出場、止蝕止盈規則是甚麼。得到的答案與文獻記載一致。進場方面,買入訊號是價格升穿過去 20 日的最高價,沽空訊號是跌穿過去 20 日的最低價——講者隨即點出,這正是 唐奇安通道 Donchian Channel 的定義(通道基礎詳見突破策略|第 15 課)。規則還有一條「免重進」條款:若上一次突破訊號理論上會帶來盈利,便跳過下一個訊號,藉此過濾假突破——邏輯是「上一個訊號已經捕捉到趨勢的話,市場多半已在趨勢中段,此刻追入值博率偏低」。
倉位方面,海龜用 平均真實波幅 ATR(他們稱之為 N)計算每單倉位,將每宗交易的風險鎖定在本金的 1% 至 2%;這種「以波幅定注碼」的思路,令波動大的市場自動減注、波動小的市場自動加注,是整個系統的風險管理核心。Saleh 表示自己一向用同一方法,只是風險百分比慣用 3%。出場方面,GPT 給的答案是海龜有兩套系統:「系統一」屬短線版本,價格跌穿過去 10 日最低價時離場;「系統二」屬長線版本,離場通道放寬至 20 日,換取更長的持倉時間。止盈則用 追蹤止蝕 Trailing Stop——隨著倉位浮盈擴大,止蝕單跟隨上移,與持倉以來最高價保持 2N(即兩倍 ATR)距離,淡倉則與最低價保持同樣距離,直至回撤觸及離場。換言之,海龜系統沒有固定止盈目標,理念是「讓利潤奔跑」,用大趨勢的盈利覆蓋大量小額虧損。Saleh 在本片採用的正是追蹤止蝕版本,而非固定的 10 日通道離場。
程式陷阱一:通道要剔除當前 K 線
在 Jesse 框架建立 TurtleAI 策略類別後,講者先在 TradingView 展示唐奇安通道的形態:預設周期 20,上軌是過去 20 根 K 線最高價、下軌是最低價,價格創新高時上軌會同步跳升。這帶來一個實作難題——若把當前 K 線也算進通道,當價格正創新高時,上軌已被這根 K 線「頂住」上移,價格 > 上軌 幾乎永不成立。解決方法有兩個:一是用 sequential=True 取整個陣列再取前一個值;二是更乾脆的做法——計算時直接不傳入最後一根 K 線(摘錄自原片教學):
@property
def donchian(self):
# self.candles[:-1]:只取到上一根 K 線,剔除當前未收市的一根
return ta.donchian(self.candles[:-1], period=20)
入場規則隨後寫成:當前價格高於通道上軌即開好倉,低於下軌即開淡倉,全部用市價單。講者順帶提到一個 Jesse 框架的細節:should_cancel_entry 方法填甚麼都可以——因為市價單即時成交,不存在「未成交掛單需要取消」的情況;只有用限價單或止蝕掛單入場時,這個方法的返回值才有實際作用。

截圖出自原片(Algo-trading with Saleh):Jesse 回測圖表上繪出的唐奇安通道上軌(upperband)與下軌(lowerband),可見突破點與成交標記。
倉位、止蝕與追蹤止蝕的實現
開倉函數以當前價為入場價,止蝕設於入場價減 2.5 倍 ATR(講者強調 2.5 這個倍數是他個人經驗值),倉位數量用 Jesse 的 risk_to_qty 以可用保證金、3% 風險、入場價、止蝕價與交易所費率反推(摘錄自原片教學):
def go_long(self):
entry = self.price
stop = self.price - ta.atr(self.candles) * 2.5
qty = utils.risk_to_qty(self.available_margin, 3,
entry, stop, fee_rate=self.fee_rate)
self.buy = qty, entry
止蝕單在 on_open_position 事件內、倉位一開便提交,淡倉方向鏡像(加 2.5 倍 ATR)。止盈則按 GPT 的建議用追蹤止蝕實現:Jesse 的 update_position 方法會在每根 K 線收市時執行一次,正好用來逐步收緊止蝕。而這裏藏着本片第二個程式陷阱。Saleh 先示範了錯誤寫法:每根 K 線收市便在 update_position 裏無條件重設止蝕——問題是若價格回落、倉位處於虧損,新算出的止蝕價會比舊的更低,止蝕越移越遠,永遠觸發不了。正確做法是「只許向有利方向移動」:好倉取新舊止蝕價的較高者、淡倉取較低者(摘錄自原片教學):
def update_position(self):
if self.is_long:
new_stop = self.price - ta.atr(self.candles) * 2.5
self.stop_loss = self.position.qty, max(self.average_stop_loss, new_stop)
elif self.is_short:
new_stop = self.price + ta.atr(self.candles) * 2.5
self.stop_loss = self.position.qty, min(self.average_stop_loss, new_stop)

截圖出自原片(Algo-trading with Saleh):update_position 內以 max(好倉)與 min(淡倉)比較新舊止蝕價,確保追蹤止蝕只收緊、不放寬。
首輪回測與三重過濾
回測設定:Jesse 平台、BTC-USDT、1 小時圖、2022 年初至 2024 年初,同時開啟基準對照,可直接比較策略與同期買入持有的分別。首輪結果講者評為「不算差」——2022 年熊市段表現頗佳,因為沽空訊號能在跌市中持續獲利;但最大回撤 -43% 難以接受,勝率只有 30%。他的解讀是:單一指標很少交出最佳成績,必須疊加過濾器剔除差勁交易,把回撤與波動壓下來。他於是回頭問 GPT 還可加甚麼過濾器,得到一張清單:SMA、RSI、MACD、ADX、布林帶、OBV、支持阻力位。Saleh 逐個試後坦白匯報:RSI「表現極差」、MACD 與布林帶無幫助、支持阻力在程式化交易裏不實用;真正有效的是以下三重。
第一重是大時間框架均線:用 get_candles 取 4 小時圖 K 線,計算 200 期 簡單移動平均線 SMA,價格在其上方才開好倉、下方才開淡倉。重跑後回測淨盈利 37%、開始跑贏同期 BTC 基準,最大回撤降至 -26%,勝率 33%。講者特別補充:趨勢跟蹤策略勝率低於五成完全正常,關鍵是平均盈虧比要大於一——此時為 2.21,相當健康。
第二重是他的慣用濾網 平均趨向指數 ADX:高於 30 才開倉。重跑後淨值曲線明顯平滑,回撤再降,勝率升至 38%。第三重其實是一個行為修正:他把通道上下軌繪上圖表後,親眼看到平倉當根 K 線因價格已跌破下軌,策略立即反向再開一倉,有時後果很差。於是他記錄上次平倉的 K 線序號(last_closed_index),規定 當前序號 − 上次平倉序號 > 0 才准再入場——即平倉後至少隔一根 K 線。單是這項改動,盈利上升、回撤下降,其餘數字不變。
Choppiness Index 與 319% 的由來
此時 Saleh 仍不滿意,改用完整版 o1 模型再問一次相同的問題。完整版的答案與預覽版大同小異,唯獨多了一個他從未聽過的建議:波動雜亂指數 Choppiness Index——量度市況是橫行整固還是單邊趨勢的冷門指標,數值高代表雜亂、低代表有趨勢,正好是突破策略最需要的過濾器(ADX 用途相近,兩者互為補充)。用法亦很直覺:CHOP 高企時避開所有突破交易,因為市場大概率仍在區間內反覆;CHOP 低企時才視為趨勢階段,放行突破訊號。他加入「CHOP 低於 40 才開倉」,重跑後最大回撤由 -20% 壓到 -13%,勝率升至 40%,平均盈虧比 2.49,夏普比率 1.05。
回撤降低隨即觸發下一步:既然同一策略的回撤由 -20% 變成 -13%,他把倉位數量乘以 1.8(即使用槓桿),在回撤回到原先水平的同時,淨盈利由約 40% 跳升至 106%。片尾他再透露:之後繼續調校參數做了一輪優化,把成績由 106%(回撤 -22%)推至最終的 319%、最大回撤 -18%——即標題的數字。回測摘要顯示:730 日(兩年)、136 宗已平倉交易。免費版與優化版源碼均上載至其頻道的策略庫,屬推廣內容,本筆記不轉載。

截圖出自原片(Algo-trading with Saleh):最終版淨值曲線(紫)對照 BTC-USDT(黃),回測期 730 日、136 宗交易,Total Net Profit 319.01%。
🙏 覺得內容有用?本站所有內容免費提供,使用推薦碼開戶就是支持我們繼續營運的最大鼓勵:
ZA Bank 邀請碼 P20923
—— 你享 HKD 2,000 迎新獎賞,本站獲得營運支持。
立即開戶 →
(聯盟連結|投資涉及風險,受條款及細則約束,此資料僅可於香港境內分發)
MT5 可行性速評
| 項目 | 評估 |
|---|---|
| 邏輯可移植性 | 高。唐奇安通道可用 iHighest/iLowest 對前 20 根 K 線(從序號 1 起,剔除當前 K 線)合成上下軌;ATR(iATR)、ADX(iADX)、4 小時 200 期 SMA(對 PERIOD_H4 開 iMA 句柄)全屬內建指標;ATR 倉位反推與追蹤止蝕是標準 EA 寫法。 |
| 平台限制 | Choppiness Index 無內建指標,須自寫(公式只需 ATR 總和與期內高低幅,約十餘行);「同 K 線不再入場」要用全域變數記錄上次平倉的 bar 時間;BTC 永續合約亦非一般 MT5 券商標的,移植後 2.5 倍 ATR、3% 風險等參數須重新驗證。 |
| 評級 | ✅ 海龜核心邏輯(通道突破+ATR 倉位+追蹤止蝕)結構簡單、全部可用內建函數實現,是本系列中最易移植的一課;唯一要自寫的 CHOP 亦非難事。 |
| MQL5 寫法提示 | 見下 |
int hi = iHighest(_Symbol, PERIOD_CURRENT, MODE_HIGH, 20, 1); // 剔除當前 K 線
double upper = iHigh(_Symbol, PERIOD_CURRENT, hi);
int atr_h = iATR(_Symbol, PERIOD_CURRENT, 14);
int adx_h = iADX(_Symbol, PERIOD_CURRENT, 14);
int sma_h = iMA(_Symbol, PERIOD_H4, 200, 0, MODE_SMA, PRICE_CLOSE);
// 好倉條件:Close[0] > upper && Close_H4 > SMA200 && ADX > 30 && CHOP < 40
// 止蝕 = entry - 2.5 * ATR;追蹤時新舊止蝕取較高者(好倉)
注意:即使移植成功,MT5 策略測試器跑出的回測同樣會過度擬合——20 日通道、2.5 倍 ATR、ADX 30、CHOP 40、1.8 倍倉位全是看著結果調出來的參數,換平台不解決方法論問題。
欣利克的看法
- 防坑檢查一:319% 的構成要拆三層看。第一層是訊號本身:三重過濾齊備後,未槓桿的淨盈利只有約 40%(兩年)。第二層是槓桿:倉位乘 1.8 倍後升至 106%,回撤同步放大。第三層是事後參數優化:由 106% 推至 319%,這一層的擬合成分最高。把優化後的讀數當策略實力,是回測影片最常見的講法陷阱。
- 防坑檢查二:低勝率是特性,不是缺陷。片中勝率由 30% 逐步升至 40%,始終低於五成;盈利全靠 2.2 至 2.49 的平均盈虧比。這意味實際操作時會長時間連續小虧,利潤集中在少數大趨勢——回測報表看不到的心理壓力,才是這類系統最難執行的部分。
- 防坑檢查三:年代與市場差異。1983 年海龜交易員用的是日線、期貨市場、20 日與 55 日雙周期突破;本片是 1 小時圖的加密貨幣永續合約,參與者結構、流動性與成本完全不同。截至 2026 年中,市場與 1980 年代更不可同日而語,原始參數不能直接照搬。
- 值得學的工程細節:本片最有價值的不是結果,而是兩個實作陷阱的示範——通道剔除當前 K 線、追蹤止蝕只許向有利方向移動;以及講者坦白匯報 RSI、MACD、布林帶「試過無效」的誠實態度。失敗的過濾器與成功的一樣有資訊價值。
- 時效提醒:回測期為 2022 年初至 2024 年初,涵蓋一輪加密貨幣熊市與復甦;截至 2026 年中,費率、流動性與市場結構已有變化,片中任何數字都不代表當前條件。本文僅為學習記錄,不構成任何買賣建議。
名詞解釋
- 海龜交易系統 Turtle Trading:1983 年 Richard Dennis 實驗中教授的機械式趨勢跟蹤系統,以通道突破進出場、ATR 計算倉位。
- 唐奇安通道 Donchian Channel:由過去 N 根 K 線最高價與最低價構成的通道;海龜規則的進場訊號即其 20 周期突破。
- 平均真實波幅 ATR:量度每根 K 線平均波動範圍;海龜稱之為 N,用於倉位計算與止蝕距離。
- 追蹤止蝕 Trailing Stop:隨浮盈擴大而單向收緊的止蝕單;本策略以此取代固定止盈,讓倉位跟隨趨勢。
- 簡單移動平均線 SMA:固定窗口的收市價平均;本片用 4 小時圖 200 期 SMA 作大方向過濾。
- 平均趨向指數 ADX:量度趨勢強度而不分方向;本片要求高於 30 才開倉。
- 波動雜亂指數 Choppiness Index:量度市況雜亂程度,數值低代表有趨勢;本片要求低於 40,是壓低回撤的關鍵過濾器。
- 勝率 Win Rate:盈利交易佔總交易的比例;趨勢跟蹤策略長期低於五成屬正常現象。
- 最大回撤 Drawdown:淨值由高位回落的最大幅度;本片由 -43% 逐步壓至 -13%,再因槓桿回升至 -18%。
- 夏普比率 Sharpe Ratio:每單位波動換取的超額回報;加入 CHOP 過濾後為 1.05。
- 突破 Breakout:價格升穿重要阻力位或區間頂部的走勢;海龜系統的核心訊號類型。
- 倉位規模 Position Sizing:決定每宗交易注碼的方法;本片以 3% 風險與止蝕距離反推數量。
- 過度擬合 Overfitting:策略過度遷就回測數據的噪音;319% 經事後參數優化得出,屬高風險案例。
常見問題 FAQ
海龜策略的進出場規則是甚麼?
進場用唐奇安通道突破:價格升穿過去 20 日最高價買入,跌穿 20 日最低價沽空,並設「免重進」條款——上次突破若理論上會獲利,便跳過下一個訊號。出場方面,短線系統在價格跌穿過去 10 日最低價時離場,止盈用追蹤止蝕,與持倉以來的最高價保持 2 倍 ATR(海龜稱 2N)距離。倉位以 ATR 反推,每單風險鎖定在本金 1% 至 2%。整套規則可以完全機械化執行,正是它適合程式化的原因。
為何趨勢跟蹤策略勝率低於五成仍可以盈利?
盈利與否取決於期望值,而非勝率。趨勢跟蹤的設計是「截斷虧損、讓利潤奔跑」:大部分交易在假突破後小額止蝕,少數交易抓住大趨勢賺取數倍於虧損的利潤。片中的數字正是如此——勝率 40%,但平均盈利是平均虧損的 2.49 倍,長期期望值仍為正。代價是要承受長時間連續小虧的心理壓力,這也是當年海龜實驗強調紀律多於訊號的原因。
319% 的回測報酬可以當真嗎?
數字屬回測教學案例,構成要拆三層:訊號本身在 2022 至 2024 年 BTC-USDT 1 小時圖上賺約 40%;倉位乘 1.8 倍槓桿後升至 106%;再經事後參數優化才達 319%(最大回撤 -18%、136 宗交易)。所有參數——20 日通道、2.5 倍 ATR、ADX 30、CHOP 40、1.8 倍倉位——都是看著回測結果調校,影片亦無樣本外驗證,未來能否重現並無保證。
Choppiness Index 與 ADX 有何分別?為何兩個都要?
兩者角度不同、方向相反。ADX 量度趨勢強度,數值高代表趨勢強(不分升跌);Choppiness Index 量度走勢雜亂程度,數值高代表橫行反覆、低代表單邊。講者的邏輯是雙重確認:既要趨勢夠強(ADX > 30),又要市況不雜亂(CHOP < 40),同時成立才開倉。本片的最大回撤正是靠 CHOP 由 -20% 壓至 -13%。當然,兩個閾值都是可調參數,條件越多,擬合回測數據的風險越高。
原影片
本文整理自以下影片,版權屬原創作者所有,建議配合原片觀看: