簡介
Backtrader 是一款用于回測交易政策的 Python 架構。它可以用于股票、期貨、外彙等交易市場。Backtrader 提供了大量的工具來開發和測試交易政策,包括資料處理、技術名額、交易記錄等。同時,Backtrader 還提供了靈活的機制來進行參數優化、圖表展示等。
安裝
可以通過 pip 指令來安裝 backtrader:
pip install backtrader
快速上手
以下是一個簡單的 Backtrader 政策示例:
import backtrader as bt
class MyStrategy(bt.Strategy):
def __init__(self):
self.sma = bt.indicators.SimpleMovingAverage(self.data.close, 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()
data = bt.feeds.YahooFinanceData(dataname='AAPL', fromdate=datetime(2019, 1, 1), todate=datetime(2021, 1, 1))
cerebro.adddata(data)
cerebro.addstrategy(MyStrategy)
cerebro.run()
該政策使用了一個簡單移動平均線來進行買賣信号的判斷,當收盤價上穿均線時買入,下穿均線時賣出。上述代碼中,首先定義了一個 MyStrategy 類,繼承了 bt.Strategy 類。在 init() 方法中,定義了一個 SimpleMovingAverage 技術名額。在 next() 方法中,根據目前的價格和均線的關系,進行買賣操作。最後,使用 bt.Cerebro() 建立了一個 cerebro 對象,并添加了資料和政策,最終通過 cerebro.run() 進行回測。
資料處理
在 Backtrader 中,資料處理是非常重要的一步。Backtrader 提供了多種資料源,可以使用 bt.feeds 子產品中的資料源類來進行資料讀取和處理。常見的資料源包括 YahooFinanceData、PandasData 等。下面是一個使用 PandasData 的例子:
import pandas as pd
import backtrader as bt
data = pd.read_csv('data.csv', index_col=0, parse_dates=True)
data = bt.feeds.PandasData(dataname=data)
該代碼将從本地讀取一個 csv 檔案,并使用 PandasData 類來将資料轉換為 bt.feeds.PandasData 對象。
除了 PandasData,還有其他的資料源類可以使用,例如 bt.feeds.YahooFinanceData。這個類可以從 Yahoo Finance 上擷取資料,它的用法類似于 PandasData。
技術名額
技術名額是衡量市場趨勢、波動性和其他關鍵因素的名額。Backtrader 提供了多種内置的技術名額,包括 SimpleMovingAverage、BollingerBands、MACD 等。可以使用 bt.indicators 子產品來調用這些名額。
import backtrader.indicators as btind
sma = btind.SimpleMovingAverage(data.close, period=20)
bb = btind.BollingerBands(data.close)
macd = btind.MACD(data.close)
上述代碼分别定義了一個 SimpleMovingAverage、BollingerBands 和 MACD 技術名額。
除了内置的技術名額,Backtrader 還支援自定義技術名額。自定義技術名額需要繼承 bt.Indicator 類,并實作 init() 和 next() 方法。在實作自定義技術名額時,需要注意名額的計算方式和資料的格式,確定名額的正确性和計算效率。
交易記錄
交易記錄是指記錄每筆交易的資訊,包括交易的時間、價格、數量、手續費等。Backtrader 提供了多種交易記錄類,可以記錄每筆交易的資訊。常見的交易記錄類包括 TradeAnalyzer、Transactions 等。以下是一個使用 TradeAnalyzer 的例子:
import backtrader.analyzers as btanalyzers
cerebro.addanalyzer(btanalyzers.TradeAnalyzer)
cerebro.run()
trade_analysis = cerebro.analyzers.tradeanalyzer.get_analysis()
該代碼在 cerebro 對象中添加了一個 TradeAnalyzer 分析器,并運作回測。回測結束後,通過 cerebro.analyzers.tradeanalyzer.get_analysis() 方法可以擷取交易分析結果。交易分析結果包括總交易次數、盈虧比例、平均每筆交易盈利等名額,可以幫助我們更好地評估交易政策的表現。
參數優化
參數優化是指确定最佳參數組合的過程,以獲得最佳的交易政策。Backtrader 提供了靈活的參數優化機制,可以使用 bt.Strategy 中的 params 屬性來定義參數範圍,并使用 bt.optstrategy() 方法來進行參數優化。以下是一個使用 params 和 optstrategy 的例子:
class MyStrategy(bt.Strategy):
params = (
('sma_period', 20),
('rsi_period', 14),
)
def __init__(self):
self.sma = bt.indicators.SimpleMovingAverage(self.data.close, period=self.params.sma_period)
self.rsi = bt.indicators.RelativeStrengthIndex(self.data.close, period=self.params.rsi_period)
def next(self):
if self.data.close[0] > self.sma[0] and self.rsi[0] < 30:
self.buy()
elif self.data.close[0] < self.sma[0] and self.rsi[0] > 70:
self.sell()
cerebro = bt.Cerebro()
data = bt.feeds.YahooFinanceData(dataname='AAPL', fromdate=datetime(2019, 1, 1), todate=datetime(2021, 1, 1))
cerebro.adddata(data)
cerebro.optstrategy(MyStrategy, sma_period=range(10, 30), rsi_period=range(10, 30))
cerebro.run()
該代碼中,定義了一個 MyStrategy 類,并定義了兩個參數:sma_period 和 rsi_period。在 init() 方法中,根據參數定義了 SimpleMovingAverage 和 RelativeStrengthIndex 技術名額。在 next() 方法中,根據價格和名額的關系進行買賣操作。在主程式中,利用 bt.optstrategy() 方法對參數進行優化,最終通過 cerebro.run() 進行回測。
繪圖
繪圖是将回測結果可視化的重要步驟。Backtrader 提供了多種繪圖工具,可以将回測結果繪制成圖表。常見的繪圖類包括 Cerebro.plot()、BacktestPlotter 等。以下是一個使用 Cerebro.plot() 的例子:
cerebro.plot()
該代碼調用了 cerebro 對象的 plot() 方法,可以将回測結果繪制成圖表。繪圖工具可以幫助我們更好地了解交易政策的表現,發現交易政策中存在的問題,進一步優化交易政策。
總結
本文介紹了 Backtrader 的使用方法,包括資料處理、技術名額、交易記錄、參數優化和繪圖等。使用 Backtrader 可以幫助我們更好地開發和測試交易政策,提高交易效率和收益率。Backtrader 架構提供了很多實用的工具,可以友善我們對交易政策進行回測和優化,同時也可以通過繪圖工具将回測結果可視化,幫助我們更好地了解交易政策的性能。