Skip to content

Latest commit

 

History

History
160 lines (104 loc) · 5.93 KB

File metadata and controls

160 lines (104 loc) · 5.93 KB

9、backtrader 的一些基本概念---feed 讲解(1)

原文:https://yunjinqi.blog.csdn.net/article/details/108983892

9、backtrader 的一些基本概念—feed 讲解(1)

在原先的文章中,简单分享了从哪里获取数据,本文主要讲解,如何把数据加载到 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 的案例。下面的代码,在加载数据的时候,做了如下的限制:

  1. 最早开始输入的时间是 2020 年

  2. csv 文件的列是 HLOC 而不是我们默认的 OHLC,这意味着,我们要修改参数 open,high,low,close 的默认值

  3. 缺失的数据使用 0 代替

  4. 使用的是日数据,并且使用的格式为“YYYY-MM-DD”

  5. 没有 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 两个数据类型。