Backtrader 回測工具

更新 發佈閱讀 11 分鐘
投資理財內容聲明
raw-image

Backtrader 是一個非常受歡迎且功能強大的 Python 回測框架,主要用於量化交易策略的開發、測試與實盤交易。它支援各種市場資料(如股票、期貨、外匯、加密貨幣等)以及多種回測功能,並且能夠輕鬆地擴展以適應各種交易策略。

Backtrader 的核心概念與結構

Backtrader 主要由以下幾個核心組件構成:

  1. 策略 (Strategy)
    策略是 Backtrader 的核心,代表了用戶的交易邏輯。在策略中,你可以定義買賣條件、風險控制等行為。策略是繼承 bt.Strategy 類來實現的。
  2. 資料 (Data)
    資料是 Backtrader 回測中用來運行策略的市場數據。資料可以來自各種來源,比如 CSV、SQL、API、Pandas DataFrame 等。Backtrader 支援多種類型的市場資料,如時間序列資料(K 線圖)。
  3. 回測引擎 (Cerebro)
    Cerebro 是 Backtrader 的回測引擎,它負責組織策略、資料和其他元素。你可以在 Cerebro 中設定回測的初始資金、交易費用、保證金比例等參數。
  4. 指標 (Indicators)
    Backtrader 提供了大量內建的技術指標,如簡單移動平均 (SMA)、相對強弱指標 (RSI)、移動平均收斂發散指標 (MACD) 等,這些可以直接使用在策略中,也支援自定義指標。
  5. 交易 (Broker)
    Broker 是處理交易執行的組件,負責計算資金變動、手續費、執行訂單等。它是策略的背後支持,會與市場資料交互。


Backtrader 的主要功能

  1. 回測 (Backtesting)
    Backtrader 最核心的功能就是回測,它能夠將你的策略運行在歷史市場數據上,幫助你評估策略的效果。你可以設定初始資金、交易費用、手數等,並查看回測的結果和資金曲線。
  2. 優化 (Optimization)
    Backtrader 支援策略優化,你可以對策略的參數進行多維度的搜尋和測試(例如對移動平均線的時間窗進行優化),從而找出最佳的參數設置。
  3. 實盤交易 (Live Trading)
    除了回測,Backtrader 也可以用來進行實盤交易,並且支援與許多券商 API 的整合(如 Interactive Brokers、Binance、OANDA、Alpaca 等)。你可以直接將回測策略應用於實際的交易中。
  4. 多策略回測 (Multiple Strategies)
    Backtrader 允許同時運行多個策略,你可以在同一個回測中測試多個策略的表現,或者在不同的市場條件下使用不同策略。
  5. 多資料回測 (Multiple Data Feeds)
    你可以將多個資料來源加入到同一個回測中,比如同時使用多個市場或多幣種資料進行回測,這對於跨市場或多樣化的策略非常有用。
  6. 視覺化 (Visualization)
    Backtrader 提供了內建的圖表功能,可以將回測結果可視化,顯示策略的資金曲線、持倉情況、指標線以及買賣信號等。

Backtrader 範例解說

以下是一個簡單的範例,展示如何使用 Backtrader 進行回測。

範例:簡單的移動平均交叉策略

import backtrader as bt
import pandas as pd

# 策略定義
class SMACross(bt.Strategy):
def __init__(self):
# 定義兩條簡單移動平均線(SMA
self.sma1 = bt.indicators.SMA(self.data.close, period=10) # 10SMA
self.sma2 = bt.indicators.SMA(self.data.close, period=30) # 30SMA

def next(self):
# 進行買賣操作
if not self.position: # 如果目前沒有持倉
if self.sma1[0] > self.sma2[0]: # 當短期SMA上穿長期SMA
self.buy()
elif self.sma1[0] < self.sma2[0]: # 如果短期SMA下穿長期SMA
self.sell()

# 從 CSV 載入市場數據
df = pd.read_csv('BTCUSD.csv', parse_dates=['Date'])
df.set_index('Date', inplace=True)

# 將資料轉換成 Backtrader 可用的格式
data = bt.feeds.PandasData(dataname=df)

# 建立回測引擎
cerebro = bt.Cerebro()

# 添加策略到引擎
cerebro.addstrategy(SMACross)

# 添加資料
cerebro.adddata(data)

# 設定初始資金
cerebro.broker.setcash(100000)

# 執行回測
print(f'初始資金: {cerebro.broker.getvalue():.2f}')
cerebro.run()
print(f'最終資金: {cerebro.broker.getvalue():.2f}')

# 顯示回測結果圖
cerebro.plot()

Backtrader 的工作流程概覽

  1. 策略開發:用戶定義策略的邏輯,設定買賣條件、止盈止損等。
  2. 資料輸入:從 CSV、API 或其他來源載入歷史市場數據。
  3. 設定回測引擎:配置回測的初始資金、交易費用、槓桿等。
  4. 回測執行:將策略應用於資料上,進行回測,並查看結果。
  5. 結果分析:查看回測結果、資金曲線等,並根據結果調整策略。
  6. 優化與實盤:優化策略的參數並將策略應用於實際交易。


