- [复权]
- 上市公司在除权除息之后,股价会产生变化,但实际成本并未发生变化,导致K线走势图上出现断层,给人以股价下跌的错觉,而复权就是按照实际涨跌绘制股价走势路,修复除权除息后产生的断层,便于对股票进行分析处理,在复权中有向前复权,向后复权和定点复权,这里我们只讨论向前复权和向后复权
- [向前复权] — 一般用作短线技术分析
- 就是保持现有价位不变,将以前的价格缩减,将除权前的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());
}
}