AI 寫策略實測:ChatGPT o1 趨勢跟蹤策略由偽代碼到 Jesse 回測 432%|Quant Strategies Ep 3 筆記
第 3 課・共 18 課
目錄
用 大型語言模型 LLM 寫交易策略,大概是近年量化圈最熱門的實驗方向。Algo-trading with Saleh 的 Saleh 在這條片中,用 OpenAI 當時新推出的 o1-preview 模型(2024 年 9 月發布、標榜博士級推理能力)設計一套 BTC-USDT 趨勢跟蹤策略,再在 Jesse 框架上回測。標題的「432%」是他特定設定下(幣安永續合約、4 小時圖、2022 年初至 2024 年 7 月、倉位乘三倍後)的回測教學案例數字,並非實盤成績。
學習重點
- 提示工程心得:直接叫 AI「寫個趨勢策略」幾乎必然得到廢物;要列明進出場訊號、基線指標、確認指標、橫行市過濾、倉位與止蝕止盈的計算方式,才有可用輸出。
- 兩步工作流:先叫 o1 寫偽代碼 Pseudocode 規格,再交給他預先訓練的自訂 GPT 轉成 Jesse 語法——因為通用模型不熟悉小眾框架的 API。
- AI 生成碼絕對不能直接用:本片示範五個連環錯誤(策略命名、缺
@property、交易所名寫死、MACD 屬性名、漏寫淡倉函數),全部要人工逐個修正。 - 四步人工調校:交易時間框架由 1 小時改 4 小時、大趨勢框架改 6 小時、ADX 閾值由 25 收緊至 40、倉位乘三倍——成績由虧損逐步推至 +432%(最大回撤 -31%)。
- 432% 的構成:4 小時版未過濾前約 +60%,收緊 ADX 後 +87%,最後靠三倍倉位加全倉複利放大——槓桿與複利效應佔了增幅的大頭。
詳細筆記
為何先要偽代碼,而非直接要 Python
Saleh 頻道本身有提供一個自訂 GPT(在 GPT Store 搜「Jesse」可找到),專門把交易想法轉成 Jesse 框架接受的語法;但當時自訂 GPT 尚未支援 o1-preview 模型,他想試的正是 o1 的推理能力,於是改為兩步走:先在普通對話叫 o1 寫偽代碼,再把偽代碼貼給自訂 GPT 轉碼。
他坦白說,第一版的簡單提示——「幫我寫一個趨勢跟蹤演算法策略的偽代碼」——試過無數次,輸出幾乎全部不堪用。直到他把要求逐項列明,質素才達到可用水平。這段提示工程的要求值得逐條記下:
- 列明進場訊號、出場訊號、所用技術指標;
- 指定一個基線指標(baseline),並定義兩重趨勢屬性:交易時間框架的趨勢,以及大時間框架的「大趨勢」;
- 不接受「價格高於移動平均線」這種單線說法——若用均線,必須用多條均線互相比較;
- 至少用一個指標過濾橫行市(他稱之為趨勢策略最大的敵人);
- 每次開倉用盡全部本金(方便之後自行調整倉位比例,因為 AI 在倉位管理上幫不了忙);
- 止蝕止盈必須用指標動態計算,禁用固定百分比——他明言「極度討厭」固定百分比止蝕;
- 最後交代交易標的(BTC-USDT),要求建議時間框架。

截圖出自原片(Algo-trading with Saleh):Saleh 給 o1-preview 的完整提示,把策略規格拆成進場、出場、指標、橫行過濾、倉位、止蝕止盈與時間框架等項目。
o1 開出的策略規格
o1 交回的偽代碼規格如下。進場(好倉)要同時滿足五重條件:
- 大趨勢確認:4 小時圖上 50 期均線高於 200 期均線(牛市格局);
- 趨勢屬性:1 小時圖上 20 期均線高於 50 期均線(短期升勢);
- 觸發訊號:1 小時圖 MA20 升穿 MA50,形成均線交叉;
- 動能確認:MACD 柱狀圖升越零軸;
- 橫行過濾:ADX 高於 25,代表趨勢強度足夠。
出場條件則是:MA20 跌穿 MA50、MACD 柱狀圖跌穿零軸,或觸及止蝕止盈。止蝕止盈用 ATR 動態計算,符合提示要求。時間框架方面,o1 建議 1 小時圖執行進出場、4 小時圖判斷大趨勢——屬典型的多重時間框架 Multi-Timeframe 結構。

