backtrader 数据源相关的几个问题
backtrader 是量化分析中最好框架之一,方便,功能强大。
使用backtrader之前(其他所有回测框架也一样),首先需要解决数据来源问题。
一般的文档大都一来就拿别的数据来作为示例,真正说到点子的并非很多。
本文针对自己遇到的几个问题捋一捋,希望有助于使用者。
一、数据来源
1、tushare
挖地兔的tushare是股市分析的必备数据来源,最近改善后变成了pro版,也从免费版变成了需要积分才能使用,不过好在获取基本的数据,只要注册后基本就可以使用
优点:数据准确,取数方便
缺点:没有港股等数据,需要一定积分,有一定次数限制。
方法:
(1)旧接口
ts.get_k_data(code,autype='qfq',start=start,end=end)
每次使用都会提示你接口马上要过去,请用新接口替换;前复权的参数似乎没有用了,
(2)新接口
ts.set_token('xxxx token') #请用申请到的token取代
pro = ts.pro_api()
ts.pro_bar(ts_code=sCode, adj=sadj,start_date=sDate, end_date=eDate) # 带入参数
具体就不说了,可以参考挖地兔的文档。注意的是调用次数有限制。
2、东方财富
另一个数据源是各个网站,我自己使用感觉东方财富不错,基本上看得到的数据都能拿到。
其他如新浪等,虽然有一些接口,但网上语焉不详,大部分只有个别例子,Yahoo数据本来是比价受欢迎,可惜经常会因为在国外被墙,没办法使用。
例如:
tushare 缺少的港股数据,东方财富可以比较简单抓到:
def getHKCode(sDate,eDate): # 根据开始和结束日期获取港股数据
url = "http://datainterface3.eastmoney.com/EM_DataCenter_V3/api/GDZC/GetGDZC?tkn=eastmoney&cfg=gdzc&secucode=&fx=&sharehdname=&pageSize=500&pageNum=1&sortFields=BDJZ&sortDirec=1&startDate="+sDate+"&endDate="+eDate
response=requests.get(url)
items={}
items=response.text
items=eval(items)
item=items["Data"][0]
lsData=[]
for i in item["Data"]:
i=i.split('|')
lsData.append(i)
return lsData
这种例子很多,而且获得数据也很快。不过东方财富估计是雇佣了不同的人写不同的接口,并没有统一的标准,需要每个接口数据导出来后自己分析。
二、读入数据
1、读入办法
(1)dataframe 数据,最典型的是从tushare读取数据。
#使用tushare旧版接口获取数据
def get_data(code,start='2010-01-01',end='2020-03-31'):
df=ts.get_k_data(code,autype='qfq',start=start,end=end)
df.index=pd.to_datetime(df.date)
df['openinterest']=0
df=df[['open','high','low','close','volume','openinterest']]
return df
start=datetime(2010, 3, 31)
end=datetime(2020, 3, 31)
# 加载数据
df = get_data('000001')
data = bt.feeds.PandasData(dataname=df,fromdate=start,todate=end)
这种方法读到的数据是 class ‘backtrader.feeds.pandafeed.PandasData’
(2)csv 格式
# 先找到脚本的位置,然后根据脚本与数据的相对路径关系找到数据位置
# 这样脚本从任意地方被调用,都可以正确地访问到数据
modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
datapath = os.path.join(modpath, '000001.csv')
# 创建价格数据
data = bt.feeds.GenericCSVData(
dataname = datapath,
fromdate = datetime(2019, 11, 1),
todate = datetime(2021, 8, 29),
nullvalue = 0.0,
dtformat = ('%Y-%m-%d'),
datetime = 0,
open = 1,
high = 2,
low = 3,
close = 4,
volume = 5,
openinterest = -1
)
读到的数据格式是 class ‘backtrader.feeds.csvgeneric.GenericCSVData’
需要注意:
数据都不能用print直接输出,只能在策略中使用,采用backtrader的索引办法取数
数据格式中,只能容纳7列数据,即datetime,open,high,low,close,volume,openinterest(未平仓合约,国内股市数据一般用不到)
如果需要其他数据,则需要自己去扩展这些类