iT邦幫忙

2

[Python投資] Backtrader 模組

  • 分享至 

  • xImage
  •  

Backtrader 模組

Backtrader 是一個用於測試和開發量化策略的 Python 庫,尤其適合於回測股票、期貨、外匯等金融市場的交易策略。它提供了一個功能豐富且靈活的平台,允許使用者快速開發和測試他們的交易想法。下面是 Backtrader 的一些關鍵特點和功能:

主要特點

  1. 易於使用:Backtrader 設計了直觀的 API,讓使用者可以輕鬆地定義策略、添加數據源、設置初始資本等。
  2. 數據兼容性:它支援從 CSV 檔案、Pandas DataFrame 到實時數據源的多種數據格式,方便使用者根據需求進行交易策略的回測和實時交易。
  3. 多策略運行:使用者可以在同一時間回測多個策略,以比較和分析不同策略的表現。
  4. 內建指標和分析工具:Backtrader 內建了多種技術分析指標和性能分析工具,如移動平均線、相對強弱指數(RSI)、夏普比率等,方便使用者進行策略開發和性能評估。
  5. 自定義擴展:使用者可以自定義指標、分析器、交易策略等組件,提高策略的靈活性和適應性。
  6. 優化功能:提供策略參數優化工具,使用者可以通過優化參數來尋找最佳的交易策略配置。

使用情境

  • 策略回測:快速實現和回測交易策略,檢查策略在歷史數據上的表現。
  • 策略優化:通過調整策略參數,找到最優的策略配置。
  • 實時交易:雖然 Backtrader 主要設計用於回測,但它也支援與實時交易接口的連接,如 Interactive Brokers 等。

快速入門

安裝 Backtrader 非常簡單,可以通過 pip 進行安裝:

pip install backtrader

範例

import backtrader as bt
import yfinance as yf
import matplotlib.pyplot as plt
%matplotlib inline

# 定義策略
class MyStrategy(bt.Strategy):
    def next(self):
        pass  # 策略邏輯

# 初始化 Cerebro 引擎
cerebro = bt.Cerebro()

# 添加策略
cerebro.addstrategy(MyStrategy)

# 設置初始資金
cerebro.broker.setcash(10000.0)

# 設置手續費
cerebro.broker.setcommission(commission=0.001)

# 添加數據
data = bt.feeds.PandasData(dataname=yf.download("MSFT", 
                                                start="2018-01-01", 
                                                end="2018-12-31"))
cerebro.adddata(data)

# 運行策略
cerebro.run()

# 繪製結果
cerebro.plot(iplot=False)

https://ithelp.ithome.com.tw/upload/images/20240220/20072651P9Zk0esnPP.png

Cerebro 介紹

Cerebro 是 Backtrader 框架的核心組件,負責整合策略、數據和分析器,並執行回測或實時交易。它提供了一個高度靈活和可擴展的環境,讓使用者可以輕鬆地定義和測試他們的交易策略。以下是對 Cerebro 的主要特點和功能的介紹:

主要特點

  1. 策略實現和測試:Cerebro 允許使用者快速實現和測試交易策略。使用者可以定義自己的買入、賣出條件,策略邏輯,以及資金管理規則。
  2. 數據靈活性:Cerebro 支持從多種數據源讀取數據,包括 CSV 檔案、Pandas DataFrame、線上數據源等。這使得策略回測和實時交易變得更加靈活和強大。
  3. 多策略回測:Cerebro 支持同時回測多個策略,使得策略比較和組合策略的開發更加方便。
  4. 性能分析:Cerebro 通過集成的分析器,如夏普比率、最大回撤等,提供了豐富的性能分析工具,幫助使用者評估策略表現。
  5. 圖表繪製:Cerebro 內建的繪圖功能可以輕鬆生成交易策略的性能圖表,包括資產曲線、交易點位等,方便使用者直觀地評估策略效果。
  6. 優化支持:Cerebro 提供了策略參數優化功能,允許使用者尋找最佳的策略參數組合,以提高策略的總體表現。

使用流程

使用 Cerebro 進行策略回測的基本流程通常包括以下幾個步驟:

  1. 創建 Cerebro 實例:首先創建一個 Cerebro 引擎的實例。
  2. 添加數據源:通過 adddata 方法添加市場數據。這些數據可以是歷史數據,用於回測,也可以是實時數據,用於實時交易。
  3. 添加策略:使用 addstrategy 方法添加一個或多個交易策略。
  4. 配置資金和手續費:可選地設置初始資本和交易手續費。
  5. 運行回測:調用 run 方法運行策略回測。
  6. 性能分析和繪圖:選擇性使用分析器評估策略表現,並使用 plot 方法繪製交易性能圖表。

