Backtrader
用于量化交易的机器人,可以对于数据进行有效回测和指定策略等。
基础概念
Data Feeds平台工作的基础将通过策略完成。这些将通过数据馈送,数据馈送以数组的形式自动提供给策略的成员变量,并提供数组位置的快捷方式。
class MyStrategy(bt.Strategy): params = dict(period=20) def __init__(self): sma = btind.SimpleMovingAverage(self.datas[0], period=self.params.period) ... cerebro = bt.Cerebro() ... data = btfeeds.MyFeed(...) cerebro.adddata(data) ... cerebro.addstrategy(MyStrategy, period=30) ...
12345678910111213141516171819Tip:
*args和**kwargs该策略的__init__方法可以接收使用 self.datas为一个数组/列表/可迭代对象,需要至少有一项数据 Shortcurs for Data Feeds self.data表示self.datas[0] self.dataX表示self.datas[X]class MyStrategy(bt.Strategy): params = dict(period=20) def __init__(self): sma = btind.SimpleMovingAverage(self.data, period=self.params.period) 12345 Omitting the Data Feeds
class MyStrategy(bt.Strategy): params = dict(period=20) def __init__(self): sma = btind.SimpleMovingAverage(period=self.params.period) 12345 Line
大部分对象都包含一个Line对象,用户角度上来看
它可以容纳一个或多个线,是一系列的线,是一组值的数组,放置在图表中表现为一条线比较经典的线是由股票收盘价形成的线,称为收盘时线
class MyStrategy(bt.Strategy): params = dict(period=20) def __init__(self): self.movav = btind.SimpleMovingAverage(self.data, period=self.params.period) def next(self): if self.movav.lines.sma[0] < self.data.lines.close[0]: print('平均线高于收盘价格') 123456789
常见的缩写形式
xxxx.lines -> xxx.l xxx.lines.name -> xxx.line_name self.data_name -> self.data.lines.name self.data1_name -> self.data1.lines.name Lines declaration定义对象中的线对象,可以采用line的类参数。
class SimpleMovingAverage(Indicator): lines = ('sma', ) 12
访问:
self.lines[0] -> self.lines.sma self.line -> self.lines[0] self.lineX -> self.lines[X] self.line_X -> self.lines[X] self.dataY -> self.data.lines[Y] self.dataX_Y -> self.data[X].lines[Y] Accessing lines in Data Feed通过省略形式访问lines数据
data = btfeeds.BacktraderCSVData(dataname="mydata.csv") ... class MyStrategy(bt.Strategy): ... def next(self): if self.data.close[0] > 30.0: ... 123456789 Lines len
线对象