在原先的文章中,简单分享了从哪里获取数据,本文主要讲解,如何把数据加载到 backtrader 中。
backtrader 可以对接各种数据源,最常见的是基于 CSV 格式的各种数据来源,如雅虎,VisualChart ,Backtrader CSV ,Generic CSV ;并且提供了相应的方法可以自定义自己想要的数据格式;并且可以对接各种数据库,如 mysql。
import backtrader as bt
# 读取相应的数据并加载
data = bt.feeds.YahooFinanceCSVData(dataname='wheremydatacsvis.csv')
# 实例化一个 cerebro
cerebro = bt.Cerebro()
# 把数据加载到 cerebro 中
cerebro.adddata(data,name=None) 上面的代码,是一个典型的加载数据的方式,如果要加载多个数据,可以循环加入进去,并且可以对每个数据指定名称,并通过这个名称获取到这个数据。
import backtrader as bt
# 实例化一个 cerebro
cerebro = bt.Cerebro()
# 循环所有的数据
for file_name in file_list:
data = bt.feeds.YahooFinanceCSVData(dataname=datapath+file)
# 把数据加载到 cerebro 中
cerebro.adddata(data,name=file_name) 加载数据开了一个头,下面还会详细讲,如何加载,以及各个参数的意义。下面,简单介绍下,如何获取加载过后的数据。
数据加载过后,会按照加载的顺序保存到 self.datas 中,self.datas 是一个列表,可以使用 for 循环。
如果没有在加载数据的时候,对每个数据指定名称,那么,就可以按照加载数据的先后次序获得数据,第一个数据可以使用 self.data0 来获得,第二个数据可以使用 self.data1 来获得,以此类推。
如果加载数据的时候,对于加载的数据指定了名称,那么,就可以使用使用 self.getdatabyname(“数据的名称”)来获得相应的数据。
常见的一些 datafeed 的参数,主要包括如下:
dataname:默认是 None,这个是必须要提供的,代表数据的地址或者数据的名称,用于明确,加载哪个数据
name : 默认是"",主要用于画图的时候,装饰使用。如果没有指定的话,会根据 dataname 来确定。
fromdate:默认是最小时间,这个参数意味着,当数据的时间小于这个时间的时候,这个时间的数据将会被忽略。
todate:默认是最大时间,这个参数意味着,当数据的时间大于这个时间的时候,这个时间的数据将会被忽略。
fromdate 和 todate 确定了回测的时候的开始的时间和结束的时间。
timeframe:默认是 TimeFrame.Days,可以选择的值,还有 Ticks,Seconds,Minutes,Days,Weeks,Months,Years.
compression:默认是 1,每个 bar 需要的实际的 bar 的个数,只有在 resampling 和 replaying 中才有效
sessionstart 和 sessionend:默认是 None,在 resample 的时候使用。
csv Data 的一些额外参数:
header:默认是 True,意味着传入的数据的第一行是各个列的名称。
separator:默认是",",用于分割 csv 文件。
GenericCsvData 的一些额外参数:
通过这个类,可以加载基本上,所有的 csv 文件。这个类,也是在做回测中,用的频率相对来说比较高的。
dataname:数据的名称或者数据的地址
datetime:默认是 0,包含日期和时间数据的列
time:默认是-1,包含时间数据的列,-1 意味着不显示这个数据。
open(默认 1),high(默认 2),low(默认 3),close(默认 4),volume(默认 5),openinterest(默认 6)
nullvalue:默认是 float(“NaN”),如果 csv 数据中,某个地方是空值,就会使用 nullvalue 来代替
dtformat:默认格式是“%Y-%m-%d %H:%M:%S”,传入的 datetime 包含日期和时间
tmformat:默认格式是“%H:%M:%S”
作者在其官网上,提供了一个使用 GenericCsvData 的案例。下面的代码,在加载数据的时候,做了如下的限制:
-
最早开始输入的时间是 2020 年
-
csv 文件的列是 HLOC 而不是我们默认的 OHLC,这意味着,我们要修改参数 open,high,low,close 的默认值
-
缺失的数据使用 0 代替
-
使用的是日数据,并且使用的格式为“YYYY-MM-DD”
-
没有 openinterest 的数据
import datetime
import backtrader as bt
import backtrader.feeds as btfeeds
...
...
data = btfeeds.GenericCSVData(
dataname='mydata.csv',
fromdate=datetime.datetime(2000, 1, 1),
todate=datetime.datetime(2000, 12, 31),
nullvalue=0.0,
dtformat=('%Y-%m-%d'),
datetime=0,
high=1,
low=2,
open=3,
close=4,
volume=5,
openinterest=-1
) 如果我们使用的数据的格式都是一样的,为了避免每次都输入那么多的参数,我们可以继承一个类,并设置相应的参数,这样,以后每次调用这个类加载数据就可以了。
import datetime
import backtrader.feeds as btfeeds
class MyHLOC(btfreeds.GenericCSVData):
params = (
('fromdate', datetime.datetime(2000, 1, 1)),
('todate', datetime.datetime(2000, 12, 31)),
('nullvalue', 0.0),
('dtformat', ('%Y-%m-%d')),
('tmformat', ('%H.%M.%S')),
('datetime', 0),
('time', 1),
('high', 2),
('low', 3),
('open', 4),
('close', 5),
('volume', 6),
('openinterest', -1)
)
data = btfeeds.MyHLOC(dataname='mydata.csv') 在这一讲里面,分享了加载数据的方法,主要的参数,以及如何获取数据,在接下来的一讲中,将会和大家分享,如何扩展数据。
在我的知乎文章【干货】backtrader 单因子回测框架—以上证 50 为例,使用了扩展数据,增加了 pb 和 pe 两个数据类型。