Backtrader:用 Python 进行 100x 更快的量化回测 2026 版

Backtrader 是 Python 事件驱动回测框架。支持股票、期货、加密货币。完善的指标、策略、分析。

  • ⭐ 9000
  • Python
  • Apache 2.0
  • 更新于 2026-05-18

什么是 Backtrader? #

Backtrader 是 Python 事件驱动回测框架。支持股票、期货、加密货币。从数据到策略到结果,一站式量化开发。

安装 #

pip install backtrader

基本用法 #

数据准备 #

import backtrader as bt
import yfinance as yf

# 获取数据
data = yf.download("AAPL", start="2020-01-01", end="2024-01-01")

# 创建 DataFeed
feed = bt.feeds.PandasData(dataname=data)
cerebro = bt.Cerebro()
cerebro.adddata(feed)

策略编写 #

class SMAStrategy(bt.Strategy):
    def __init__(self):
        self.sma = bt.indicators.SimpleMovingAverage(
            self.data.close, period=20
        )
    
    def next(self):
        if not self.position:
            if self.data.close[0] > self.sma[0]:
                self.buy()
        else:
            if self.data.close[0] < self.sma[0]:
                self.close()

cerebro.addstrategy(SMAStrategy)

执行回测 #

cerebro.broker.setcash(100000.0)
cerebro.run()
cerebro.plot()

核心组件 #

Cerebro 引擎 #

cerebro = bt.Cerebro()
cerebro.adddata(datafeed)
cerebro.addstrategy(MyStrategy)
cerebro.addobserver(bt.observers.Broker)
cerebro.addanalyzer(bt.analyzers.SharpeRatio)

经纪商设置 #

cerebro.broker.setcash(100000)
cerebro.broker.setcommission(commission=0.001)  # 0.1% 手续费

指标库 #

指标代码
移动平均bt.indicators.SMA()
MACDbt.indicators.MACD()
RSIbt.indicators.RSI()
KDJbt.indicators.Stoch()

进阶策略 #

多条件策略 #

class MultiConditionStrategy(bt.Strategy):
    def __init__(self):
        self.rsi = bt.indicators.RSI()
        self.sma = bt.indicators.SMA()
        self.macd = bt.indicators.MACD()
    
    def next(self):
        if (self.rsi < 30 and 
            self.data.close > self.sma and
            self.macd.histogram > 0):
            self.buy()

网格交易 #

class GridStrategy(bt.Strategy):
    def __init__(self):
        self.grid_levels = [-0.05, -0.02, 0, 0.02, 0.05]
        self.positions = {}
    
    def next(self):
        for level in self.grid_levels:
            price = self.data.close[0] * (1 + level)
            if self.can_entry(price):
                self.buy_at_price(price)

评估分析 #

常用分析器 #

# 年化收益
cerebro.addanalyzer(bt.analyzers.SharpeRatio)

# 最大回撤
cerebro.addanalyzer(bt.analyzers.DrawDown)

# 交易次数
cerebro.addanalyzer(bt.analyzers.TradeAnalyzer)

# 盈亏比
cerebro.addanalyzer(bt.analyzers.ProfitLoss)

获取结果 #

strat = results[0]
print(f"夏普比率: {strat.analyzers.sharpratio.get_analysis()}")
print(f"最大回撤: {strat.analyzers.drawdown.get_analysis()}")

实盘交易 #

实时数据 #

import backtrader as bt
from ib_insync import IB, Stock

ib = IB()
ib.connect('127.0.0.1', 7497, clientId=1)

# 实时数据
contract = Stock('AAPL', 'SMART', 'USD')
feed = bt.feeds.IBDatafeed(contract)
cerebro.adddata(feed)

交易执行 #

class LiveStrategy(bt.Strategy):
    def next(self):
        if self.conditions_met():
            self.order_target_percent(target=0.5)

常用数据源 #

Yahoo Finance #

data = bt.feeds.YahooFinanceData(
    dataname='AAPL',
    fromdate=datetime(2020, 1, 1),
    todate=datetime(2024, 1, 1)
)

Binance 加密货币 #

from backtest_binance import BinanceData

data = BinanceData(symbol='BTCUSDT', interval='1h')

本地 CSV #

data = bt.feeds.GenericCSVData(
    dataname='data/AAPL.csv',
    dtformat='%Y-%m-%d',
    datetime=0, open=1, high=2, low=3, close=4, volume=5
)

性能优化 #

加速技巧 #

  1. 减少数据频率:周线 > 日线 > 分时
  2. 优化指标:使用 fast 参数的指标
  3. 批量计算:避免在 next() 中计算
  4. 内存管理:及时清理数据

常见问题 #

Q: 回测结果与实盘差距大?

答:检查 slippage、transaction costs、funding rates。

Q: 如何处理复权数据?

答:使用 adjustment 参数或自行处理。

Q: 支持短线交易吗?

答:支持。可配置融资融券、空头策略。

总结 #

Backtrader 量化交易的瑞士军刀。从原型到实盘,Python 一键搞定。


参考:backtrader 官方文档 更新:2026-05-18

📦 出现在以下合集中

💬 留言讨论