tushare ID:456497
在资产定价的研究中,我们所使用的数据应该遵循point in time原则,既获取:对应调用日期所能获取的最新数据。听起来简单做起来却不然。一般来说,从原始报表构造的因子(截面,不是时序)有五种方法,分别为:1.获取对应调用日期所能获取的最新报告期的最新(实际报告期)数据。2.获取对应调用日期所能获取的最新报告期的单季度数据(如利润表中大部分数据都是按季度累计的,需要差分,然而差分也会随着调用日期的变化而有变化)。3.获取对应调用日期所能获取的对应的最新报告期的同比增长率。4.获取对应报告期所能获取的最新报告期的ttm数据(过去一年的对应数据的加总或平均)。5.获取对应报告期所能获取的最新报告期的单季度的ttm数据(2和4的综合)。显然第一种情况最简单,后面因为涉及到跨季度的情况,较为复杂。复杂的原因在于:调用之前的数据时调用的数据会随着调用日期的变化而变化,比如某公司在2017年4月公布2016年年报,总资产1亿,而在2017年8月公布调整年报,或者于2018年4月公布基准报表,都会改变2016年年报的总资产,假设改成了1.5亿。那么在2017年4月调用总资产就应该调用1亿,而在2018年4月之后计算总资产同比增长率,会需要2016年年报数据,那么就应该用1.5亿计算。
首先先获取tushare的所有报表:
import tushare as ts
import pandas as pd
import numpy as np
from time import time
path='D://data//data_test'
ts.set_token(自己的token)
pro = ts.pro_api()
code = pro.stock_basic()
def get_balancesheet(codelist,starttime,endtime,report_type=1):
try:
startdate=str(starttime)
enddate=str(endtime)
df = pro.balancesheet(ts_code=codelist,start_date=startdate,end_date=enddate,report_type=report_type)
return df.set_index('ts_code')
except:
df=get_balancesheet(codelist,starttime,endtime,report_type)
return df.set_index('ts_code')
def get_income(codelist,starttime,endtime,report_type=1):
try:
startdate=str(starttime)
enddate=str(endtime)
df = pro.income(ts_code=codelist,start_date=startdate,end_date=enddate,report_type=report_type)
return df.set_index('ts_code')
except:
df=get_income(codelist,starttime,endtime,report_type)
return df.set_index('ts_code')
def get_cashflow(codelist,starttime,endtime,report_type=1):
try:
startdate=str(starttime)
enddate=str(endtime)
df = pro.cashflow(ts_code=codelist,start_date=startdate,end_date=enddate,report_type=report_type)
return df.set_index('ts_code')
except:
df=get_cashflow(codelist,starttime,endtime,report_type)
return df.set_index('ts_code')
def get_bar(codelist,starttime,endtime,typ=None):
try:
startdate=str(starttime)
enddate=str(endtime)
df = ts.pro_bar(ts_code=codelist,start_date=startdate,end_date=enddate,adj=typ)
return df.set_index('ts_code')
except:
df=get_bar(codelist,starttime,endtime)
return df.set_index('ts_code')
def get_name(codelist):
try:
data = pro.namechange(ts_code=codelist)
return data
except:
data=get_name(codelist)
return data
for i in range(0,code.shape[0]):
try:
bfq1=get_bar(code['ts_code'].iloc[i],20100101,20201231)
bfq2=get_bar(code['ts_code'].iloc[i],20000101,20091231)
bfq=bfq1.append(bfq2).sort_values('trade_date',ascending=False)
if bfq.shape[0]>0:
bfq.to_excel(path+'//0//bar//bfq//'+code['ts_code'].iloc[i]+'.xlsx')
except:
1
try:
hfq1=get_bar(code['ts_code'].iloc[i],20100101,20201231,'hfq')
hfq2=get_bar(code['ts_code'].iloc[i],20000101,20091231,'hfq')
hfq=hfq1.append(hfq2).sort_values('trade_date',ascending=False)
if hfq.shape[0]>0:
hfq.to_excel(path+'//0//bar//hfq//'+code['ts_code'].iloc[i]+'.xlsx')
except:
try:
if hfq1.shape[0]>0:
hfq1.to_excel(path+'//0//bar//hfq//'+code['ts_code'].iloc[i]+'.xlsx')
except:
1
try:
balancesheet1=get_balancesheet(code['ts_code'].iloc[i],20000101,20201231,1)
if balancesheet1.shape[0]>0:
balancesheet1.to_excel(path+'//0//balancesheet//1//'+code['ts_code'].iloc[i]+'.xlsx')
excep