這個有什麼用呢?

像是回測完發現不錯的參數

就可以打包成函數

例如我之前的專案

https://github.com/skywalker0803r/telegram-investment_crypto-advice-bot

def get_signal_fast(
pair='BTCUSDT',
freq='15m',
n_bar = 10000,
client = None,
n1 = 65,
n2 = 95,
):

# get data
ohlcv = finlab_crypto.crawler.get_nbars_binance(pair,freq,n_bar,client)

# get signal table
table = pd.DataFrame()
table['close'] = ohlcv.close
table['n1'] = ohlcv.close.rolling(n1).mean()
table['n2'] = ohlcv.close.rolling(n2).mean()
table['buy'] = ((table['n1'] > table['n2']) & (table['n1'].shift() < table['n2'].shift())).astype(int)
table['sell'] = ((table['n1'] < table['n2']) & (table['n1'].shift() > table['n2'].shift())).astype(int)
table = table.replace(0,np.nan).tail(1)

# if buy and sell eqal np.nan pass
if table[['buy','sell']].sum().sum() == 0:
signal = 'PASS'
# if buy == 1
if table[['buy']].values[0][0] == 1:
signal = 'BUY'
# if sell == 1
if table[['sell']].values[0][0] == 1:
signal = 'SELL'

return signal,n1,n2,table['close'].values[-1]


裡面的

n1 = 65,

n2 = 95,

都是可以調整的

調完再寫一段自動化程式碼

# TRADING SETTING
pair='DOGEUSDT'
freq = '15m'
n_bar = 10000
n1 = 65
n2 = 95
quantity = 100

# MAIN
if __name__ == '__main__':
while True:

side,n1,n2,price = get_signal_fast(pair,freq,n_bar,client,n1,n2)

message = f"交易對:{pair}\n當前價格:{price}\n多空:{side}\n雙均線參數: n1 {n1} n2 {n2}\n現在時間:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
print(message)
send_to_telegram(message,apiToken,chatID)

if side != 'PASS':
order_result = place_order(symbol=pair,side='SELL',client=client,quantity = quantity)
print(order_result)
send_to_telegram(f'執行下單函數結果:{order_result}\n',apiToken,chatID)

time.sleep(60*15)
os.system("cls")

讓他自動執行即可