截圖出自原片(Algo-trading with Saleh):o1-preview 生成的策略細節,包括大趨勢確認、均線交叉觸發、MACD 柱狀圖確認與 ADX 橫行過濾。
除錯實錄:AI 生成碼的五個連環錯誤
自訂 GPT 把偽代碼轉成 Jesse 的 Python 策略類別後,Saleh 貼上平台回測(BTC-USDT、1 小時圖、2022 年初至 2024 年 7 月),隨即開始一輪頗有教學價值的除錯。
錯誤一:策略名與類別名不一致。 Jesse 報錯提示策略結構不正確。原因是他建立策略時手動加了「AI」字樣,類別名卻沿用舊名。這是 Jesse 新手最常見的錯誤,他特意讓觀眾看清楚報錯畫面。
錯誤二:缺 @property 裝飾器。 平台報「function object has no attribute shape」。檢查後發現轉碼結果把指標定義成普通函數,卻在其他地方當屬性使用。PyCharm 其實早已顯示警告——他的心得是:AI 生成碼貼進編輯器後,先掃一遍 IDE 警告再執行,能省掉大半除錯時間。
錯誤三:交易所名寫死。 代碼把交易所寫成 Binance,但 Jesse 上的正確名稱是 Binance Perpetual Futures,策略於是卡在循環。他把寫死的字串全部改為動態引用(摘錄自原片教學):
@property
def candles_4h(self):
# 用 self.exchange/self.symbol,避免寫死交易所與標的名稱
return self.get_candles(self.exchange, self.symbol, '4h')
@property
def candles_1h(self):
return self.get_candles(self.exchange, self.symbol, self.timeframe)
錯誤四:MACD 屬性名不符。 報錯「MACD object has no attribute histo」——Jesse 的 MACD 物件用 .hist 而非 .histo。這正是通用 LLM 對小眾框架 API「似懂非懂」的典型症狀:概念全對,細節全錯。
錯誤五:漏寫淡倉函數。 修正後終於跑出結果,成績不佳之餘,報表顯示好倉佔 100%、淡倉 0%——原來轉碼時根本沒生成 should_short 與 go_short,策略在 2022 年熊市段完全袖手旁觀。他用編輯器的 Copilot 按好倉條件的鏡像補上淡倉邏輯,交易次數由三百多宗暴增至 1,600 宗。修正後的好倉入場邏輯(摘錄自原片教學):
def should_long(self) -> bool:
# 大趨勢條件:牛市
if self.ma50_big > self.ma200_big and self.ma20 > self.ma50:
# 進場訊號:MA20 在 MA50 之上、MACD 柱狀圖 > 0、ADX > 25
if self.ma20 > self.ma50 and self.macd.hist > 0 and self.adx > 25:
return True
return False

截圖出自原片(Algo-trading with Saleh):Jesse 策略的 should_long 函數——先驗大時間框架均線排列,再驗交易框架的均線、MACD 柱狀圖與 ADX 閾值。
由虧損到獲利:講者的四步人工調校
補上淡倉後成績依然平庸。Saleh 明言,接下來要「用自己的知識」改代碼——這一步正好示範了人機分工:AI 負責草稿,優化靠人的經驗。
第一步:換時間框架。 他的經驗是 4 小時圖對趨勢跟蹤策略明顯較好,於是把交易框架由 1 小時改為 4 小時,大趨勢框架由 4 小時改為 6 小時,程式內改以 self.candles 取當前交易框架 K 線。重跑後即時轉虧為盈:淨盈利 +60%、最大回撤 -28%、勝率 52%。他逐段對照淨值曲線與價格:跌市段淨值上升(淡倉生效)、升市段獲利可觀,唯橫行段表現差——趨勢策略的典型弱點。
第二步:收緊橫行過濾。 翻查源碼,策略本來已用 ADX 過濾橫行市,但閾值只有 25,他認為偏低,一舉收緊到 40。重跑後淨盈利 +87%、最大回撤大幅收窄至 -10%,成績相當漂亮。
第三步:放大倉位。 回撤只有 -10%,遠低於他可接受的 -20% 至 -30% 上限,意味有空間加槓桿。開倉函數原本用 utils.size_to_qty(self.balance, entry_price) 以全部本金計算數量,他直接把數量乘三(淡倉同樣處理)。
第四步:調高槓桿上限。 第一次重跑報保證金不足——因為交易所設定頁的槓桿仍是 2 倍。他把槓桿上限調至 4 倍(實際只用 3 倍本金,預留空間應付手續費),順利執行。
432% 的最終構成
最終回測結果:淨盈利 +432.51%(本金 10,000 美元變 53,250 美元)、最大回撤 -31%、已平倉交易 180 宗、回測期 912 日(2022 年 1 月 1 日至 2024 年 7 月 1 日)、手續費設定 0.02%。值得留意交易次數的變化:1 小時版高達 1,600 宗,轉 4 小時圖並收緊 ADX 後只剩 180 宗——過濾器砍掉近九成交易,正是回撤大降的主因。Saleh 表示成績可以接受,會繼續優化出付費版放上其策略庫,免費版亦會公開;相關推廣內容本筆記不轉載。

