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() |
| MACD | bt.indicators.MACD() |
| RSI | bt.indicators.RSI() |
| KDJ | bt.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
)
性能优化 #
加速技巧 #
- 减少数据频率:周线 > 日线 > 分时
- 优化指标:使用
fast参数的指标 - 批量计算:避免在 next() 中计算
- 内存管理:及时清理数据
常见问题 #
Q: 回测结果与实盘差距大?
答:检查 slippage、transaction costs、funding rates。
Q: 如何处理复权数据?
答:使用 adjustment 参数或自行处理。
Q: 支持短线交易吗?
答:支持。可配置融资融券、空头策略。
总结 #
Backtrader 量化交易的瑞士军刀。从原型到实盘,Python 一键搞定。
参考:backtrader 官方文档 更新:2026-05-18
💬 留言讨论