0%

BackTrader入门

BackTrader回测入门

BackTrader模块

BackTrader框架主要由以下几个模块组成:

  • 数据加载(Data Feed):将交易策略的数据加载到回测框架中。
  • 交易策略(Strategy):该模块是编程过程中最复杂的部分,需要设计交易决策,得出买入/卖出信号。
  • 回测框架(Cerebro):运行主框架,需要设置一些参数
    • 初始资金
    • 佣金
    • 交易策略交易头寸大小
  • 策略分析(Analyzers):以图形和风险收益等指标对交易策略的回测结果进行评价

入门策略

策略介绍

本文主要目的为简单上手BackTrader回测框架,因此选取了最简单的均线交叉策略:短周期均线向上突破长期均线则买入,短期均线下穿长期均线则卖出。

回测数据选取BTC的15min一个月的历史k线(https://github.com/hi-bingo/binance_kline 可下载Binance上现货交易对的历史K线)

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import datetime
import backtrader as bt


class SmaCrossStrategy(bt.Strategy):
params = dict(
short_period=5,
long_period=20
)

def __init__(self):
# 定义短期和长期sma指标
self.short_term_sma = bt.ind.SMA(period=self.params.short_period)
self.long_term_sma = bt.ind.SMA(period=self.params.long_period)

def log(self, txt, dt=None):
dt = dt or bt.num2date(self.datas[0].datetime[0])
print('[{}] {}'.format(dt.isoformat(), txt))

def next(self):
if not self.position:
if self.short_term_sma[0] > self.long_term_sma[0]:
self.buy()
self.log('buy@{}'.format(self.data.close[0]))
else:
if self.short_term_sma[0] < self.long_term_sma[0]:
self.sell()
self.log('sell@{}'.format(self.data.close[0]))


if __name__ == '__main__':
cerebro = bt.Cerebro()
# 设置初始资金和交易手续费
cerebro.broker.setcash(1000000.0)
cerebro.broker.setcommission(commission=0.001)

data = bt.feeds.GenericCSVData(
dataname="data/BTC-USDT_15m_2021-07-01_2021-08-01.csv",
dtformat=lambda x: datetime.datetime.utcfromtimestamp(float(x) / 1000.0),
timeframe=bt.TimeFrame.Minutes,
datetime=0,
open=1,
high=2,
low=3,
close=4,
volume=5,
openinterest=-1
)

cerebro.adddata(data)
cerebro.addstrategy(SmaCrossStrategy)

print('初始资金: %.2f' % cerebro.broker.getvalue())
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='draw_down')
cerebro.addanalyzer(bt.analyzers.Returns, _name="returns")
strats_results = cerebro.run()
# run返回一个列表,应该是对应多策略回测结果
for result in strats_results:
print('最终资金: %.2f' % cerebro.broker.getvalue())
print('回撤指标:', result.analyzers.draw_down.get_analysis())
print('收益率指标:', result.analyzers.returns.get_analysis())