Backtrader是一个用python编写的回测和交易框架。功能强大,文档详细,开发社区也很活跃,出现问题容易得到支持。同时它还是一款开源的工具,需要的时候可以很方便地阅读和修改代码。
编写一个Backtrader回测程序很容易。
- 首先是编写一个自己的策略类;
- 然后调用执行这个策略。
实现策略类
一个简单的策略类只需要十几行代码。我们以一个简单的均线股票策略来示范(例子引自Backtrader官方文档):
import backtrader as bt
class SmaCross(bt.Strategy):
# 定义策略参数,可以在启动策略的时候调整这些参数
params = dict(
pfast=10, # 短期均线的交易日数量
pslow=30 # 长期均线的交易日数量
)
# 类初始化,对数据进行预处理,如增加需要的指标。
def __init__(self):
# 定义一个长期均线和短期均线
sma1 = bt.ind.SMA(period=self.p.pfast)
sma2 = bt.ind.SMA(period=self.p.pslow)
# 创建均线交叉(买入卖出)信号
self.crossover = bt.ind.CrossOver(sma1, sma2)
# 滚动处理每天的交易。日线数据是在每天收盘后调用,所以实际成交是在第二天。
def next(self):
# 没有持仓且短期均线上穿长期均线时买入
if not self.position:
if self.crossover > 0:
self.buy()
# 如果已经买入并且短期均线下穿长期均线则卖出
elif self.crossover < 0:
self.close()
这个非常简单的类做了三件事情:
- 继承bt.Strategy,这是在Backtrader中定义的策略基类。
- 在init方法中定义自己的数据。
- 在next方法中实现买入/卖出的逻辑
执行策略
定义好策略类,就可以初始化并运行策略了。
# 创建回测引擎实列
cerebro = bt.Cerebro()
# 创建数据流。框架原生支持从雅虎财经获取股票交易数据。
data = bt.feeds.YahooFinanceData(dataname='MSFT',
fromdate=datetime(2011, 1, 1),
todate=datetime(2012, 12, 31))
cerebro.adddata(data) # 添加数据流
cerebro.addstrategy(SmaCross) # 添加策略
cerebro.run() # 执行策略
cerebro.plot() # 显示回测结果
运行结果是这样的:
可以看到,简单的均线策略没有赚到钱,不过这里主要是演示怎么实现一个策略。
我们现在知道了怎么编写一个简单的Backtrader实现,下一步是实现自己的期权策略。