GitHub 程式交易專案:專案類型與採用前的檢查
GitHub 上的開源程式交易專案是好用的積木與學習素材,不是現成的策略。先把儲存庫歸入三類之一,讀程式碼確認成交時點與交易成本,再用固定下來的規則,帶著貼近實況的交易成本,在作者沒看過的資料上執行,之後才能採信。
作者 Soren Huang · 發佈 · 更新於 · 編輯原則
目錄
可以使用 GitHub 上的程式交易專案嗎?
GitHub 上的程式交易專案適合當作積木與學習素材,不是現成的策略。星數與公開的權益曲線,都說明不了規則在手續費、滑價與下一根 K 棒成交之下,面對沒看過的資料能否撐住。每個儲存庫在你帶著交易成本親自執行過之前,一律視為未經檢驗。
原因並不複雜:儲存庫是程式碼加上一項主張。程式碼可以讀、可以執行;主張通常是一張圖或一張報酬表,用作者挑選的資料、作者調過的設定產生,往往沒有扣交易成本。GitHub 頁面看不出公開版本之前試過多少種變化。Bailey、Borwein、López de Prado 與 Zhu(2014)指出,從大量嘗試中挑出的最佳結果,會因挑選本身而偏高,即使每一條測過的規則都毫無價值。別人分享的腳本,是他人搜尋的終點,不論作者是否知情,都帶著這份偏高。
這不代表這些專案毫無用處。好的回測函式庫能省下數月工夫;交易機器人能示範委託處理怎麼做;策略集合是一份待測的構想清單。若你剛入門,請先讀程式交易的定義、成本與多數規則虧損的原因,因為只有先預期多數借來的規則在扣除成本後會失敗,本文的檢查才有意義。
GitHub 上有哪幾類程式交易專案?
開源程式交易專案分三類,各有各的用途,沒有任何一類單獨就能給你一套經過檢驗、可交易的期貨策略。回測函式庫是引擎,用舊價格重播規則並回報交易,本身沒有策略。交易機器人是連上交易所或券商、依規則送出委託的程式,多半一次只連一家交易所。策略集合是以程式碼分享的規則腳本倉庫,少有附上交易成本或樣本外結果的。
| 回測函式庫 | 交易機器人 | 策略集合 | |
|---|---|---|---|
| 內容 | 引擎:載入資料、模擬委託、輸出報表 | 下單連接器、排程器,常含簡易回測器 | 規則腳本,有時附結果圖 |
| 缺少的部分 | 策略;常缺期貨合約模型 | 檢驗;通常也沒有期貨連接器 | 交易成本、樣本外結果、參數歷程 |
| 常見市場 | 資料模型以股票為主;期貨需自行處理 | 提供免費公開 API 的交易所 | 混合:股票、外匯,部分期貨 |
| 首先要檢查的項目 | 成交價從哪裡來 | 風險控管,以及斷線時的處理 | 調過幾個參數 |
以「github trading bot」搜尋出來的儲存庫,多數屬於第二類,且多半連接提供免費公開 API 的交易所。CME 或 TAIFEX 的期貨要經由券商才能到交易所,所以相應的機器人需要券商連線,而附帶這項連線的開源專案少得多。讀程式碼之前,先把儲存庫歸類;歸類結果會告訴你,哪些部分得自己補。
最常用的開源回測框架有哪些?
常見的開源回測框架,差別在於處理 K 棒的方式、資料模型適用哪些市場,以及是否仍有人維護;這三項事實決定哪一個適合期貨回測。事件驅動引擎依序一次處理一根 K 棒,與實單系統的運作方式相同。向量化引擎以陣列一次算出整段價格序列的訊號,速度快,但容易用到規則當下不可能知道的價格。
| 框架 | 處理模式 | 程式語言 | 期貨資料模型 | 預設成交 | 實單下單連接器 | 專案活躍度 |
|---|---|---|---|---|---|---|
| Backtrader | 事件驅動 | Python | 契約乘數與保證金設在手續費設定中;有轉倉資料來源;交易時段需自行處理 | 下一根 K 棒開盤價 | 有(Interactive Brokers、Oanda、Visual Chart) | 查看最近一次發行日期 |
| Zipline | 事件驅動 | Python | 內建連續月期貨與交易日曆;日曆以美國為主 | 下一根 K 棒 | 核心函式庫不含 | 原始儲存庫在 Quantopian 於 2020 年關閉後封存;另有延續維護的分支 |
| vectorbt | 向量化 | Python | 以價格陣列運算;契約乘數與交易時段需自行處理 | 同一根 K 棒收盤價,除非自行位移訊號 | 無(開源版本) | 查看最近一次發行日期 |
| Backtesting.py | 逐根 K 棒迴圈 | Python | 單一商品;無契約乘數;交易時段需自行處理 | 下一根 K 棒開盤價 | 無 | 查看最近一次發行日期 |
| Lean(QuantConnect) | 事件驅動 | C#,支援 Python | 期貨:內建連續月對應與轉倉設定 | 委託之後的下一筆行情 | 有(多家券商) | 由公司維護 |
這些欄位中,有兩欄值得先看。預設成交欄告訴你,照抄範例會不會把收盤價洩漏進決策,下一節會說明。期貨資料模型欄則告訴你,有多少東西得自行建置:契約乘數、交易時段濾網,以及處理好轉倉跳空的連續月序列。期貨回測對任何軟體(不論開源與否)的需求清單,見期貨演算法交易軟體真正重要的五項功能;不論選哪個框架,都可拿它當檢核表。
如何檢查開源策略的交易成本與前視偏誤?
依固定順序讀程式碼,檢查五件事,遇到第一項不通過就停下。前視偏誤是指回測用到了規則做決定的當下還拿不到的資訊。最常見的形式,是規則讀取某根 K 棒的收盤價、做出決定,又在同一個收盤價成交。實單交易中,收盤價要等 K 棒結束才知道,你能拿到的第一個價格是下一根 K 棒的開盤價。清單上其他項目都比這一項容易修正,所以它排第一。
- 成交價相對於訊號 K 棒,是從哪裡來的? 找出設定執行價格的那一行。若是產生訊號那根 K 棒的收盤價,測試就有洩漏。以下一根 K 棒開盤價成交,或以下一根 K 棒實際走過的停損價或限價成交,才是可交易的。這種洩漏的藏身方式(包括位移過的指標欄位),見回測中的前視偏誤與一根 K 棒檢查法。
- 有沒有手續費與滑價,是否按每邊計算? 在程式碼裡搜尋費用、手續費或滑價設定。許多腳本一項都沒有。有些按名目金額的百分比收費,這適用於股票,不適用於每跳動點價值固定的期貨合約。期貨測試的手續費要用每口每邊的固定金額,滑價每邊至少一個跳動點。
- 資料是怎麼建構的? 確認價格序列是單一合約、已調整轉倉跳空的連續月序列,還是把各合約原樣串接。也要確認交易時段:以 23 小時交易建構的日 K 棒,與以日盤建構的日 K 棒,是不同的商品。再把時間戳記的時區,對照任何時間規則所用的時區。
- 調過幾個參數,用什麼資料調的? 數一數規則裡所有可能改動的數字:回看期數、門檻、停損距離、時間窗口。在 60 筆交易上調五個數字,描述的只是那段歷史,不是規則。查看提交紀錄,確認這些數字改過幾次。
- 公開的成果只有樣本內嗎? 讀 README,對照圖表涵蓋的日期範圍,與選定參數所用的日期範圍。若兩者相同,或完全沒提到切分,就把這張圖視為樣本內成果,也就是作者所有嘗試中最好的那一個。
第一項與第二項檢查合在一起,說明了為什麼多數分享的腳本在儲存庫裡最好看,到真實帳戶上最差。同一根 K 棒成交,會替每筆交易多算入該 K 棒走勢的一部分,而沒計入的交易成本則什麼也不會扣。交易越頻繁的規則,合併影響越大,因為每筆交易的走勢最小、成交次數最多。AlphaPrime(Valynox)評估候選策略時,會在評估內扣除手續費與滑價,並以下一根 K 棒成交;這項設定的說明在回測頁。上述五個問題,正是這項設定在搜尋開始前就回答的那些,你也可以手動套用到任何腳本上。
開源策略可以直接下單嗎?
只有附帶券商或交易所連接器的專案才能下單,而大多數適用期貨的路徑,要經過交易平台自己的語言,所以借來的規則通常得重寫成下單所在平台的語言。連接器是程式中負責登入交易所或券商、送出委託並讀取成交的部分。多數 GitHub 機器人只有單一家提供免費公開 API 的交易所的連接器。在有東西把兩者接起來之前,放在 Python 腳本裡的規則和券商的期貨帳戶是兩件各自獨立的事。
實務上接起來有三種方式:
- 內建連接器的機器人。 程式碼自己送出委託。這在提供免費公開 API 的交易所常見,在交易所掛牌的期貨則少見,因為期貨的連線要經過券商 API,而支援它的開源專案不多。
- 附券商連接器的框架。 Backtrader 與 Lean 可以透過支援的券商轉送實單委託。你仍得自己執行程式,用一台持續開機的機器,並自行負責風險控管。
- 改寫成平台語言。 把規則翻成交易平台的語言,由平台處理券商連線、委託類型與交易時段。期貨最常走的就是這條路。有自己策略語言的平台包括 MultiCharts(PowerLanguage)、TradingView(Pine Script v6)、TradeStation(EasyLanguage)、NinjaTrader(NinjaScript)、MetaTrader 4(MQL4)與 MetaTrader 5(MQL5)。AlphaPrime 可把策略原始碼匯出到這六個平台;目前支援的清單放在支援的平台匯出頁。
改寫也是第二道檢驗發生的地方。規則翻成新語言後,在相同資料上產生的交易明細,應與原版逐筆高度吻合。若不吻合,差別通常出在成交時點、交易時段邊界,或兩個引擎處理同一根 K 棒內停損與停利的方式。差異修正之前,規則不要靠近任何委託。
如何用沒看過的資料驗證借來的策略?
固定規則,以貼近實況的交易成本,在作者沒看過的後段資料上執行,計算樣本外交易筆數,並記得多個嘗試中留下的一個候選策略,帶有挑選加成。樣本外資料是價格歷史中沒有用來選擇規則或設定的部分。就借來的規則而言,唯一能確定的,是儲存庫最後一次更動時還不存在的資料,所以參數的提交日期就是你的切分日。
- 照公開內容原樣記錄規則與每個參數,連同提交日期。 不要改,連四捨五入過的回看期數也不行。
- 依你交易的市場設定交易成本:每口每邊固定手續費,滑價每邊至少一個跳動點,並採下一根 K 棒成交。
- 只用提交日期之後的 K 棒執行。 這是作者不可能拿來調參數的資料。
- 用完成的交易筆數衡量樣本,而非日曆年數。 少於約 30 筆只是提示,不算結果;數百筆才是能讀的樣本。
- 用你在看結果之前寫下的標準評斷:例如,扣除交易成本後的平均每筆損益必須維持為正,且沒有任何單一季度占了大部分獲利。
挑選加成是人們最常略過的部分。公開這條規則的人,之前先試過別的,並留下看起來最好的。Harvey 與 Liu(2015)說明,結果應依背後的檢定次數打多少折扣;Sullivan、Timmermann 與 White(1999)發現,數十年股票資料中看似強勁的技術規則,一旦把整組搜尋過的規則都算進去,大部分表面優勢就消失了。在 AlphaPrime 內搜尋出的規則同樣如此。下方的方框就是這樣一次執行。它測試的是以標準指標建立的替代規則,不是 GitHub 上的策略本身:以效率比(Efficiency Ratio)規則作為唯一的進場與出場,沒有停損、停利或濾網。效率比衡量價格走勢在一段回看期間內有多筆直,從近乎零(走勢震盪)到近乎一(一條直線);如何把它當作趨勢指標來解讀,說明在考夫曼效率比與 0 到 1 的解讀。這次執行使用 NQ 日 K 棒,期間 2019-01-02 至 2025-06-30,多空雙向,一口,每筆交易手續費 $20、滑價 $10。所示候選策略,是搜尋從所試的 1,024 個中,依報酬相對回撤的表現而留下的那一個。事後挑出留下的那個,會讓它的成績偏好看,就像公開在 GitHub 的腳本,受先前的嘗試美化一樣。
來源:AlphaPrime 產品引擎(CPU),2026-10-31 執行。NQ 日線,2019-01-02 至 2025-06-30,多空都做,1 口,每筆手續費 $20、滑價 $10。
| 數字 | 結果 |
|---|---|
| 淨利(已平倉) | $104,570 |
| 最大回撤 | $26,345 |
| 交易筆數 | 44 |
| 勝率 | 63.64% |
| 獲利因子 | 2.309 |
| 平均每筆 | $2,376.59 |
| 在市場中的時間 | 16.37% |
請像讀儲存庫圖表那樣讀這個方框。淨損益 $104,570 與獲利因子 2.309,是留下的候選策略在這次執行中的樣本內紀錄,不是規則賺來的,也不是讀者可以預期的。先看的數字是約六年半間的 44 筆交易。這就是第四步的波段策略問題:44 筆交易的 63.64% 勝率,只要少數幾筆交易改變就可能大幅變動,所以平均每筆損益 $2,376.59 只是這個候選策略的提示,不是量測到的優勢。最大回撤 $26,345 是這一段歷史產生的回撤;同樣的交易換個順序,會得到不同的回撤。這次執行還有 16.37% 的時間在市場中,所以多數期間空手,這在與永遠持有部位的規則比較時有影響。

