天天看點

量化回測神器backtrader使用方法

簡介

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 架構提供了很多實用的工具,可以友善我們對交易政策進行回測和優化,同時也可以通過繪圖工具将回測結果可視化,幫助我們更好地了解交易政策的性能。

繼續閱讀