對復權因子的介紹可參考
通過計算復權因子求得當日前一天收盤價,並存儲在MongoDB數據庫中
代碼實現
def fill_au_factor_pre_close(begin_date,end_date):
"""
為daily數據集填充
1、復權因子au_factor,復權因子計算方式:au_factor= hfq_close/close
2、pre_close = close(-1) * au_factor(-1)/au_factor
:param begin_date:開始日期
:param end_date:結束日期
"""
all_codes = get_all_codes()
for code in all_codes:
hfq_daily_cursor = DB_CONN['daily_hfq'].find(
{'code':code,'date':{'$gte':begin_date,'$lte':end_date},'index':False},
sort=[('date',ASCENDING)],
projection={'date':True,'close':True}
)
date_hfq_close_dict = dict([(x['date'],x['close']) for x in hfq_daily_cursor])
daily_cursor = DB_CONN['daily'].find(
{'code':code,'date':{'$gte':begin_date,'$lte':end_date},'index':False},
sort=[('date',ASCENDING)],
projection={'date':True,'close':True}
)
last_close = -1
last_au_factor = -1
update_requests = []
for daily in daily_cursor:
date = daily['date']
try:
close = daily['close']
doc = dict()
#復權因子 = 當日后復權價格/當日的實際價格
au_factor = round(date_hfq_close_dict['date']/close,2)
doc['au_factor'] = au_factor
#當日前收價=前一日實際收盤價 * 前一日復權因子/當日復權因子
if last_au_factor != -1 and last_close != -1:
pre_close = last_close * last_au_factor / au_factor
doc['pre_close'] = round(pre_close,2)
last_close = close
last_au_factor = au_factor
update_requests.append(
UpdateOne(
{'code':code,'date':date,'index':False},
{'$set':doc}
)
)
except:
print('計算復權因子時發生錯誤,股票代碼:%s,日期:%s' %(code,date),flush=True)
#恢復成初始值,防止出錯
last_close = -1
last_au_factor = -1
if len(update_requests)>0:
update_result = DB_CONN['daily'].bulk_write(update_requests,ordered=False)
print('填充復權因子和前收,股票:%s ,更新:%4d條'%(code,update_result.modified_count),flush=False)