又要完成tushare的季度任务了。这里分享一下笔者从tushare批量获取交易、财务数据的代码。一共获取了如下数据:收盘价、涨跌幅、成交量、基本每股收益、总资产周转率、每股净资产、净资产收益率、资产负债率、流动资产/总资产、产权比率、资产总计、总股本。分别涉及接口:pro.fina_indicator,pro.balancesheet,ts.pro_bar。代码如下:
首先进行相关的设置:
import pandas as pd
import numpy as np
import tushare as ts
import time
#设置登录token
ts.set_token('自己的token')
pro = ts.pro_api()
#所有股票的代码
code = pro.stock_basic()
下面三个函数是获取某个个股某一段时间的数据。注意有个递归调用,目的是为了让程序不受到断网的影响(非常重要,要不然每次都是批量调用还没完就断了还没保存就完蛋)。其中codelist,start_t,end_t分别是股票代码,开始日期和结束日期。
def get_fina_indicator(codelist,start_t,end_t):
try:
data=pro.fina_indicator(ts_code=codelist,start_date=start_t,end_date=end_t)
except:
data=get_fina_indicator(codelist,start_t,end_t)
return data
def get_balancesheet(codelist,start_t,end_t):
try:
data=pro.balancesheet(ts_code=codelist,start_date=start_t,end_date=end_t)
except:
data=get_balancesheet(codelist,start_t,end_t)
return data
def get_bar(codelist,start_t,end_t):
try:
data=ts.pro_bar(ts_code=codelist,start_date=start_t,end_date=end_t)
except:
data=get_bar(codelist,start_t,end_t)
return data
接下来三个函数是分别批量调用上面三个函数。不过注意tushare数据经常有重复(不知道为什么),需要手动按照日期来删除。其中前两个参数starting_year,ending_year分别代表开始年份和结束年份,后面两个参数不是让用户调用的(当然这几个程序本身也不是让用户调用的),是最后面一个程序内调用的。为了简单起见直接写成从开始年份的一月开始到结束年份的年底的期限。
def getting_ratio(starting_year,ending_year,start_obs,end_obs):
start=str(starting_year)+'0101'
if ending_year!=None:
end=str(ending_year)+'1231'
else:
end=None
a=get_fina_indicator(code['ts_code'][start_obs],start,end)
eps_test0 = a[['end_date','eps']]
eps_test0.columns=['date',code['ts_code'][start_obs]]
assets_turn_test0=a[['end_date','assets_turn']]
assets_turn_test0.columns=['date',code['ts_code'][start_obs]]
bps_test0=a[['end_date','bps']]
bps_test0.columns=['date',code['ts_code'][start_obs]]
roe_test0=a[['end_date','roe']]
roe_test0.columns=['date',code['ts_code'][start_obs]]
debt_to_assets_test0=a[['end_date','debt_to_assets']]
debt_to_assets_test0.columns=['date',code['ts_code'][start_obs]]
ca_to_assets_test0=a[['end_date',