VALYNOXSTRATEGY RESEARCH TECHNOLOGY
AlphaPrimeAlphaPrime
策略學院 / 策略生成

GitHub 程式交易專案:專案類型與採用前的檢查

GitHub 上的開源程式交易專案是好用的積木與學習素材,不是現成的策略。先把儲存庫歸入三類之一,讀程式碼確認成交時點與交易成本,再用固定下來的規則,帶著貼近實況的交易成本,在作者沒看過的資料上執行,之後才能採信。

作者 · 發佈 · 更新於 · 編輯原則

目錄
  1. 可以使用 GitHub 上的程式交易專案嗎?
  2. GitHub 上有哪幾類程式交易專案?
  3. 最常用的開源回測框架有哪些?
  4. 如何檢查開源策略的交易成本與前視偏誤?
  5. 開源策略可以直接下單嗎?
  6. 如何用沒看過的資料驗證借來的策略?
  7. 常見問題
  8. 參考文獻

可以使用 GitHub 上的程式交易專案嗎?

GitHub 上的程式交易專案適合當作積木與學習素材,不是現成的策略。星數與公開的權益曲線,都說明不了規則在手續費、滑價與下一根 K 棒成交之下,面對沒看過的資料能否撐住。每個儲存庫在你帶著交易成本親自執行過之前,一律視為未經檢驗。

原因並不複雜:儲存庫是程式碼加上一項主張。程式碼可以讀、可以執行;主張通常是一張圖或一張報酬表,用作者挑選的資料、作者調過的設定產生,往往沒有扣交易成本。GitHub 頁面看不出公開版本之前試過多少種變化。Bailey、Borwein、López de Prado 與 Zhu(2014)指出,從大量嘗試中挑出的最佳結果,會因挑選本身而偏高,即使每一條測過的規則都毫無價值。別人分享的腳本,是他人搜尋的終點,不論作者是否知情,都帶著這份偏高。

這不代表這些專案毫無用處。好的回測函式庫能省下數月工夫;交易機器人能示範委託處理怎麼做;策略集合是一份待測的構想清單。若你剛入門,請先讀程式交易的定義、成本與多數規則虧損的原因,因為只有先預期多數借來的規則在扣除成本後會失敗,本文的檢查才有意義。

GitHub 上有哪幾類程式交易專案?

開源程式交易專案分三類,各有各的用途,沒有任何一類單獨就能給你一套經過檢驗、可交易的期貨策略。回測函式庫是引擎,用舊價格重播規則並回報交易,本身沒有策略。交易機器人是連上交易所或券商、依規則送出委託的程式,多半一次只連一家交易所。策略集合是以程式碼分享的規則腳本倉庫,少有附上交易成本或樣本外結果的。

回測函式庫交易機器人策略集合
內容引擎:載入資料、模擬委託、輸出報表下單連接器、排程器,常含簡易回測器規則腳本,有時附結果圖
缺少的部分策略;常缺期貨合約模型檢驗;通常也沒有期貨連接器交易成本、樣本外結果、參數歷程
常見市場資料模型以股票為主;期貨需自行處理提供免費公開 API 的交易所混合:股票、外匯,部分期貨
首先要檢查的項目成交價從哪裡來風險控管,以及斷線時的處理調過幾個參數
三種 GitHub 程式交易專案:回測函式庫有引擎但沒有策略,交易機器人有下單連線但未經檢驗,策略集合有規則構想但沒有交易成本,因此單獨一類都不是經過檢驗的期貨策略 三種類型,三個缺口 各類型具備與缺少的部分 回測函式庫 引擎 無策略 交易機器人 下單連線 未經檢驗 策略集合 規則構想 無成本 三者皆非檢驗過的策略。 所以:缺什麼就補什麼。
三種專案,三種用途。函式庫沒有策略,機器人沒有檢驗,策略集合沒有交易成本。

以「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期貨:內建連續月對應與轉倉設定委託之後的下一筆行情有(多家券商)由公司維護
五個開源回測框架,依引擎類型與期貨支援比較:Backtrader 為事件驅動、部分支援期貨,Zipline 為事件驅動、內建期貨,vectorbt 為向量化、期貨需自行處理,Backtesting.py 為逐根 K 棒、期貨需自行處理,Lean 為事件驅動、內建期貨 適合期貨回測的框架 客觀事實,不做排名 框架 引擎 期貨 Backtrader 事件驅動 部分支援 Zipline 事件驅動 內建 vectorbt 向量化 自行處理 Backtesting.py 逐根 K 棒 自行處理 Lean 事件驅動 內建 由引擎與期貨適配度決定。 所以:也看最近發行日。
同樣五個框架,依期貨回測最重要的三項事實比較。專案活躍度欄請在你選用當天,依儲存庫的提交紀錄自行填寫。

