如何从tushare获取point in time的数据

本文介绍了如何在资产定价研究中遵循point in time原则获取数据,特别是从tushare获取股票报表数据的正确方法。讨论了不同类型的报表、调整标识和关键日期的处理,并提供了一个提取所需数据的函数示例。重点在于处理报表更新和修正情况,确保获取到对应调用日期的最新有效数据。
摘要由CSDN通过智能技术生成

       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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值