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)
...
Tip:
*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)
Omitting the Data Feeds
class MyStrategy(bt.Strategy):
params = dict(period=20)
def __init__(self):
sma = btind.SimpleMovingAverage(period=self.params.period)
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('平均线高于收盘价格')
常见的缩写形式
- 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', )
访问:
- 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:
...
Lines len
线对象