• 沪深股票的复权计算(复权因子的应用)--代码实现


    对复权因子的介绍可参考

    通过计算复权因子求得当日前一天收盘价,并存储在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)
    
  • 相关阅读:
    再谈MySql索引
    线程基础
    设计模式入门基础
    40个Android问题
    android学习小例子——验证码倒计时按钮
    Activity的启动模式
    Android项目无法运行的解决方法
    AndroidStudio 更新gradle Error:Failed to complete Gradle execution. Cause: Connection reset
    三月课堂上线,干货震撼来袭
    对比JQuery与JavaScript
  • 原文地址:https://www.cnblogs.com/tan2810/p/13417521.html
Copyright © 2020-2023  润新知