借來的規則通過這項測試一次,只是候選,不是策略。它還需要通過演算法交易策略持續有效的五項檢驗中的檢查:相鄰設定表現相近、獲利分散在不同時間而非一個幸運季度,以及結果在滑價加倍後仍然成立。對同一條固定下來的規則執行這些檢查,並在看結果之前,先寫下你要求的通過項數。
具體的下一步:從你加了星號的策略集合中挑一個,找出最後一次更動參數的提交,用你自己的期貨 K 棒,從那天起向後執行原封不動的規則,並設定固定手續費、每邊一個跳動點的滑價。先數交易筆數,再看其他任何東西。若你從未建立過這樣的測試,新手 30 天的第一支程式交易策略路線會依序帶你走完設定。
常見問題
用實際資金執行 GitHub 交易機器人安全嗎?
唯有先讀過它如何處理斷線、遭拒絕的委託,以及交易所有部位但機器人記憶中沒有的情況,才算安全。多數開源機器人由一個人寫成,並在一個帳戶上測過。任何機器人都先在模擬交易帳戶執行,使用你打算用的同樣部位大小,並觀察它在週末與重新連線時的行為。
可以用開源軟體回測期貨嗎?
可以,但多數開源回測框架是圍繞股票的資料模型建構,所以契約乘數、交易時段濾網,以及帶有轉倉跳空的連續月,常需要你自己加上。Zipline 與 Lean 內建連續月期貨;Backtrader 在手續費設定中處理乘數與保證金;vectorbt 與 Backtesting.py 則留給你處理。先確認框架如何成交委託,再檢查其他項目。
為什麼 GitHub 上的策略加入交易成本後就失效?
許多分享的腳本以產生訊號那根 K 棒的收盤價成交,且不計手續費與滑價。這兩個選擇都會替每筆交易加分,交易越頻繁的規則影響越大,因為它們每筆交易的走勢最小。一旦成交改到下一根 K 棒開盤價,並按每邊收取固定成本,交易頻繁的腳本,平均每筆損益常會跌到零以下。
使用開源程式交易專案需要懂 Python 嗎?
對多數廣泛使用的回測框架來說,需要,因為它們是 Python 函式庫,策略以 Python 程式碼撰寫。期貨帳戶則還要讓規則進到交易平台,通常意味著第二種語言,例如 PowerLanguage、Pine Script、EasyLanguage、NinjaScript 或 MQL。能讀懂程式碼、找到成交價與成本設定,是最重要的能力,即使你從不從頭寫策略。
借來的策略需要多少樣本外資料?
足以容納數百筆完成的交易,從儲存庫中規則參數最後一次更動的日期起算。對一年只交易幾次的日 K 棒規則,提交日期後只過一年,交易筆數太少,無法判斷,所以你可能得等待,或用同一條固定下來的規則,把測試擴及數個相關市場。少於約 30 筆只是提示,不算結果。
參考文獻
- Bailey, D. H., Borwein, J., López de Prado, M., & Zhu, Q. J. (2014). Pseudo-Mathematics and Financial Charlatanism: The Effects of Backtest Overfitting on Out-of-Sample Performance. Notices of the American Mathematical Society, 61(5), 458–471.
- Harvey, C. R., & Liu, Y. (2015). Backtesting. The Journal of Portfolio Management, 42(1), 13–28.
- Sullivan, R., Timmermann, A., & White, H. (1999). Data-Snooping, Technical Trading Rule Performance, and the Bootstrap. The Journal of Finance, 54(5), 1647–1691.

