1.1 datafeed
在一开始我们就讨论过datafeed,也就是cerebro的本源,数据。我们看一下上次我们的策略是怎么来的。
dataframe = pd.read_csv(‘dfqc.csv’, index_col=0, parse_dates=True) dataframe[‘openinterest’] = 0 data = bt.feeds.PandasData(dataname=dataframe, fromdate =
datetime.datetime(2015, 1, 1), todate =
datetime.datetime(2016, 12, 31) ) # Add the Data Feed to Cerebro cerebro.adddata(data)
我们的数据是从一个dfqc的csv文件里面来的,这里,可能大家没有这个数据,之前上传的csdn,不只是还没通过还是怎么的。今天就把他存到百度云,大家有需要的可以自行下载。这是东风汽车的股票数据,是从wind上获取的。大家没有wind也可以用tushare之类的免费api获得。
链接:http://pan.baidu.com/s/1slnULbv 密码:wi3k
文件里面的数据大概是这样的:
2014-03-13
00:00:00.005,1.425,1.434,1.449,1.418,457767208.02014-03-14
00:00:00.005,1.429,1.422,1.436,1.416,196209439.02014-03-17
00:00:00.005,1.433,1.434,1.437,1.422,250946201.02014-03-18
00:00:00.005,1.434,1.425,1.437,1.424,245516577.02014-03-19
00:00:00.005,1.423,1.419,1.423,1.406,331866195.02014-03-20
00:00:00.005,1.412,1.408,1.434,1.407,379443759.02014-03-21
00:00:00.005,1.406,1.463,1.468,1.403,825467935.0
dataframe = pd.read_csv(‘dfqc.csv’,
index_col=0, parse_dates=True)
大家注意我们把csv读入pandas的参数,index_col=0表示第一列时间数据是作为pandas 的index的,parse_dates=Ture是自动把数据中的符合日期的格式变成datetime类型。为什么要这样呢?其实读入后的pandas长怎么样都是由backtrader规定的。
1.2 strategy中的data
大家不知道有没有注意,strategy的初始化函数(init)中,
self.dataclose = self.datas[0].close
有这样一句。在backtrader中,self.datas[0] 与self.data是等价的,换句话说,同一个东西不同的叫法罢了。为什么会有前面这种,笔者认为,backtrader应当可以支持多个datafeed,目前还没有使用到,先按下不表。
看看前面的pandas的要求的结构,我们就知道,不仅仅有self.datas[0].close,还会有self.datas[0].open。也确实如此。只是我们通常拿close作为一个价格基准罢了。这里,
self.datas[0].close
返回的是一个lines。lines是backtrader一个很重要的概念,我们可以理解为时间序列流,这类数据,后面可以跟index,也就是说,可以有
self.datas[0].close[0]
self.datas[0].close[1]
self.datas[0].close[-1]
等等,但是这里的index是有意义的,0代表当前时刻,-1代表前一时刻,1代表后一时刻,一次类推。
所以在next中使用self.dataclose[0],self.dataclose[-1]就很好理解了。