Backtrader 量化回测实践(3)—— 主要对象理解
在策略中使用的大部分数据形式:包括Indicator 、signal 、逻辑操作符、数学计算、切片访问的研究测试。
重新回顾一下使用的主要对象,理解对象的性质,如何在实践中应用 。
1.Data Feeds
首先是data ,数据对象的核心是Lines 。数据元素则是python的数据类型:float/ string / int
print('data:')
print(type(self.data))
print(type(self.data.close))
print(type(self.data.close[0]))
结果是:
data:
<class ‘backtrader.feeds.pandafeed.PandasData’>
<class ‘backtrader.linebuffer.LineBuffer’>
<class ‘float’>
2.Strategy
在策略中,将使用Indicator ,signal ,数据计算,数据切片的处理,数据处理之后的对象是什么类型,将影响在策略中如何合理使用这些对象。
(1)Indicator
最简单的Indicator ,就是是内置的方法,使用SMA指示器:
# indicator
self.sma1 = btind.SimpleMovingAverage(self.data.close, period=self.p.period2)
self.sma2 = btind.SimpleMovingAverage(self.data.close, period=self.p.period1)
看一下sma1 和 sma2的数据类型
sma:
<class ‘backtrader.indicators.sma.SimpleMovingAverage’>
<class ‘backtrader.indicators.sma.SimpleMovingAverage’>
定义的指示器的SimpleMovingAverage 类型。
从源代码中,sma.py中,类的初始化部分,说明SimpleMovingAverage也是lines的子类:
self.lines[0] = Average(self.data, period=self.p.period)
初始化代码:
def __init__(self):
# Before super to ensure mixins (right-hand side in subclassing)
# can see the assignment operation and operate on the line
self.lines[0] = Average(self.data, period=self.p.period)
super(MovingAverageSimple, self).__init__()
再看一下sma的长度:
print(self.sma1.buflen(),self.sma2.buflen(),self.data.close.buflen())
结果:
1217 1217 1217
理解: data和sma 都是 一样的长度,实际上data是pandas的dataframe ,只不过data.close是索引为日期的dataframe ,而sma是索引为数字的dataframe 。都是在Backtrader中被重写定义了新的数据类型。
但是两者之间的数据关系,是一一对应的。
在next()中,数据的日期和sma数据是对应的。
print(self.data0.datetime.date(),self.sma1[0],self.signal[0])
结果:
2016-02-19 23.8685 0.0
理解:
data0 :数据源0
self.data0.datetime.date():当前数据的索引datetime的值
sma1[0] :sma1当前的数据值
在next()执行过程中,同步移动。
(2)signal
在init中直接生成操作信号标志:
# indicator signal
self.signal = btind.CrossOver(self.sma2,