截圖出自原片(Algo-trading with Saleh):最終版淨值曲線(紫)對照 BTC-USDT(黃),回測期 912 日、180 宗交易,Total Net Profit 432.51%。
🙏 覺得內容有用?本站所有內容免費提供,使用推薦碼開戶就是支持我們繼續營運的最大鼓勵:
ZA Bank 邀請碼 P20923
—— 你享 HKD 2,000 迎新獎賞,本站獲得營運支持。
立即開戶 →
(聯盟連結|投資涉及風險,受條款及細則約束,此資料僅可於香港境內分發)
MT5 可行性速評
| 項目 | 評估 |
|---|---|
| 邏輯可移植性 | 高。雙時間框架均線(對 PERIOD_H6 與 PERIOD_H4 各開 iMA 句柄)、MACD(iMACD,柱狀圖即主線減訊號線)、ADX(iADX)、ATR(iATR)全屬內建指標;MT5 原生支援 H6 時間框架,無需自行合成。 |
| 平台限制 | 「全倉複利+自訂倍數」的倉位計算要自行按帳戶淨值與合約規格寫資金管理模組;MT5 普遍券商不提供 BTC 永續合約,沒有資金費率機制,0.02% 費率假設亦須按券商重設;參數(ADX 40、三倍倉位)移植後必須重新驗證。 |
| 評級 | ✅ 策略結構是最標準的「均線排列+交叉觸發+MACD 確認+ADX 過濾」,全部可用內建函數實現,移植難度低;真正要重寫的只有資金管理部分。 |
| MQL5 寫法提示 | 見下 |
int ma50_h6 = iMA(_Symbol, PERIOD_H6, 50, 0, MODE_SMA, PRICE_CLOSE);
int ma200_h6 = iMA(_Symbol, PERIOD_H6, 200, 0, MODE_SMA, PRICE_CLOSE);
int macd_h = iMACD(_Symbol, PERIOD_H4, 12, 26, 9, PRICE_CLOSE);
int adx_h = iADX(_Symbol, PERIOD_H4, 14);
// hist = MACD 主線 - 訊號線;好倉:MA50(H6)>MA200(H6) && MA20>MA50 && hist>0 && ADX>40
// 倉位:按 AccountInfoDouble(ACCOUNT_BALANCE) × 倍數 ÷ 合約價值反推手數
注意:即使移植成功,MT5 策略測試器跑出的回測同樣會過度擬合——4 小時框架、6 小時大趨勢、ADX 40、三倍倉位全是看著結果調出來的參數,換平台不解決方法論問題。
欣利克的看法
- 防坑檢查一:432% 的構成要拆三層看。第一層是訊號本身:轉用 4 小時圖後未收緊過濾前,淨盈利約 +60%(兩年半);第二層是 ADX 收緊至 40,升至 +87%、回撤 -10%;第三層是倉位乘三——由於策略每次用全部本金複利滾存,注碼放大三倍的效應會幾何級數疊加,才把 +87% 推成 +432%。槓桿與複利貢獻了增幅的大頭,並非訊號突然變強。
- 防坑檢查二:每一步調校都是看著答案改卷。轉 4 小時圖、改用 6 小時大趨勢、ADX 由 25 調到 40,全部是見到回測結果後才做的決定,屬典型樣本內優化。影片沒有任何樣本外測試 Out-of-Sample 驗證,這套參數組合在 2024 年 7 月之後的表現完全未知。
- 防坑檢查三:成本敏感度與交易次數掛鈎。1 小時版交易 1,600 宗,在 0.02% 費率下成績已經平庸;真實交易還要計滑點與永續合約的資金費率。最終版靠過濾器把交易壓至 180 宗才減輕成本拖累——評估任何高頻次策略時,先問「扣完成本還剩多少」。
- AI 寫碼的正確定位是草稿員,不是工程師。o1 給的策略骨架(基線+確認+橫行過濾+指標化止蝕)結構合理,但五個錯誤全是框架細節:屬性名、裝飾器、交易所命名、漏寫函數。截至 2026 年中,LLM 對小眾框架的 API 細節仍不可靠,「生成後必須逐行驗證」這條原則沒有過時。
- 時效提醒:回測期為 2022 年初至 2024 年 7 月,涵蓋一輪加密貨幣深熊與復甦。截至 2026 年中,市場結構、費率與模型能力均已改變,片中任何數字都不代表當前條件。本文僅為學習記錄,不構成任何買賣建議。
名詞解釋
- 指數平滑異同移動平均線 MACD:由快慢 EMA 之差及其訊號線構成;本片用其柱狀圖穿越零軸作動能確認。
- 平均趨向指數 ADX:量度趨勢強度而不分方向;本片把閾值由 25 收緊至 40,是壓低回撤的關鍵一步。
- 平均真實波幅 ATR:量度每根 K 線平均波動範圍;本片按提示要求用它動態計算止蝕止盈,取代固定百分比。
- 簡單移動平均線 SMA:固定窗口收市價平均;本片以 20/50 期(交易框架)與 50/200 期(大框架)的排列與交叉構成進場條件。
- 多重時間框架分析 Multi-Timeframe:用大框架定方向、小框架找入場點的分析結構;本片為 6 小時定大趨勢、4 小時執行。
- 大型語言模型 LLM:以大量文本訓練的生成式模型;本片實測用 o1-preview 寫策略規格,再轉成 Python。
- 提示詞 Prompt:給語言模型的輸入指令;本片證明規格列得越細,輸出越可用。
- 永續合約 Perpetual Futures:無到期日的加密貨幣衍生合約;本片回測標的為 BTC-USDT 永續合約。
- 槓桿 Leverage:以保證金撬動更大持倉;本片最終把上限設為 4 倍、實際用 3 倍本金。
- 倉位規模 Position Sizing:決定每宗交易注碼的方法;本片用全部本金複利滾存再乘三倍。
- 最大回撤 Drawdown:淨值由高位回落的最大幅度;本片由 -28% 逐步調至 -10%,加槓桿後回升至 -31%。
- 勝率 Win Rate:盈利交易佔總交易的比例;4 小時版為 52%,在趨勢策略中屬偏高水平。
- 回測 Backtesting:用歷史數據模擬策略表現的方法;本片全部成績均為回測結果。
- 過度擬合 Overfitting:策略過度遷就回測數據的噪音;432% 經多輪看結果調參得出,屬高風險案例。
常見問題 FAQ
為甚麼不直接叫 AI 寫 Python,而要先寫偽代碼?
兩個原因。第一,通用語言模型對 Jesse 這類小眾框架的語法不熟,直接生成的代碼錯漏極多;Saleh 的做法是讓 o1 專注做它擅長的事——推理策略邏輯、產出與框架無關的偽代碼——再交給他預先訓練、熟悉 Jesse 語法的自訂 GPT 負責轉碼。第二,偽代碼階段方便人類審核:進出場條件、過濾器、止蝕邏輯白紙黑字列出,發現不合理之處可以即時改提示重寫,比在一堆 Python 代碼裏找邏輯錯誤省力得多。
432% 的回測回報可以當真嗎?
數字屬回測教學案例,構成要拆開看:轉用 4 小時圖後訊號本身賺約 +60%,收緊 ADX 過濾後 +87%,再經三倍倉位加全倉複利放大才達 +432.51%(最大回撤 -31%、180 宗交易、2022 年初至 2024 年 7 月)。所有關鍵參數——時間框架、ADX 40、倉位倍數——都是看著回測結果逐步調校,影片亦無樣本外驗證,未來能否重現並無保證。把優化後的讀數當策略實力,是觀看這類影片時最需要警惕的地方。
ADX 閾值由 25 改到 40,作用為何這樣大?
ADX 量度趨勢強度:25 是常見的「有趨勢」下限,但 4 小時圖上大量勉強達標的時段其實仍是橫行反覆,趨勢策略在這些時段會被假訊號反覆止蝕。收緊到 40 後,只有真正強勁的單邊市才准開倉,交易次數由 1 小時版的 1,600 宗銳減至 180 宗,被砍掉的近九成交易大多是橫行市的虧損單,最大回撤於是由 -28% 壓到 -10%。代價是錯過部分較弱的趨勢,以及多了一個可被過度優化的參數。
AI 生成的交易程式碼可以直接拿去回測嗎?
不能,本片的五個連環錯誤就是示範:策略命名不一致、漏寫 @property 裝飾器、交易所名稱寫死、MACD 屬性名與框架不符(.histo 對 .hist)、甚至完全漏寫淡倉函數導致策略只做好倉。概念層面 AI 給的架構合理,但框架 API 的細節幾乎必有錯漏。務實流程是:貼入編輯器先看 IDE 警告、逐個錯誤修正、跑通後再核對交易方向與次數是否合理,最後才談得上評估成績。
原影片
本文整理自以下影片,版權屬原創作者所有,建議配合原片觀看: