跳轉至

建立 2025-02-24 更新 2026-09-16

交易策略回測

回測(Backtesting)是把交易策略套用到歷史資料上,看看如果過去真的照這套規則交易,結果會是賺是賠。回測不能保證未來也會賺錢,但至少能先排除明顯不可行的策略,並抓出策略在什麼市況下容易失效。

回測想確認的三件事

  1. 策略是否有效:長期是否有正報酬,而不是只在特定一段時間湊巧賺錢。
  2. 風險有多大:過程中最大會虧掉多少(最大回撤),見績效指標與風險管理
  3. 參數是否穩健:稍微調整參數(例如均線天數),績效是否劇烈翻轉——劇烈翻轉通常代表策略是湊出來的,不夠穩健。

使用 backtesting.py 回測

backtesting.py 是輕量、上手快的回測框架,適合驗證入門策略。

pip install backtesting
from backtesting import Backtest, Strategy
from backtesting.lib import crossover
from backtesting.test import SMA, GOOG   # GOOG 是套件內建的範例資料


class SmaCross(Strategy):
    n1 = 10
    n2 = 20

    def init(self):
        close = self.data.Close
        self.sma1 = self.I(SMA, close, self.n1)
        self.sma2 = self.I(SMA, close, self.n2)

    def next(self):
        if crossover(self.sma1, self.sma2):
            self.buy()
        elif crossover(self.sma2, self.sma1):
            self.sell()


bt = Backtest(GOOG, SmaCross, cash=10_000, commission=0.002, exclusive_orders=True)
stats = bt.run()
bt.plot()

bt.run() 回傳的 stats 會包含總報酬、勝率、夏普比率、最大回撤等關鍵數據,是評估策略好壞的第一手資料。

進階選擇:backtrader

如果需要更複雜的多資產、多時間框架回測,或要接上實際券商下單,backtrader 是更完整的框架:

pip install backtrader
import backtrader as bt

class SmaCross(bt.Strategy):
    def __init__(self):
        self.sma = bt.indicators.SimpleMovingAverage(self.data, period=20)

    def next(self):
        if self.data.close[0] > self.sma[0]:
            self.buy()
        elif self.data.close[0] < self.sma[0]:
            self.sell()

cerebro = bt.Cerebro()
cerebro.addstrategy(SmaCross)
cerebro.run()

參數調校

測試不同參數組合,觀察績效是否穩定,而不是只找出「最佳」的單一組合(過度配適歷史資料,實務上常常失靈):

for n1, n2 in [(10, 20), (20, 50), (50, 100)]:
    class Params(SmaCross):
        pass
    Params.n1, Params.n2 = n1, n2
    stats = Backtest(GOOG, Params, cash=10_000).run()
    print(n1, n2, stats["Return [%]"])

動手做

7-1 簡單回測實作backtesting.py 完整示範上方的均線交叉策略,可直接在 Colab 開啟執行。

推薦影音

Backtesting.py 實戰教學

簡述:Part Time Larry(README 也推薦的量化 YouTuber)示範如何用 backtesting.py 撰寫策略、執行回測並解讀績效報表,內容與本頁的 backtesting.py 範例直接對應。

Backtrader 入門

簡述:介紹 backtrader 框架的基本架構與寫法,適合之後想換用更完整、功能更多的回測框架時參考。