交易策略回測
回測(Backtesting)是把交易策略套用到歷史資料上,看看如果過去真的照這套規則交易,結果會是賺是賠。回測不能保證未來也會賺錢,但至少能先排除明顯不可行的策略,並抓出策略在什麼市況下容易失效。
回測想確認的三件事
- 策略是否有效:長期是否有正報酬,而不是只在特定一段時間湊巧賺錢。
- 風險有多大:過程中最大會虧掉多少(最大回撤),見績效指標與風險管理。
- 參數是否穩健:稍微調整參數(例如均線天數),績效是否劇烈翻轉——劇烈翻轉通常代表策略是湊出來的,不夠穩健。
使用 backtesting.py 回測
backtesting.py 是輕量、上手快的回測框架,適合驗證入門策略。
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 是更完整的框架:
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 框架的基本架構與寫法,適合之後想換用更完整、功能更多的回測框架時參考。