tushare复权数据使用

一直使用tushare数据,感谢米哥的提供,由于一些计算需要用复权数据,最近使用中发现了一些问题,说明如下。

1. tushare数据接口的问题

tushare日线数据有两个接口,一个是日线行情接口daily,一个是复权行情pro_bar。

# 日线行情接口daily
pro = ts.pro_api()
df = pro.daily(ts_code='000001.SZ')

# 日线复权行情pro_bar
qfq_df = ts.pro_bar(ts_code='000001.SZ', adj='qfq')

关于接口,说明的很详细,基础积分每分钟内最多调取500次,每次5000条数据,相当于23年历史。现在问题来了,如果这个股票上市时间超过了23年,那么前复权数据是什么样子的呢?测试代码如下。

	ts.set_token(TOKEN)
    pro = ts.pro_api()
    df_qfq = ts.pro_bar(ts_code='000001.SZ', start_date='19910403', end_date='19981030', adj='qfq')  # 前复权接口
    df_daily_now = pro.daily(ts_code='000001.SZ', start_date='19910403', end_date='19981030')  # 日线接口

    df_qfq_close_list = df_qfq['close'].values.tolist()
    df_daily_close_list = df_daily_now['close'].values.tolist()

    is_equal = df_qfq_close_list[:20] == df_daily_close_list[:20]
    print(is_equal)

以上代码可以看到,复权接口和日线接口返回的收盘价一样,那么问题来了,从1998年到现在这个时间段,其实已经复权N次了,那时候的前复权数据,应该比不复权的数据,价格低很多。

2.改进方法

因为有如上的问题,所以需要我对代码进行改进。可以通过复权因子接口adj_factor来获取复权值,然后自己计算前复权数据。前复权的算法也很简单:当日收盘价 * 当日复权因子 / 最新复权因子

	'''
    获取000001.SZ的所有历史数据
    '''
    df_daily_now = pro.daily(ts_code='000001.SZ')
    end_date = df_daily_now.iloc[-1]['trade_date']
    df_daily_before = pro.daily(ts_code='000001.SZ', start_date='19910403', end_date=end_date)  # 由于接口返回数据的限制,分两次获取股票的历史数据
    df_daily_before_remove_one = df_daily_before[1:]
    df_daily = pd.merge(df_daily_now, df_daily_before_remove_one, how='outer')

    df_adj = pro.adj_factor(ts_code='000001.SZ', trade_date='')[['trade_date', 'adj_factor']]
    df_daily_with_adj = pd.merge(df_daily, df_adj, on='trade_date')
    now_adj_factor = df_adj.iloc[0]['adj_factor']  # 最新复权因子
    df_daily_with_adj['close_qfq'] = df_daily_with_adj['close'] * df_daily_with_adj['adj_factor'] / now_adj_factor  # 前复权 当日收盘价 × 当日复权因子 / 最新复权因子

上述代码close_qfq,就是对收盘价计算的前复权数据,通过这个方法,可以计算开盘价,最高价,最低价。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章