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(未平仓合约,国内股市数据一般用不到)
如果需要其他数据,则需要自己去扩展这些类

你可能感兴趣的:(Python,算法,量化分析,python,量化分析)