這些欄位中,有兩欄值得先看。預設成交欄告訴你,照抄範例會不會把收盤價洩漏進決策,下一節會說明。期貨資料模型欄則告訴你,有多少東西得自行建置:契約乘數、交易時段濾網,以及處理好轉倉跳空的連續月序列。期貨回測對任何軟體(不論開源與否)的需求清單,見期貨演算法交易軟體真正重要的五項功能;不論選哪個框架,都可拿它當檢核表。

如何檢查開源策略的交易成本與前視偏誤?

依固定順序讀程式碼,檢查五件事,遇到第一項不通過就停下。前視偏誤是指回測用到了規則做決定的當下還拿不到的資訊。最常見的形式,是規則讀取某根 K 棒的收盤價、做出決定,又在同一個收盤價成交。實單交易中,收盤價要等 K 棒結束才知道,你能拿到的第一個價格是下一根 K 棒的開盤價。清單上其他項目都比這一項容易修正,所以它排第一。

  1. 成交價相對於訊號 K 棒,是從哪裡來的? 找出設定執行價格的那一行。若是產生訊號那根 K 棒的收盤價,測試就有洩漏。以下一根 K 棒開盤價成交,或以下一根 K 棒實際走過的停損價或限價成交,才是可交易的。這種洩漏的藏身方式(包括位移過的指標欄位),見回測中的前視偏誤與一根 K 棒檢查法。
  2. 有沒有手續費與滑價,是否按每邊計算? 在程式碼裡搜尋費用、手續費或滑價設定。許多腳本一項都沒有。有些按名目金額的百分比收費,這適用於股票,不適用於每跳動點價值固定的期貨合約。期貨測試的手續費要用每口每邊的固定金額,滑價每邊至少一個跳動點。
  3. 資料是怎麼建構的? 確認價格序列是單一合約、已調整轉倉跳空的連續月序列,還是把各合約原樣串接。也要確認交易時段:以 23 小時交易建構的日 K 棒,與以日盤建構的日 K 棒,是不同的商品。再把時間戳記的時區,對照任何時間規則所用的時區。
  4. 調過幾個參數,用什麼資料調的? 數一數規則裡所有可能改動的數字:回看期數、門檻、停損距離、時間窗口。在 60 筆交易上調五個數字,描述的只是那段歷史,不是規則。查看提交紀錄,確認這些數字改過幾次。
  5. 公開的成果只有樣本內嗎? 讀 README,對照圖表涵蓋的日期範圍,與選定參數所用的日期範圍。若兩者相同,或完全沒提到切分,就把這張圖視為樣本內成果,也就是作者所有嘗試中最好的那一個。
兩根價格 K 棒的比較:左側在 K 棒 t 的收盤價發出訊號並於同一收盤價成交,屬於洩漏;右側改等 K 棒 t+1 的開盤價成交,可交易且需付交易成本 同一收盤價,還是下一開盤價? 圓點 = 訊號,圓環 = 成交 同一根 K 棒成交 下一根 K 棒成交 t t+1 t t+1 洩漏 可交易 + 成本 當時還不知道這個收盤價。 所以:下一根成交,雙邊計成本。
左:規則在收盤價做決定,又在同一個收盤價成交,而那是它當時還不知道的價格。右:改等下一個開盤價成交,每邊都付手續費與滑價。

第一項與第二項檢查合在一起,說明了為什麼多數分享的腳本在儲存庫裡最好看,到真實帳戶上最差。同一根 K 棒成交,會替每筆交易多算入該 K 棒走勢的一部分,而沒計入的交易成本則什麼也不會扣。交易越頻繁的規則,合併影響越大,因為每筆交易的走勢最小、成交次數最多。AlphaPrime(Valynox)評估候選策略時,會在評估內扣除手續費與滑價,並以下一根 K 棒成交;這項設定的說明在回測頁。上述五個問題,正是這項設定在搜尋開始前就回答的那些,你也可以手動套用到任何腳本上。

開源策略可以直接下單嗎?

只有附帶券商或交易所連接器的專案才能下單,而大多數適用期貨的路徑,要經過交易平台自己的語言,所以借來的規則通常得重寫成下單所在平台的語言。連接器是程式中負責登入交易所或券商、送出委託並讀取成交的部分。多數 GitHub 機器人只有單一家提供免費公開 API 的交易所的連接器。在有東西把兩者接起來之前,放在 Python 腳本裡的規則和券商的期貨帳戶是兩件各自獨立的事。

