Backtrader-Date Feeds之如何加载数据

龙永思
2023-12-01

Backtrader-Date Feeds之如何加载数据

第一步:把数据下载到本地存为CSV文件

把金融数据下载到本地有很多方法,使用金融数据接口是比较快捷的一种,我平时用的比较多的是Tushare,数据还是比较全的,有积分就可以查数据,https://tushare.pro/register?reg=413258,我ID是413258,如果如果注册可以填我的邀请码。
下面是三个我比较常用的数据查找代码

  1. 自动化查询一个股票的日行情+pb和pe指标
import pandas as pd
import os
os.getcwd()
from jqdatasdk import *
auth('你的账号','密码')
import tushare as ts
pro = ts.pro_api()
###选择查询种类
def acquire_code():
    input_code = input("请输入查询代码:(000001.SZ)\n")
    input_start_dt = input("请输入开始时间:(20200101)\n")
    input_end_dt = input("请输入结束时间:(20200101)\n")
    df = ts_get_daily_stock(input_code,input_start_dt,input_end_dt)
    print('-' * 50)
    print(df.info())
    # print('-'*50)
    # print(df.describe())
    path = input_code+'.csv'
    df.to_csv(path)
###获取ts股票日行情数据+指标  
#ts_code trade_date open   high   low    close  pre_close  change pct_chg    vol    amount pe_ttm pb
def ts_get_daily_stock(code,start_dt,end_dt):
    data = pro.daily(ts_code = code,start_date = start_dt,end_date=end_dt)
    df = pro.daily_basic(ts_code = code,start_date = start_dt,end_date=end_dt,fields = 'pe_ttm,pb')
    data['pe_ttm']=df['pe_ttm']
    data['pb']=df['pb']
    data['trade_date'] = pd.to_datetime(data['trade_date'])
    data.index = data['trade_date']
    data = data[
        ['ts_code', 'open', 'high', 'low', 'close', 'pre_close', 'change', 'pct_chg', 'vol', 'amount',
         'pe_ttm', 'pb']]
    return data
acquire_code()

2.查询某个时间段内的股息率

###获取某个时间段的股息率  但是由于ts每分钟调用接口200次,所以会有限制,可以设置time.sleep函数
import tushare as ts
import os
os.getcwd()
pro = ts.pro_api()
import pandas as pd
start_dt = 20060211
end_dt = 20210222

data = pd.DataFrame()
for i in range(start_dt,end_dt):
    i = str(i)
    df = pro.daily_basic(ts_code='', trade_date=i, fields='ts_code,trade_date,dv_ratio').sort_values(by='dv_ratio',ascending= False)
    df['trade_date'] = pd.to_datetime(df['trade_date'])
    df.index = df['trade_date']
    df = df[['ts_code','dv_ratio']]
    data = data.append(df)
    i = int(i)

print(data.info())
start_dt = str(start_dt)
end_dt = str(end_dt)
path = start_dt+'_'+end_dt+'股息率.csv'
data.to_csv(path)

3.因为很多股票都是6、7月分红,所以查询每年8月第一个交易日的股息率

##8月第一个交易日前30的股息率###########
import tushare as ts
import os
import time
start_tm = time.process_time()
os.getcwd()
pro = ts.pro_api()
import pandas as pd
start_dt = 20060222
end_dt = 20210222

data = pd.DataFrame()
i = start_dt
while i < end_dt:
    i = str(i)
    if i[4:6]=='08':
        df = pro.daily_basic(trade_date = i,fields='ts_code,trade_date,dv_ratio').head(1)
        if len(df.index)==0:
            i = int(i)
            i+=1
        else:
            df = pro.daily_basic(ts_code='', trade_date=i, fields='ts_code,trade_date,dv_ratio').sort_values(by='dv_ratio',ascending= False).head(30)
            df['trade_date'] = pd.to_datetime(df['trade_date'])
            df.index = df['trade_date']
            df = df[['ts_code','dv_ratio']]
            data = data.append(df)
            i = int(i)
            i = i - 20  #回到8月份日期之前
            i += 10000  #到下一年
    else:
        i = int(i)
        i+=1

print(data.info())
start_dt = str(start_dt)
end_dt = str(end_dt)
path = start_dt+'_'+end_dt+'8月第一个交易日前30的股息率.csv'
data.to_csv(path)
end_tm = time.process_time()
print('运行时间:',end_tm-start_tm)

第二步:加载数据到backtrader

backtrader可以对接各种数据源,最常见的是基于CSV格式的各种数据来源,如雅虎,VisualChart ,Backtrader CSV ,Generic CSV ;并且提供了相应的方法可以自定义自己想要的数据格式;并且可以对接各种数据库,如mysql。

----------加载单个数据---------------
import backtrader as bt
# 读取相应的数据并加载
data = bt.feeds.GenericCSVData(dataname='wheremydatacsvis.csv')
# 实例化一个cerebro
cerebro = bt.Cerebro()
# 把数据加载到cerebro中
cerebro.adddata(data,name=None)

----------加载多个数据---------------
import backtrader as bt
cerebro = bt.Cerebro()
# 循环所有的数据
for file_name in file_list:
	data = bt.feeds.GenericCSVData(dataname=datapath+file)
	# 把数据加载到cerebro中
	cerebro.adddata(data,name=file_name)

我使用比较多的是GenericCSVData,这里详细介绍一下GenericCSVData的参数

-----------------------------------
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
)

第三步:如何获取加载之后的数据

数据加载过后,会按照加载的顺序保存到self.datas中,self.datas是一个列表,可以使用for循环。
如果没有在加载数据的时候,对每个数据指定名称,那么,就可以按照加载数据的先后次序获得数据,第一个数据可以使用self.data0来获得,第二个数据可以使用self.data1来获得,以此类推。
如果加载数据的时候,对于加载的数据指定了名称,那么,就可以使用使用self.getdatabyname(“数据的名称”)来获得相应的数据。

 类似资料: