一直使用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,就是對收盤價計算的前復權數據,通過這個方法,可以計算開盤價,最高價,最低價。