以下表格介紹了 Cerebro 的一些核心方法及其功能:

方法名稱 描述 範例
addstrategy 添加一個交易策略到 Cerebro 引擎中。 cerebro.addstrategy(MyStrategy)
adddata 添加市場數據到 Cerebro 引擎中。 cerebro.adddata(data)
addanalyzer 添加分析器以評估策略的性能。 cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')
addobserver 添加觀察者,用於在策略運行時觀察和記錄特定的信息(如賬戶價值)。 cerebro.addobserver(bt.observers.Broker)
addwriter 添加一個 Writer,用於將運行期間的輸出寫入到外部文件。 cerebro.addwriter(bt.WriterFile, csv=True)
broker.setcash 設置初始資金。 cerebro.broker.setcash(10000)
broker.setcommission 設置交易手續費。 cerebro.broker.setcommission(commission=0.001)
run 執行添加到 Cerebro 的策略。 cerebro.run()
plot 繪製策略執行結果的圖表。 cerebro.plot()

使用 Cerebro 進行回測時,你會按照需求組合使用這些方法來配置你的回測環境。例如,你可能會先用 adddata 添加數據,再用 addstrategy 添加策略,最後調用 run 方法來運行策略。回測完成後,你可以使用 plot 方法來繪製結果圖表,或者使用 addanalyzeraddobserver 來分析策略表現和監控交易過程。

數據來源

在 Backtrader 中,數據源(Data Feeds)是策略運行的基礎,提供了市場數據的輸入。數據源包含了股票、期貨、外匯等金融資產的價格信息,如開盤價、最高價、最低價、收盤價和成交量等。Backtrader 設計了靈活的數據源系統,支持從多種來源獲取數據,包括本地檔案(如 CSV)、網絡數據(如 Yahoo Finance)和即時數據。

主要特性

  1. 多格式支持:內建支持多種格式的數據,如 CSV 檔案、Pandas DataFrame、線上數據(例如 Yahoo Finance)等。
  2. 靈活的數據管理:可以輕鬆地對數據進行切片、合併和重採樣,以適應不同的策略需求。
  3. 多數據源同時運行:允許在同一策略中同時使用多個數據源,方便進行跨市場、跨資產的策略開發。
  4. 即時數據交易:支持接入即時數據源,實現策略的即時交易。

數據源類型

  • 靜態數據源:從檔案(如 CSV、JSON)或 DataFrame 中讀取的歷史數據。
  • 線上數據源:從金融數據提供商(如 Yahoo Finance、Google Finance)獲取的歷史或即時數據。
  • 即時數據源:從交易所或其他即時數據提供平台獲取的即時交易數據。

使用示例

從 CSV 檔案加載數據

import backtrader as bt

# 創建 Cerebro 實例
cerebro = bt.Cerebro()

# 加載數據
data = bt.feeds.GenericCSVData(
    dataname='data.csv',
    fromdate=datetime.datetime(2020, 1, 1),
    todate=datetime.datetime(2021, 1, 1),
    nullvalue=0.0,
    dtformat=('%Y-%m-%d'),
    datetime=0,
    high=2,
    low=3,
    open=1,
    close=4,
    volume=5,
    openinterest=-1
)

# 將數據添加到 Cerebro
cerebro.adddata(data)

YFinance 提供數據

要使用 yfinance 下載數據並餵入 Backtrader 策略,你需要先安裝 yfinance 庫。yfinance 是一個流行的 Python 庫,可以用來從 Yahoo Finance 獲取股票市場數據。以下是如何實現的步驟:

安裝 yfinance

如果你尚未安裝 yfinance,可以通過以下命令安裝:

pip install yfinance

使用 yfinance 下載數據

下面的代碼示例展示了如何使用 yfinance 下載特定股票的歷史數據,並將其轉換為 Backtrader 可以使用的格式:

import yfinance as yf
import backtrader as bt

# 初始化 Cerebro 引擎
cerebro = bt.Cerebro()

# 使用 yfinance 下載數據
data = yf.download('AAPL', start='2020-01-01', end='2021-01-01')

# 轉換數據格式,使其適用於 Backtrader
dataframe = bt.feeds.PandasData(dataname=data)

# 將數據添加到 Cerebro
cerebro.adddata(dataframe)

策略(Strategy)

在 Backtrader 中,策略(Strategy)是實現交易邏輯的核心。一個策略定義了進場(買入)、出場(賣出)的條件,以及可能的持倉管理規則。Backtrader 通過 Strategy 類提供了一個框架,允許使用者定義自己的交易策略。以下是策略類的一些關鍵概念和組件:

