在程式交易中,回測(Backtesting) 是最重要的步驟之一。透過回測,我們可以用歷史資料驗證策略是否有效,避免在實盤中付出慘痛學費。這篇文章將帶你認識什麼是回測、用 Python 怎麼進行策略驗證,以及推薦哪些套件能讓你快速上手。
回測是什麼?為什麼這麼重要?
簡單來說,回測就是把你的交易策略應用在歷史資料上,看它會不會賺錢。它能幫助你:
- 發現策略的潛在弱點與風險
- 評估績效指標(報酬率、最大回落、Sharpe Ratio)
- 減少「看起來很厲害但實際會爆倉」的幻想
- 建立對策略的信心
不回測就實盤交易,就像不試車就直接開上高速公路,風險極高。
用 Python 回測有哪些優點?
- 開源免費,不需購買昂貴軟體
- 能自由撰寫邏輯、擴充各種指標或條件
- 可以整合自動化下單、監控、日誌紀錄等功能
- 學習資源豐富,社群活躍
Python 回測常用的套件推薦
套件名稱 | 適合對象 | 特點 |
---|---|---|
backtrader | 新手~中階 | 社群大、文件齊全、圖表好看,支援多策略與多商品 |
bt | 中階 | 聚焦資產配置、策略組合績效分析 |
zipline | 中階~進階 | 支援 event-driven 架構,是 Quantopian 的核心 |
QuantConnect Lean | 進階 | 雲端/本地架構皆可用,策略語言彈性強 |
回測的基本流程
1. 載入歷史資料
常見資料來源:
yfinance
:免費抓取台股、美股資料- API 資料平台(如 Alpha Vantage、Polygon)
- 自建資料庫(CSV 或 SQL)
範例:
import yfinance as yf
df = yf.download("AAPL", start="2022-01-01", end="2023-01-01")
2. 撰寫策略邏輯
策略邏輯可用技術指標、價格行為、成交量等條件來設計。例如:
df['ma5'] = df['Close'].rolling(5).mean()
df['ma20'] = df['Close'].rolling(20).mean()
df['signal'] = (df['ma5'] > df['ma20']).astype(int)
3. 使用回測框架進行模擬
以 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 self.ma5[-1] <= self.ma20[-1]:
self.buy()
elif self.ma5[0] < self.ma20[0] and self.ma5[-1] >= self.ma20[-1]:
self.sell()
cerebro = bt.Cerebro()
data = bt.feeds.PandasData(dataname=df)
cerebro.adddata(data)
cerebro.addstrategy(MAStrategy)
cerebro.run()
cerebro.plot()
4. 分析績效結果
回測結束後,檢查以下關鍵指標:
- 年化報酬率(Annual Return)
- 最大回落(Max Drawdown)
- 勝率(Win Rate)
- Sharpe Ratio(風險調整後報酬)
你也可以使用 pyfolio
進行績效報表視覺化。
回測有哪些陷阱要避免?
1. 過度擬合(Overfitting)
調整參數直到回測績效「非常好」,但實盤很可能表現極差。記得分出訓練集與驗證集。
2. 使用未來資訊
例如用「收盤價」決定當日買賣,實際上收盤價當下並不可得,這叫做「look-ahead bias」。
3. 忽略滑價與交易成本
如果策略頻繁交易,沒考慮手續費、買賣價差等因素,績效會過度美化。
4. 回測資料不完整或錯誤
確保資料沒有遺漏、錯誤標記、或時間序列亂序,否則策略表現會失真。
相關文章:Python 股票程式交易新手指南:從資料抓取到自動下單全流程解析