在程式交易的開發流程中,回測(Backtesting)是一個不可或缺的步驟。透過回測,我們可以驗證策略在歷史行情中的表現,幫助判斷這套邏輯是否值得投入實盤執行。本篇文章將帶你完整理解程式交易回測的原理、常用工具、策略撰寫方法與常見陷阱,幫助你建立更穩健的交易系統。
什麼是回測?
回測就是把你的交易策略,套用在歷史資料上,看它會發生什麼事。
簡單來說,你把一套進出場邏輯,丟到過去的股價或期貨資料裡,觀察若當時照這套邏輯執行,會不會賺錢。
✅ 目標不是「預測未來」,而是「驗證邏輯是否合理、是否穩定」。
回測能幫你回答哪些問題?
- 這個策略在不同時間區段是否穩定?
- 最大連續虧損會不會讓你爆倉?
- 報酬率和風險之間是否成正比?
- 它是在特定行情中有效?還是適用於大多數市場條件?
回測時常見的績效評估指標
指標名稱 | 說明 |
---|---|
總報酬率 | 總體賺了多少%,但單獨看不夠 |
年化報酬率 | 將總報酬換算成年報酬,便於與其他策略比較 |
最大回落(MDD) | 從高點到低點最大的跌幅,越小越安全 |
Sharpe Ratio | 單位風險下的報酬率,越高越穩健 |
勝率 | 獲利次數/交易總次數,不代表獲利能力強 |
平均交易持有時間 | 每筆交易平均持有多久,評估資金效率 |
常見回測工具推薦(以 Python 為主)
工具名稱 | 說明 | 難易度 |
---|---|---|
backtrader | 最受歡迎的 Python 回測框架,支援策略模組與視覺化 | ⭐⭐⭐⭐ |
bt | 針對資產配置、ETF 組合設計的回測工具 | ⭐⭐⭐ |
zipline | Quantopian 開源引擎,支持 event-driven 架構 | ⭐⭐⭐⭐ |
QuantConnect | 雲端量化平台,支援 C#/Python 回測與實盤部署 | ⭐⭐⭐⭐⭐ |
MetaTrader 5 | 適合外匯/差價合約交易,支援圖形回測與模擬交易 | ⭐⭐ |
Python 回測實作簡例(使用 backtrader)
import backtrader as bt
class MAStrategy(bt.Strategy):
def __init__(self):
self.ma5 = bt.indicators.SimpleMovingAverage(self.data.close, period=5)
self.ma20 = bt.indicators.SimpleMovingAverage(self.data.close, period=20)
def next(self):
if self.ma5[0] > self.ma20[0] and not self.position:
self.buy()
elif self.ma5[0] < self.ma20[0] and self.position:
self.sell()
cerebro = bt.Cerebro()
data = bt.feeds.YahooFinanceData(dataname='AAPL', fromdate=datetime(2021,1,1), todate=datetime(2022,1,1))
cerebro.adddata(data)
cerebro.addstrategy(MAStrategy)
cerebro.run()
cerebro.plot()
回測常見陷阱與錯誤
問題類型 | 說明與影響 |
---|---|
使用「未來資料」 | 比如用當日收盤價來決定當日買賣,實務無法做到(look-ahead bias) |
過度優化參數 | 回測報酬率看起來很好,但其實只是剛好 fit 到歷史資料(overfitting) |
忽略交易成本與滑價 | 回測結果過度樂觀,實盤可能大打折扣 |
資料品質差 | 有缺漏或錯誤的歷史資料會導致策略評估失準 |
資金配置錯誤 | 每次 All-in,看起來報酬很高但風險也極大 |
回測完成後的下一步是什麼?
- 將策略轉為模擬交易(paper trading)
- 加入風控模組:如停損、每日最大虧損、持倉限制
- 觀察實盤與回測是否表現一致
- 逐步部署到實盤系統,從小資金開始執行
回測是策略開發的核心,不只是為了「看它賺多少」
程式交易的價值不只在寫出一套策略,而是能透過量化方式檢驗邏輯與風險控制。回測讓你理性看待策略、辨別是否過擬合、了解潛在虧損。別追求「回測報酬率最高」的策略,而應追求在合理風險下能穩定運作的系統。
相關文章:程式交易模擬怎麼做?從回測、模擬下單到實戰演練完整攻略