一直使用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次了,那时候的前复权数据,应该比不复权的数据,价格低很多。
因为有如上的问题,所以需要我对代码进行改进。可以通过复权因子接口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,就是对收盘价计算的前复权数据,通过这个方法,可以计算开盘价,最高价,最低价。