留言
avatar-img
于正龍(Ricky)的沙龍
55會員
86內容數
人工智能工作經驗跟研究
2025/04/15
這個簡陋的網站是我做的簡單幾個功能 1.股票走勢圖配上買賣點 2.近期買賣信號機率 參考自這篇論文: https://www.researchgate.net/profile/Omer-Sezer/publication/324802031_Algorithmic_Financial_T
Thumbnail
2025/04/15
這個簡陋的網站是我做的簡單幾個功能 1.股票走勢圖配上買賣點 2.近期買賣信號機率 參考自這篇論文: https://www.researchgate.net/profile/Omer-Sezer/publication/324802031_Algorithmic_Financial_T
Thumbnail
2025/03/12
最近發現一個雲端 Cloud Application Platform | Render 非常的好用可以把我之前做的自動化交易程式做部屬 用不到150行python代碼打造專屬你自己的自動化binance自動下單交易程式 使用教學 1.建立專案 2.選Cron job
Thumbnail
2025/03/12
最近發現一個雲端 Cloud Application Platform | Render 非常的好用可以把我之前做的自動化交易程式做部屬 用不到150行python代碼打造專屬你自己的自動化binance自動下單交易程式 使用教學 1.建立專案 2.選Cron job
Thumbnail
2023/10/31
一個實用的python程序快速幫你過濾出成交量大增的虛擬貨幣 金融界有一句很知名的話 量先行 通常成交量放大伴隨而來的就是股價的拉抬 重點就在這裡,但是投資人總不可能一擋一擋去看成交量吧太花時間了 這段程式碼就是快速篩選出市場上成交量徒增的虛擬貨幣 from binance.client
Thumbnail
2023/10/31
一個實用的python程序快速幫你過濾出成交量大增的虛擬貨幣 金融界有一句很知名的話 量先行 通常成交量放大伴隨而來的就是股價的拉抬 重點就在這裡,但是投資人總不可能一擋一擋去看成交量吧太花時間了 這段程式碼就是快速篩選出市場上成交量徒增的虛擬貨幣 from binance.client
Thumbnail
看更多
你可能也想看
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
別讓你的房子,變成家中最大的「閒置資產」 作為一名服務高淨值客戶的私人銀行顧問,我每天的任務只有一個:幫客戶「讓錢滾動」。然而,當我觀察身旁許多同樣育有子女的朋友們,即便他們多半已是職場上的中高階主管,表面上看似光鮮亮麗,有房有車;但實際上,大家都是典型的「夾心世代」。每個月薪水一入帳,扣掉沉重的
Thumbnail
別讓你的房子,變成家中最大的「閒置資產」 作為一名服務高淨值客戶的私人銀行顧問,我每天的任務只有一個:幫客戶「讓錢滾動」。然而,當我觀察身旁許多同樣育有子女的朋友們,即便他們多半已是職場上的中高階主管,表面上看似光鮮亮麗,有房有車;但實際上,大家都是典型的「夾心世代」。每個月薪水一入帳,扣掉沉重的
Thumbnail
本策略主要用在盤勢強勢上漲時,等待盤勢拉回且維持在長紅K棒之上,進行的拉回買進策略,目的是不追高買進,讓順勢過程中確保成本不必追高的交易策略。 此策略主要是針對看盤的經驗,將策略轉化為程式進行自動化交易,減少人為的操作,即使沒看盤也能自動化的完成交易。
Thumbnail
本策略主要用在盤勢強勢上漲時,等待盤勢拉回且維持在長紅K棒之上,進行的拉回買進策略,目的是不追高買進,讓順勢過程中確保成本不必追高的交易策略。 此策略主要是針對看盤的經驗,將策略轉化為程式進行自動化交易,減少人為的操作,即使沒看盤也能自動化的完成交易。
Thumbnail
本策略採用台指期五分K的成交量進行判斷是否夜盤是否為弱勢盤,當成交量能達到當日一定的量能時,順勢向下的盤面機率就會增加,適合空方的順勢盤面。 此策略主要是針對看盤的經驗,將策略轉化為程式進行自動化交易,減少人為的操作,即使沒看盤也能自動化的完成交易。
Thumbnail
本策略採用台指期五分K的成交量進行判斷是否夜盤是否為弱勢盤,當成交量能達到當日一定的量能時,順勢向下的盤面機率就會增加,適合空方的順勢盤面。 此策略主要是針對看盤的經驗,將策略轉化為程式進行自動化交易,減少人為的操作,即使沒看盤也能自動化的完成交易。
Thumbnail
本策略採用台指期五分K的成交量進行判斷是否當日為弱勢盤,當成交量能達到當日一定的量能時,當日順勢向下的盤面機率就會增加,適合空方的順勢盤面。 此策略主要是針對看盤的經驗,將策略轉化為程式進行自動化交易,減少人為的操作,即使沒看盤也能自動化的完成交易。
Thumbnail
本策略採用台指期五分K的成交量進行判斷是否當日為弱勢盤,當成交量能達到當日一定的量能時,當日順勢向下的盤面機率就會增加,適合空方的順勢盤面。 此策略主要是針對看盤的經驗,將策略轉化為程式進行自動化交易,減少人為的操作,即使沒看盤也能自動化的完成交易。
Thumbnail
本策略採用5、30分K的支撐與壓力進行突破買進與跌破賣出策略,透過盤中的量能變化進行買賣操作策略,該指標能夠真實地反映出價格的波動情況,並且可以靈活地調整參數進行進出場操作。 此策略主要是針對看盤的經驗,將策略轉化為程式進行自動化交易,減少人為的操作
Thumbnail
本策略採用5、30分K的支撐與壓力進行突破買進與跌破賣出策略,透過盤中的量能變化進行買賣操作策略,該指標能夠真實地反映出價格的波動情況,並且可以靈活地調整參數進行進出場操作。 此策略主要是針對看盤的經驗,將策略轉化為程式進行自動化交易,減少人為的操作
Thumbnail
用多空趨勢線串聯股市金脈簡單來說內建一套投資邏輯,這套系統基於經濟學中的「適應性預期理論」發展而來,主要依賴過去的觀察和經驗來進行投資。這本書橫跨了產業面、基本面、技術面與籌碼面,我覺得下面的重點,你可以思考一下對你的投資有沒有幫助。
Thumbnail
用多空趨勢線串聯股市金脈簡單來說內建一套投資邏輯,這套系統基於經濟學中的「適應性預期理論」發展而來,主要依賴過去的觀察和經驗來進行投資。這本書橫跨了產業面、基本面、技術面與籌碼面,我覺得下面的重點,你可以思考一下對你的投資有沒有幫助。
Thumbnail
本策略基於《專業投機原理》之精準趨勢線畫法,利用價格突破趨勢線、測試前波極值失敗、突破頸線之「1-2-3法則」確認趨勢反轉。雖有滯後風險,但能有效過濾雜訊並提供明確停損點,適合應用於高流動性標的之波段交易與風險控管。
Thumbnail
本策略基於《專業投機原理》之精準趨勢線畫法,利用價格突破趨勢線、測試前波極值失敗、突破頸線之「1-2-3法則」確認趨勢反轉。雖有滯後風險,但能有效過濾雜訊並提供明確停損點,適合應用於高流動性標的之波段交易與風險控管。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News