策略組件

  1. 初始化(__init__:
    • 在這個階段,您會初始化策略所需的指標和變量。例如,您可以在此設定移動平均線指標、相對強弱指數(RSI)等。
  2. 預先處理(start:
    • start 方法在回測或實時交易開始前調用一次,通常用於策略的初始化設置。
  3. 下一筆(next:
    • next 方法在每一個新的數據點(例如每日或每分鐘的市場數據)到來時被調用。大部分的交易邏輯,如基於某些條件買入或賣出,都會在這裡實現。
  4. 記錄(log:
    • 雖然不是一個內建方法,但在策略開發過程中,自定義一個 log 函數用於記錄交易和策略信息是一個好習慣。
  5. 訂單執行(notify_order:
    • notify_order 方法用於處理訂單的狀態更新。例如,您可以在此檢查訂單是否已被執行,並根據訂單執行的結果調整策略。
  6. 交易通知(notify_trade:
    • 當一個交易開始、更新或結束時,notify_trade 方法會被調用。這可以用來記錄交易的盈虧等信息。
  7. 停止(stop:
    • 在策略回測或實時交易結束時調用一次。可以用於報告策略的最終結果或進行清理工作。

基本策略

import yfinance as yf
import backtrader as bt

# 定義一個策略
class TestStrategy(bt.Strategy):
    def log(self, text, dt=None):
        ''' 日誌函數,用於記錄策略的執行信息 '''
        dt = dt or self.datas[0].datetime.date(0)
        print(f'{dt.isoformat()}, {text}')

    def next(self):
        ''' 主要的策略邏輯,每個 bar 呼叫一次 '''
        self.log(f'收盤價: {self.data.close[0]}')

# 初始化 Cerebro 引擎
cerebro = bt.Cerebro()

# 使用 yfinance 下載數據
data = yf.download('AAPL', start='2020-01-01', end='2021-01-01')

# 轉換 yfinance 數據為 Backtrader 數據格式
datafeed = bt.feeds.PandasData(dataname=data)

# 添加數據到 Cerebro
cerebro.adddata(datafeed)

# 添加策略到 Cerebro
cerebro.addstrategy(TestStrategy)

# 設置初始資本
cerebro.broker.setcash(10000.0)

# 印出初始資本
print(f'初始資本: {cerebro.broker.getvalue():.2f}')

# 運行策略
cerebro.run()

# 印出最終資本
print(f'最終資本: {cerebro.broker.getvalue():.2f}')

# 畫出圖片
cerebro.plot(iplot=False)

在這個例子中,我們使用 yfinance 下載了蘋果公司(AAPL)從 2020 年 1 月 1 日到 2021 年 1 月 1 日的股票數據。然後,我們使用 bt.feeds.PandasData 將下載的 DataFrame 轉換成 Backtrader 可以處理的數據格式,並添加到 Cerebro 引擎中。最後,我們運行了一個簡單的策略,該策略在每個交易日記錄收盤價。

這個方法讓你可以方便地從 Yahoo Finance 獲取並使用最新的股票市場數據,進行策略的回測和分析。

策略訂單(Order)

在 Backtrader 中,Order 對象是交易執行的核心概念,代表了一個交易指令,包括買入或賣出股票、期貨等金融資產的操作。Order 對象包含了訂單的詳細信息,如訂單類型、價格、大小(數量)、狀態等,並在訂單被創建、提交、執行或取消時更新這些信息。

Order 主要屬性

屬性名稱 描述
size 訂單的大小(正數代表買入,負數代表賣出)。
price 訂單的價格(對於市價單,這個值可能為 None)。
executed 訂單執行的細節,包括執行的價格和大小等。
status 訂單的當前狀態(如已提交、已取消、已執行等)。
ordertype 訂單的類型(如市價單、限價單等)。
created 訂單創建時的日期時間。
comm 訂單執行所產生的手續費。

Order 狀態

Order 對象的狀態是了解訂單是否被執行的關鍵,常見的狀態包括:

  • Created:訂單已創建但尚未提交到市場。
  • Submitted:訂單已提交到市場但尚未被執行。
  • Accepted:訂單已被市場接受(某些交易所會有這一階段)。
  • Partial:訂單部分執行。
  • Completed:訂單已完全執行。
  • Canceled:訂單已取消。
  • Expired:訂單已過期。
  • Margin:由於保證金不足,訂單未能執行。
  • Rejected:訂單被拒絕。

Order 類型

Backtrader 支持多種訂單類型,允許交易策略根據不同的市場條件進行交易,包括:

  • Market:市價單,以當前市場價格執行。
  • Limit:限價單,只有當市場達到指定價格時才執行。
  • Stop:止損單,當市場價格達到某一不利水平時觸發執行。
  • StopLimit:止損限價單,結合了止損單和限價單的特性。

使用 Order 對象

在 Backtrader 策略中,當你通過 buy()sell() 方法創建訂單時,這些方法會返回一個 Order 對象。你可以保存這個對象的引用,以便後續檢查訂單的狀態或其他相關信息。


# 在策略中創建一個市價買入訂單
self.order = self.buy()

# 在策略的其他部分檢查訂單狀態
if self.order.status in [self.order.Completed, self.order.Canceled, self.order.Margin]:
    self.order = None  # 重置訂單引用

Order 對象和相關的功能使 Backtrader 成為一個強大且靈活的交易策略開發和回測框架,允許細粒度地控制交易執行過程。

策略卷商(Broker)

在 Backtrader 中,broker 是一個核心組件,它模擬了真實世界中的交易執行環境。broker 負責處理訂單的提交、執行以及管理策略的現金和倉位。通過與 broker 交互,策略可以執行買賣操作、設置手續費、獲取賬戶信息等。下面將介紹 broker 的一些主要功能和使用方法。

主要功能

  1. 執行訂單:接受並執行由策略提交的買賣訂單。
  2. 資金管理:管理策略的資金,包括初始資金設置、計算交易後的餘額等。
  3. 倉位管理:追踪策略持有的資產倉位,包括數量和價值。
  4. 手續費設置:允許自定義交易的手續費率,以模擬真實交易成本。
  5. 滑點控制:可以設置滑點模型,模擬實際交易中的價格變動。
  6. 保證金管理:對使用杠桿的交易,broker 可以計算所需的保證金。

使用方法

在 Backtrader 中使用 broker 的一些常見操作如下:

  • 設置初始資金
    cerebro.broker.setcash(10000.0)
    
  • 設置手續費
    cerebro.broker.setcommission(commission=0.001, margin=2000.0, leverage=10.0)
    
    這裡設置了每筆交易的手續費率為0.1%,並為使用杠桿交易的商品設置保證金和杠桿比例。
  • 獲取賬戶現金
    cash = cerebro.broker.get_cash()
    
  • 獲取賬戶價值
    value = cerebro.broker.get_value()
    
  • 提交訂單
    在策略中,你可以使用 buy()sell() 方法提交訂單,這些操作會通過 broker 進行處理。

自定義 Broker

Backtrader 允許使用自定義的 broker 來擴展或修改默認行為,例如接入真實的交易平台或實現特殊的交易規則。這通過繼承 BrokerBase 類並實現相關方法來實現。

結論

broker 在 Backtrader 中扮演著非常重要的角色,它不僅作為策略和市場之間的橋樑,處理交易執行,同時也提供了一套豐富的接口,使策略能夠以高度自定義的方式進行交易。通過合理配置和使用 broker,可以更精準地模擬策略在實際交易環境中的表現。

策略指標(Indicators)

在 Backtrader 中,指標(Indicators)是用於分析和預測市場行為的數學計算工具。它們從原始數據(如股票的開盤價、收盤價、最高價、最低價和成交量)中提取信息,生成可以用於交易決策的信號。Backtrader 提供了豐富的內置指標,並允許用戶自定義新指標。這些指標可以輕鬆地集成到交易策略中。

常見指標類型

  1. 趨勢指標:用於判斷市場的方向和強度。例如,移動平均線(MA)、指數平滑移動平均線(EMA)、布林帶(Bollinger Bands)等。
  2. 動量指標:用於評估資產價格變動的速度和變化。例如,相對強弱指數(RSI)、隨機振盪器(Stochastic Oscillator)、MACD等。
  3. 成交量指標:基於成交量數據,分析買賣力道。例如,成交量加權平均價格(VWAP)、成交量振盪器(Volume Oscillator)等。
  4. 波動性指標:衡量市場價格波動的幅度。例如,平均真實範圍(ATR)、標準差(Standard Deviation)等。

使用指標

在 Backtrader 中使用指標非常直接。首先,你需要在策略的 __init__ 方法中創建指標實例。然後,你可以在策略的 next 方法中訪問這些指標的值。

示例:使用移動平均線指標

import backtrader as bt

class MyStrategy(bt.Strategy):
    def __init__(self):
        # 創建一個 20 期的簡單移動平均線指標
        self.sma = bt.indicators.SimpleMovingAverage(self.data.close, period=20)

    def next(self):
        # 訪問移動平均線的當前值
        sma_value = self.sma[0]
        print(f'當前移動平均線值:{sma_value}')

自定義指標

Backtrader 也支持創建自定義指標。這通常涉及繼承 bt.Indicator 類,並在子類中定義指標的計算邏輯。

示例:創建一個自定義指標


class MyIndicator(bt.Indicator):
    lines = ('myline',)  # 定義指標線

    def __init__(self):
        # 指標計算邏輯
        self.lines.myline = self.data.close / 2  # 假設指標是收盤價的一半

然後,你可以像使用內置指標一樣,在策略中創建和使用這個自定義指標。

結論

指標是量化交易和技術分析中不可或缺的工具。Backtrader 通過提供豐富的內置指標和支持自定義指標的能力,使得交易策略的開發變得靈活且強大。无论是趨勢跟踪、尋找轉折點,還是衡量市場波動性,指標都能為你提供有價值的見解。

分析器(Analyzers)

在 Backtrader 中,分析器(Analyzers)是用來對策略性能進行評估和分析的工具。它們可以收集在策略執行過程中產生的各種數據,如交易盈虧、回報率、夏普比率等,並提供詳細的報告和統計信息。這些信息對於理解策略的表現、優化策略參數以及比較不同策略之間的效果非常有用。

主要功能

  1. 性能評估:分析策略的總體回報、年化回報等。
  2. 風險評估:計算策略的最大回撤、夏普比率等風險指標。
  3. 交易分析:提供交易次數、勝率、平均盈虧比等交易統計。
  4. 自定義分析:用戶可以根據需要創建自定義分析器。

內置分析器

Backtrader 提供了多種內置分析器,例如:

  • TradeAnalyzer:分析交易情況,如勝利和失敗的交易數、勝率等。
  • Returns:計算策略的簡單回報和對數回報。
  • SharpeRatio:計算夏普比率,評估每單位風險所獲得的超額回報。
  • DrawDown:分析策略的最大回撤和回撤期。

使用示例

要在策略中使用分析器,需要在執行策略之前將分析器添加到 Cerebro 引擎中。執行完畢後,可以從策略實例中獲取和查看分析結果。

import backtrader as bt

# 初始化 Cerebro 引擎
cerebro = bt.Cerebro()

# 添加策略
cerebro.addstrategy(MyStrategy)

# 添加分析器
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe_ratio')
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown')

# 執行策略
results = cerebro.run()

# 獲取分析結果
sharpe_ratio = results[0].analyzers.sharpe_ratio.get_analysis()
drawdown = results[0].analyzers.drawdown.get_analysis()

print(f"夏普比率: {sharpe_ratio['sharperatio']}")
print(f"最大回撤: {drawdown['max']['drawdown']}")

自定義分析器

除了使用內置分析器外,Backtrader 也允許創建自定義分析器。這通過繼承 bt.Analyzer 類並實現必要的方法來完成。這樣,用戶可以根據特定的需求來收集和分析數據。

結論

分析器是 Backtrader 框架中一個強大的特性,它為量化策略的評估和優化提供了豐富的工具。通過使用內置分析器或創建自定義分析器,用戶可以深入理解策略的性能和風險特性,從而做出更加明智的交易決策。

手續費(Commission Schemes)

在 Backtrader 中,手續費方案(Commission Schemes)是用於模擬交易成本的重要組件。這些方案允許策略開發者根據實際交易環境設置手續費、印花稅、保證金要求等成本,從而更準確地評估策略的表現。透過設定不同的交易成本模型,可以幫助開發者理解在不同市場條件下策略的盈利能力。

主要特性

  1. 支持多種交易成本:包括固定手續費、百分比手續費、滑點成本等。
  2. 靈活的設定:可以針對不同的資產設定不同的手續費方案,模擬多元化的交易環境。
  3. 保證金管理:允許設定保證金要求,適用於期貨、外匯等杠桿產品的交易。
  4. 印花稅和稅收:對於部分市場,還可以設定交易時需支付的印花稅和其他稅收。

內置手續費模型

Backtrader 提供了幾種內置的手續費模型,以滿足不同交易市場和資產類型的需求:

  • CommInfoBase:基礎手續費模型,支持固定和百分比手續費。
  • CommInfo_Stocks:針對股票交易的手續費模型,支持印花稅。
  • CommInfo_Futures:針對期貨交易的手續費模型,支持保證金要求和每點價值設定。

使用示例

設定一個簡單的百分比手續費模型:

cerebro = bt.Cerebro()
# 設置每筆交易0.1%的手續費
cerebro.broker.setcommission(commission=0.001)

針對期貨交易設定保證金和滑點:

# 創建一個期貨手續費方案
comm_info = bt.CommissionInfo(
    commission=0.0005,
    margin=2000.0,
    mult=10.0,
    commtype=bt.CommInfoBase.COMM_PERC,
    percabs=True)

# 為 Cerebro 實例添加手續費方案
cerebro.broker.addcommissioninfo(comm_info)

自定義手續費方案

如果內置的手續費模型不能滿足特定需求,Backtrader 允許開發者通過繼承 CommInfoBase 類來實現自定義的手續費方案。這樣可以實現更複雜的成本結構,例如基於交易量的階梯式手續費、特定時間的額外成本等。

結論

手續費方案是量化交易策略評估中不可或缺的一部分,它們幫助策略開發者更真實地模擬交易成本,從而提供更準確的策略表現評估。Backtrader 的靈活設定和自定義能力,使得開發者可以根據不同市場和交易策略的需要,設定最合適的手

觀察者(Observers)

在 Backtrader 中,觀察者(Observers)是用於在策略運行時監控和記錄特定信息的組件。與指標(Indicators)不同,觀察者主要用於跟踪策略的運行狀態,如賬戶現金餘額、當前持倉、交易成本等,而不直接參與交易決策。觀察者可以在策略運行過程中提供實時反饋,幫助分析和調整策略。

主要功能

  1. 實時監控:觀察者能夠在策略運行時提供實時的策略表現信息。
  2. 自動記錄:自動記錄交易過程中的關鍵數據,如資金變化、交易次數等。
  3. 圖表整合:與 Backtrader 的繪圖功能整合,可將觀察者收集的信息直觀地顯示在圖表上。

常用觀察者

Backtrader 內置了多個觀察者,以下是一些常見的觀察者及其用途:

  • Broker:跟踪賬戶的現金和總價值。
  • Trades:記錄交易的開啟和關閉。
  • BuySell:標記買入和賣出點位。
  • DrawDown:監控策略的回撤情況。
  • CashValue:同時跟踪現金和賬戶總價值。

使用示例

在 Cerebro 引擎中添加觀察者非常簡單,以下是如何添加 Broker 觀察者和 BuySell 觀察者的示例:

import backtrader as bt

# 初始化 Cerebro 引擎
cerebro = bt.Cerebro()

# 添加策略
cerebro.addstrategy(MyStrategy)

# 添加 Broker 觀察者
cerebro.addobserver(bt.observers.Broker)

# 添加 BuySell 觀察者,標記交易點
cerebro.addobserver(bt.observers.BuySell)

# 加載數據、設定初始資金等

# 執行策略
cerebro.run()

# 繪製結果(包括觀察者收集的信息)
cerebro.plot()

自定義觀察者

除了使用內置的觀察者外,Backtrader 也支持自定義觀察者。通過繼承 Observer 基類並實現相應的方法,你可以創建專門針對你的策略需求的觀察者。這為策略開發提供了更大的靈活性和控制能力。

結論

觀察者在 Backtrader 中是一個強大的工具,能夠幫助開發者更好地理解和優化他們的交易策略。無論是通過內置的觀察者來獲取關鍵的運行狀態信息,還是通過自定義觀察者來收集特定的策略表現數據,觀察者都能夠為策略的評估和調整提供重要的支持。

大小設定器(Sizers)

在 Backtrader 中,Sizers(位元大小設定器)是用來自動計算每次交易(買入或賣出)應該使用的股數或合約數的組件。Sizers 的目的是為了根據策略的邏輯和資金管理規則來動態調整每筆交易的規模,從而優化資金的使用效率和控制風險。

主要功能

  1. 自動計算交易大小:根據賬戶的現金餘額、風險管理規則或其他因素自動計算每次交易的規模。
  2. 風險控制:通過限制交易大小幫助控制每筆交易的風險。
  3. 策略實現:幫助實現策略中的資金管理規則,如固定比例投資、等額投資等。

內置 Sizers

Backtrader 提供了幾種內置的 Sizers,以滿足常見的資金管理需求:

  • FixedSize:固定大小的 Sizer,對於每次交易使用固定的股數或合約數。
  • PercentSizer:百分比 Sizer,根據賬戶總值的一定百分比來決定交易大小。
  • AllInSizer:全投 Sizer,每次交易使用所有可用的資金。

使用示例

以下是如何在 Backtrader 策略中使用固定大小 Sizer 的示例:

import backtrader as bt

class MyStrategy(bt.Strategy):
    def __init__(self):
        # 定義策略的其他組件,如指標等
        pass

    def next(self):
        # 根據策略邏輯決定是否買入或賣出
        if self.buy_signal():
            self.buy()

# 初始化 Cerebro 引擎
cerebro = bt.Cerebro()

# 添加策略
cerebro.addstrategy(MyStrategy)

# 使用 FixedSize Sizer,每次交易買入 10 股
cerebro.addsizer(bt.sizers.FixedSize, stake=10)

# 加載數據、設定初始資金等

# 執行策略
cerebro.run()

自定義 Sizers

如果內置的 Sizers 不滿足特定的需求,Backtrader 也允許創建自定義的 Sizers。這通過繼承 bt.Sizer 基類並實現 getsizing 方法來完成。在這個方法中,你可以根據自己的資金管理策略來計算交易大小。

結論

Sizers 是 Backtrader 中一個重要的組件,它們幫助實現策略中的資金管理和風險控制規則。通過使用內置的 Sizers 或創建自定義的 Sizers,策略開發者可以更好地控制每筆交易的規模,從而優化策略的整體表現和風險暴露。

繪圖功能(ploting)

在 Backtrader 中,繪圖功能是一個強大的工具,允許開發者對策略運行的結果進行可視化分析。透過圖表,可以直觀地展示策略的表現,如價格變動、交易點、持倉情況、指標信號等,從而幫助開發者理解策略的行為和優化策略。

主要特性

  1. 多層次展示:可以在同一圖表中展示多個層次的數據,例如主圖層顯示價格和交易信號,副圖層顯示成交量或其他指標。
  2. 豐富的圖表元素:支持繪制線圖、散點圖、柱狀圖等多種圖表元素,並可以自定義風格和顏色。
  3. 交易標記:自動在圖表上標記買入和賣出點,方便追蹤交易執行情況。
  4. 靈活的配置:提供多種配置選項,如圖表大小、分辨率、保存格式等。

使用方法

Backtrader 的繪圖功能依賴於 matplotlib 庫,因此在使用繪圖功能之前需要確保已經安裝了 matplotlib

繪圖通常在策略運行完畢後進行,使用 Cerebro 引擎的 plot() 方法來觸發繪圖過程:

cerebro = bt.Cerebro()
# 添加數據、策略等
cerebro.run()
cerebro.plot()

自定義繪圖

雖然 Backtrader 提供了一些預設的繪圖配置,但開發者可以通過修改 plot 方法的參數來自定義繪圖行為,例如:

cerebro.plot(style='candle', barup='green', bardown='red')

此外,如果預設的繪圖功能不能滿足特定需求,開發者可以直接使用 matplotlib 的 API 在策略執行結果的基礎上進行自定義繪圖。

注意事項

  • 繪圖功能主要用於策略分析和調試階段,並不適合於實時交易環境。
  • 大量數據和複雜的圖表可能會導致繪圖速度較慢,需合理配置圖表的細節。
  • 在某些環境(如無頭服務器)中,可能需要進行額外配置才能使用繪圖功能。

結論

Backtrader 的繪圖功能是一個強大的分析工具,使得策略的可視化分析變得簡單和直觀。通過合理利用這一功能,開發者可以更有效地理解和優化他們的交易策略。

定時器(Timer)

在 Backtrader 中,定時器(Timer)功能允許策略在特定時間點觸發事件。這使得策略能夠基於時間條件(如特定時間、日期或交易周期)而非僅僅是市場數據的變化來執行操作。定時器功能提供了額外的靈活性,讓策略能夠實珀更複雜的交易邏輯,如定期重新平衡投資組合、定時執行市場分析等。

主要特性

  1. 定期執行:可以設置定時器在固定時間間隔(每日、每週、每月等)觸發事件。
  2. 特定時間點觸發:也可以設置定時器在特定的日期和時間觸發。
  3. 自定義事件處理:當定時器觸發時,可以執行自定義的事件處理函數,如買賣操作、日誌記錄等。

使用方法

在策略中使用定時器涉及到以下幾個步驟:

  1. 在策略的 __init__ 方法中添加定時器:使用 add_timer 方法設置定時器的觸發條件。
  2. 實現 notify_timer 方法:當定時器觸發時,notify_timer 方法將被調用,你可以在這裡實現定時器的事件處理邏輯。

示例

以下是一個簡單的示例,展示了如何在每個交易日的開盤時刻觸發定時器:

import backtrader as bt

class MyStrategy(bt.Strategy):
    def __init__(self):
        # 在每個交易日的開盤時觸發定時器
        self.add_timer(
            when=bt.Timer.SESSION_START,
            weekdays=[0, 1, 2, 3, 4],  # 周一到周五
            weekcarry=True,  # 如果當日沒有數據,則延至下一個交易日
        )

    def notify_timer(self, timer, when, *args, **kwargs):
        # 定時器觸發時的操作
        print(f'Timer triggered at: {when}')
        # 這裡可以放置策略邏輯,如買賣操作等

在這個示例中,add_timer 方法被用來設置一個定時器,該定時器將在每個交易日的開盤時刻觸發。當定時器觸發時,notify_timer 方法被調用,並執行相應的操作。

注意事項

  • 定時器的觸發條件非常靈活,可以根據策略的需求設置特定的時間點或周期。
  • 在實際應用中,使用定時器時需要考慮策略的執行環境和交易市場的開放時間,以確保定時器的觸發與市場活動相匹配。

定時器是 Backtrader 框架中一個強大的功能,它為策略提供了基於時間觸發的靈活性,使策略能夠更好地適應各種交易需求和條件。

定期定額策略

定期定額買入策略(也稱作定期投資或定投)是一種長期投資策略,它忽略市場的波動,按照固定的時間間隔(如每月、每季)投入固定金額購買某一資產。這種策略的優點在於它可以平滑市場波動的影響,並且透過長期累積和複利效應來增加投資回報。接下來,我們將使用 Backtrader 來實現一個簡單的定期定額買入策略。

定期定額買入策略的實現

以下是一個使用 Backtrader 實現定期定額買入策略的範例。這個策略將會在每個月的第一個交易日買入固定金額的股票。

import backtrader as bt
import datetime

class PeriodicInvestmentStrategy(bt.Strategy):
    params = (
        ('investment_amount', 1000),  # 每期投資金額
        ('printlog', True),  # 是否打印交易日志
    )

    def __init__(self):
        self.order = None
        self.add_timer(
            when=bt.Timer.SESSION_START,
            monthdays=[1],  # 每月的第一天
            monthcarry=True,  # 如果第一天不是交易日,則延至下一個交易日
        )

    def notify_timer(self, timer, when, *args, **kwargs):
        self.log('進行定期投資')
        self.order = self.buy(size=self.params.investment_amount)

    def log(self, txt, dt=None):
        ''' 日誌函數 '''
        dt = dt or self.datas[0].datetime.date(0)
        if self.params.printlog:
            print('%s, %s' % (dt.isoformat(), txt))

    def notify_order(self, order):
        if order.status in [order.Completed]:
            if order.isbuy():
                self.log('買入執行, 價格: %.2f, 成本: %.2f, 手續費: %.2f' %
                         (order.executed.price,
                          order.executed.value,
                          order.executed.comm))

            elif order.issell():
                self.log('賣出執行, 價格: %.2f, 成本: %.2f, 手續費: %.2f' %
                         (order.executed.price,
                          order.executed.value,
                          order.executed.comm))

            self.bar_executed = len(self)

        elif order.status in [order.Canceled, order.Margin, order.Rejected]:
            self.log('訂單 取消/保證金不足/拒絕')

        self.order = None

# 初始化 Cerebro 引擎
cerebro = bt.Cerebro()
cerebro.addstrategy(PeriodicInvestmentStrategy)

# 添加數據
data = bt.feeds.YahooFinanceData(dataname='AAPL',
                                 fromdate=datetime.datetime(2019, 1, 1),
                                 todate=datetime.datetime(2020, 12, 31))
cerebro.adddata(data)

# 設置初始資本
cerebro.broker.setcash(10000.0)

# 設置每筆交易的手續費
cerebro.broker.setcommission(commission=0.001)

# 執行策略
cerebro.run()

# 繪製結果
cerebro.plot()

在這個策略中,我們使用了 add_timer 方法來定時執行交易,並且在每個月的第一個交易日執行買入操作,購買固定金額的股票。通過調整 investment_amount 參數,您可以設置每次定投的金額。

這個策略非常簡單,但它很好地展示了如何在 Backtrader 中實現定期定額投資。您可以根據自己的需求調整策略,例如改變投資頻率或金額,或是根據市場條件調整投資策略。

參考資料

官方教學文件
Notebook - Automatic Inline Plotting
Python量化
用40分鐘學會專業回測工具 - backtrader基本操作

Python基礎系列文章

分享所學貢獻社會
[Python教學]開發工具介紹
[開發工具] Google Colab 介紹
[Python教學] 資料型態
[Python教學] if判斷式
[Python教學] List 清單 和 Tuple元組
[Python教學] for 和 while 迴圈
[Python教學] Dictionary 字典 和 Set 集合
[Python教學] Function函示
[Python教學] Class 類別
[Python教學] 例外處理
[Python教學] 檔案存取
[Python教學] 實作密碼產生器
[Python教學] 日期時間
[Python教學] 套件管理

Python 爬蟲系列文章

[Python爬蟲] 網路爬蟲
[Python爬蟲] 分析目標網站
[Python爬蟲] 發送請求與解析網站內容
[Python爬蟲] Requests 模組
[Python爬蟲] Beautiful Soup 模組
[Python爬蟲] Selenium 模組
[Python爬蟲] Pandas模組

Python 投資

[Python投資] YFinance 模組
[Python投資] Backtrader 模組

訂閱免費電子報

我們推出電子報拉,歡迎大家訂閱免費電子報,會接收到分享的程式文章,
透過閱讀文章,今天比昨天進步一點,每天的一小步,就是未來的一大步。
訂閱免費電子報
Facebook 粉絲頁 - TechMasters 工程師養成記
同步分享到部落格


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言