在持仓品种跨除权日时,各位是否考虑过涨幅如何计算,这里有几种方式
1、前复权
2、后复权
3、等比前复权
4、等比后复权
普通的前后复权,就是把分红的过程反向处理,分红的金额和送股的数量反推到前/后一个交易日的价格上,来推算出一个合适的价格
但在处理历史数据的过程中,我们会发现,这样的反推处理会在每次复权过程中逐步积累,导致价格偏移,和历史当日实际的价格相差较大
这个偏移会导致两个主要问题,一是累计较多时会导致价格为负数,二是会导致涨幅计算的前收价和现价比例畸形,导致涨幅计算不准确
先看这张图:
前复权模式下,由于持续高分红,已经把复权后的价格推到了负数,这必定会对我们的策略的正确执行产生一定影响,因为实际实盘过程中不会看到这样的价格
再看这张图:
前复权、后复权、等比前复权、不复权,这几种方式展示到一起,注意涨幅的数值,在这些模式下是不一致的
我们用实际的交易逻辑来考虑一下
假如在历史的这天,当时实际有持仓,那么在前一天晚上经历了分红的过程,分红的钱和送股都已经分配好了,持仓的个股有了分红执行后的价格
当时实际的现价、前收价,都是不复权的状态
我们考虑如何计算复权前收盘价,这里我们维持当前价不变,选用前复权的方式,把这一次分红过程倒推叠加到前一天的价格上
即:复权前收价 = ( 不复权的前收价 + 分红金额 ) / ( 1 + 送转比例 )
这里贴一份代码:
单次前复权前收价 f_c0 为2008.325
现价 f_c1 我们取不复权的当日收盘价2045.00
则这天实际涨幅为 ( f_c1 / f_c0 - 1) * 100% = 1.826% = 1.83%
好了,我们回过来看前边茅台这天的几种复权方式的对比
可以看到,只有等比前复权的涨幅和我们计算的当日实际持仓涨幅吻合,其他两种方式,由于加减处理的方式导致比例失真
我们再来看看为什么等比前复权的涨幅是对的
等比前复权是对每个分红位置单独计算复权,对每次复权单独进行反推,然后以涨幅的比例作为系数来向前累除,达到复权的效果
也就是等比复权模式下,每次分红的位置价格变化都会和真实的持仓涨幅变化保持一致
等比复权由于是按比例累乘,不会造成价格为负的情况
有兴趣的不妨看看自己的策略,在持仓真实除权的时候是什么表现
投研端的获取可以参考我们的购买页面:
http://dict.thinktrader.net/dictionary/?id=cumnXP
这里分享出来前边的代码,可以在投研端运行,取除权因子、以及手工逐个计算复权
- //不复权价格
- c0:ref(oclose, 1),nodraw;
- c1:oclose,nodraw;
- //等比前复权
- fr_df:dividfactor(103),nodraw;
- fr_c1:c1 * fr_df;
- fr_c0:ref(fr_c1, 1);
- fr_zf:(fr_c1 / fr_c0 - 1) * 100;
- //单次复权因子
- fa:= dividfactor(4) * dividfactor(5) - dividfactor(1);
- fan:=iff(isvalid(fa), fa, 0);
- fr:= 1 + dividfactor(4) + dividfactor(2) + dividfactor(3);
- frn:=iff(isvalid(fr), fr, 1);
- //前复权
- f_c1:=c1;
- f_c0:(c0 + fan) / frn;
- f_zf:(f_c1 / f_c0 - 1) * 100;
- //后复权
- b_c1:c1 * frn - fan;
- b_c0:=c0;
- b_zf:(b_c1 / b_c0 - 1) * 100;
- //单次动态前复权
- fs_df:=dividfactor(8),nodraw;
- fs_dfn:iff(isvalid(fs_df), fs_df, 1.0);
- fs_c1:=c1;
- fs_c0:c0 / fs_dfn;
- fs_zf:(fs_c1 / fs_c0 - 1) * 100;
复制代码
多个界面联动:
|