股票复权计算

  • [复权]
    • 上市公司在除权除息之后,股价会产生变化,但实际成本并未发生变化,导致K线走势图上出现断层,给人以股价下跌的错觉,而复权就是按照实际涨跌绘制股价走势路,修复除权除息后产生的断层,便于对股票进行分析处理,在复权中有向前复权,向后复权和定点复权,这里我们只讨论向前复权和向后复权
  • [向前复权] — 一般用作短线技术分析
    • 就是保持现有价位不变,将以前的价格缩减,将除权前的K线向下平移,使图形吻合,保持股价走势的连续性
  • [向后复权] — 一般用作长线基本面分析
    • 向后复权,就是保持先前的价格不变,而将以后的价格增加。

某上市公司在出现10送8分红2.8后的k线走势
,某上市公司在出现10送8分红2.8后的k线走势

股票复权算法

现有流行的复权算法一般经典复权算法,递归前复权算法,递归后复权算法,涨跌幅复权算法,其中经典复权算法得到结果和递归后复权结果相同,

  • 经典复权算法
    经典复权算法
  • 递归前复权算法
    在这里插入图片描述
  • 递归后复权算法
    在这里插入图片描述
  • 涨跌幅算法
    复权因子=当日的前收盘价/昨天的收盘
    向前复权 = 实际价 * 每一次的复权因子
    向后复权 = 实际价 / 每一次的复权因子

粘一段前复权代码 后复权原理相同

double calc_recvoer_pre_right_price(double px, STOCK_RIGHT &jrjRight)
{
    // 前复权:复权后价格=[(复权前价格-现金红利)+配(新)股价格×流通股份变动比例]÷(1+流通股份变动比例)

    double fChgRatio = (jrjRight.fSGBL+jrjRight.fZGBL+jrjRight.fPGBL)/10.0;
    return ((px-jrjRight.fLRFH)+jrjRight.fPGJG*fChgRatio)/(1.0+fChgRatio);
}

// 进行前复权
void recover_pre_right(map<int, KLINE> &mapKLine, list<STOCK_RIGHT> &listRight, int nPrice)
{
    
    const double PRESION_AJUST_MOUNT = 0.000005;    // 精度较正值

    for (list<STOCK_RIGHT>::iterator itRight=listRight.begin(); itRight!=listRight.end(); ++itRight)
    {
        // find date in mapTdxKLine
        map<int, KLINE>::iterator itKLine = mapKLine.find(itRight->nFQRQ);
        if (itKLine==mapKLine.end() || itKLine==mapKLine.begin())
            continue;

        // 从除权的前一个交易日开始复权
        do
        {
            --itKLine;
            KLINE & kLineTest = itKLine->second;
            kLineTest.nOpenPx = nPrice*(PRESION_AJUST_MOUNT+calc_recvoer_pre_right_price(1.0*kLineTest.nOpenPx/nPrice, *itRight));
            kLineTest.nHighPx = nPrice*(PRESION_AJUST_MOUNT+calc_recvoer_pre_right_price(1.0*tdxKLine.nHighPx/nPrice, *itRight));
            kLineTest.nLowPx  = nPrice*(PRESION_AJUST_MOUNT+calc_recvoer_pre_right_price(1.0*tdxKLine.nLowPx/nPrice, *itRight));
            kLineTest.nLastPx = nPrice*(PRESION_AJUST_MOUNT+calc_recvoer_pre_right_price(1.0*kLineTest.nLastPx/nPrice, *itRight));
        }while(itKLine!=mapKLine.begin());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值