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 月、倉位乘三倍後)的回測教學案例數字,並非實盤成績。

學習重點

詳細筆記

為何先要偽代碼,而非直接要 Python

Saleh 頻道本身有提供一個自訂 GPT(在 GPT Store 搜「Jesse」可找到),專門把交易想法轉成 Jesse 框架接受的語法;但當時自訂 GPT 尚未支援 o1-preview 模型,他想試的正是 o1 的推理能力,於是改為兩步走:先在普通對話叫 o1 寫偽代碼,再把偽代碼貼給自訂 GPT 轉碼。

他坦白說,第一版的簡單提示——「幫我寫一個趨勢跟蹤演算法策略的偽代碼」——試過無數次,輸出幾乎全部不堪用。直到他把要求逐項列明,質素才達到可用水平。這段提示工程的要求值得逐條記下:

寫給 o1 的完整提示:逐項列明進出場、指標、過濾與倉位要求

截圖出自原片(Algo-trading with Saleh):Saleh 給 o1-preview 的完整提示,把策略規格拆成進場、出場、指標、橫行過濾、倉位、止蝕止盈與時間框架等項目。

o1 開出的策略規格

o1 交回的偽代碼規格如下。進場(好倉)要同時滿足五重條件:

  1. 大趨勢確認:4 小時圖上 50 期均線高於 200 期均線(牛市格局);
  2. 趨勢屬性:1 小時圖上 20 期均線高於 50 期均線(短期升勢);
  3. 觸發訊號:1 小時圖 MA20 升穿 MA50,形成均線交叉;
  4. 動能確認:MACD 柱狀圖升越零軸;
  5. 橫行過濾:ADX 高於 25,代表趨勢強度足夠。

出場條件則是:MA20 跌穿 MA50、MACD 柱狀圖跌穿零軸,或觸及止蝕止盈。止蝕止盈用 ATR 動態計算,符合提示要求。時間框架方面,o1 建議 1 小時圖執行進出場、4 小時圖判斷大趨勢——屬典型的多重時間框架 Multi-Timeframe 結構。

o1 回覆的策略規格:五重進場條件與出場條件

截圖出自原片(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_shortgo_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

修正後的 should_long:五重條件與 ADX 過濾

截圖出自原片(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 表示成績可以接受,會繼續優化出付費版放上其策略庫,免費版亦會公開;相關推廣內容本筆記不轉載。

最終回測:淨值曲線與 432.51% 淨盈利

截圖出自原片(Algo-trading with Saleh):最終版淨值曲線(紫)對照 BTC-USDT(黃),回測期 912 日、180 宗交易,Total Net Profit 432.51%。

🙏 覺得內容有用?本站所有內容免費提供,使用推薦碼開戶就是支持我們繼續營運的最大鼓勵:

ZA Bank 邀請碼 P20923 —— 你享 HKD 2,000 迎新獎賞,本站獲得營運支持。 立即開戶 → (聯盟連結|投資涉及風險,受條款及細則約束,此資料僅可於香港境內分發)

MT5 可行性速評

項目評估
邏輯可移植性高。雙時間框架均線(對 PERIOD_H6PERIOD_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、三倍倉位全是看著結果調出來的參數,換平台不解決方法論問題。

欣利克的看法

名詞解釋

常見問題 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 警告、逐個錯誤修正、跑通後再核對交易方向與次數是否合理,最後才談得上評估成績。

原影片

本文整理自以下影片,版權屬原創作者所有,建議配合原片觀看:

來源:https://www.youtube.com/watch?v=fxOS0rmxyBc

🏦 ZA Bank 開戶優惠

本站所有內容免費提供。多使用網站的推薦碼,就是對我們繼續製作優質內容的最大鼓勵和支持 🙏

去 ZA Bank 開戶,享價值 HKD 2,000 迎新獎賞,仲有機會享 USD 30 指定美股兌換券!

  • 💛 全線上開戶,無需前往分行
  • 💛 無最低存款要求,零賬戶管理費
  • 💛 24x7 銀行服務

專屬邀請碼:P20923

立即開戶 → (聯盟連結)