把金融数据下载到本地有很多方法,使用金融数据接口是比较快捷的一种,我平时用的比较多的是Tushare,数据还是比较全的,有积分就可以查数据,https://tushare.pro/register?reg=413258,我ID是413258,如果如果注册可以填我的邀请码。
下面是三个我比较常用的数据查找代码
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可以对接各种数据源,最常见的是基于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(“数据的名称”)来获得相应的数据。