實務上接起來有三種方式:

  1. 內建連接器的機器人。 程式碼自己送出委託。這在提供免費公開 API 的交易所常見,在交易所掛牌的期貨則少見,因為期貨的連線要經過券商 API,而支援它的開源專案不多。
  2. 附券商連接器的框架。 Backtrader 與 Lean 可以透過支援的券商轉送實單委託。你仍得自己執行程式,用一台持續開機的機器,並自行負責風險控管。
  3. 改寫成平台語言。 把規則翻成交易平台的語言,由平台處理券商連線、委託類型與交易時段。期貨最常走的就是這條路。有自己策略語言的平台包括 MultiCharts(PowerLanguage)、TradingView(Pine Script v6)、TradeStation(EasyLanguage)、NinjaTrader(NinjaScript)、MetaTrader 4(MQL4)與 MetaTrader 5(MQL5)。AlphaPrime 可把策略原始碼匯出到這六個平台;目前支援的清單放在支援的平台匯出頁。
從經過檢驗的儲存庫程式碼到實單期貨委託的路徑:程式碼先用平台語言改寫,再在平台上執行,由平台連到券商;機器人可以直接從程式碼連到交易所,這在期貨少見 程式碼在哪裡改寫 從檢驗過的程式碼到實單委託 程式 改寫 平台 券商 機器人 交易所 期貨少見 期貨下單需要改寫。 所以:改寫後比對交易明細。
期貨的規則幾乎都要先用平台語言改寫,才會到達券商。從程式碼直達交易所的路徑是例外。

改寫也是第二道檢驗發生的地方。規則翻成新語言後,在相同資料上產生的交易明細,應與原版逐筆高度吻合。若不吻合,差別通常出在成交時點、交易時段邊界,或兩個引擎處理同一根 K 棒內停損與停利的方式。差異修正之前,規則不要靠近任何委託。

如何用沒看過的資料驗證借來的策略?

固定規則,以貼近實況的交易成本,在作者沒看過的後段資料上執行,計算樣本外交易筆數,並記得多個嘗試中留下的一個候選策略,帶有挑選加成。樣本外資料是價格歷史中沒有用來選擇規則或設定的部分。就借來的規則而言,唯一能確定的,是儲存庫最後一次更動時還不存在的資料,所以參數的提交日期就是你的切分日。

  1. 照公開內容原樣記錄規則與每個參數,連同提交日期。 不要改,連四捨五入過的回看期數也不行。
  2. 依你交易的市場設定交易成本:每口每邊固定手續費,滑價每邊至少一個跳動點,並採下一根 K 棒成交。
  3. 只用提交日期之後的 K 棒執行。 這是作者不可能拿來調參數的資料。
  4. 用完成的交易筆數衡量樣本,而非日曆年數。 少於約 30 筆只是提示,不算結果;數百筆才是能讀的樣本。
  5. 用你在看結果之前寫下的標準評斷:例如,扣除交易成本後的平均每筆損益必須維持為正,且沒有任何單一季度占了大部分獲利。

挑選加成是人們最常略過的部分。公開這條規則的人,之前先試過別的,並留下看起來最好的。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% 的時間在市場中,所以多數期間空手,這在與永遠持有部位的規則比較時有影響。

逾一千個候選策略中只留下一個最佳者;它的樣本內成績因挑選而偏高,只有用原封不動的規則在後段資料上重跑,才算數 從多次嘗試挑出最佳,成績偏高 搜尋中留下的一個候選策略 大量嘗試 留1個 成績偏高 原規則跑後段資料 只有這個算數 挑選本身就讓成績偏高。 所以:只用後段資料評分。
1,024 個嘗試中留下一個點。它的樣本內成績因挑選本身而偏高;只有在較晚、規則不變的資料上跑出的結果才算數。
比較曲線在標示的樣本外區段之前與之內的斜率,再看下方回撤帶的深度。標記之後仍維持相近斜率的曲線,是你要的樣子;在那裡變平的曲線,就是挑選加成逐漸消退。
比較曲線在標示的樣本外區段之前與之內的斜率,再看下方回撤帶的深度。標記之後仍維持相近斜率的曲線,是你要的樣子;在那裡變平的曲線,就是挑選加成逐漸消退。 NQ · 日線 · 2019-01-02 至 2025-06-30 · CPU 引擎回測

借來的規則通過這項測試一次,只是候選,不是策略。它還需要通過演算法交易策略持續有效的五項檢驗中的檢查:相鄰設定表現相近、獲利分散在不同時間而非一個幸運季度,以及結果在滑價加倍後仍然成立。對同一條固定下來的規則執行這些檢查,並在看結果之前,先寫下你要求的通過項數。

具體的下一步:從你加了星號的策略集合中挑一個,找出最後一次更動參數的提交,用你自己的期貨 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.