CaramelDinosaur
2022-05-11T16:27:55+00:00
最近想自己实现一下 macd 的计算, macd 其中用到了 ema. 所以就研究了下 EMA 的计算方式,但是最终我发现,我计算的值和同花顺存在着误差,不知道有没有懂老哥知道这个事儿。
下面说一下我们俩的误差:
EMA 我也是学习了下百科里描述的表达式,链接如 [url]https://baike.baidu.com/item/EMA/12646151?fr=aladdin[/url]。
其实里面的计算方法,如果要计算某个时间,周期数量为 n 的 EMA,那么就通过上个时间周期的周期数量为 n -1 的 EMA 来计算。又定义而当周期数量为 1 时,EMA 就是数值本身。这样就可以迭代的推出来。具体表达式就是这么玩意:
[img]https://img.nga.178.com/attachments/mon_202205/21/jmQjgn-fqhkK8T1kSbq-1r.jpg[/img]
具体来说,就是如果我对 5 分钟的 k 线进行计算,如果我想要计算 13: 15 分的 EMA(8) 的值,我需要先拿到 13:10 分 EMA(7) 的值进行计算。如果我需要 13:10 分 EMA(7),那么就需要 13:05 EMA(6),以此类推,直到需要 11:10 分的 EMA(1),也就是这一刻的收盘值。然后就可以通过公式反推了。
上面是百科提供的计算方式,也没有问题。问题就出现在,当我使用了上面的方式计算后,当计算 EMA(1) EMA(2) 还没有问题,都和同花顺一样,当计算到 EMA(8) 的时候,值就和同花顺不一样了。
我当时计算的不一样是,中公教育(002607)2022-05-20 13:15 分的 EMA(8) 。我算出来的是 5.38,而同花顺计算的是 5.39。同花顺的图和我计算的过程我就不贴了。大家可以自己验证下。
但我目前得到的结论是,同花顺之所以和我不一样,是因为他每次使用上次的结果前,都会对结果保留两位小数点,并且四舍五入。随着计算周期增多,误差就会被放大。而我当时计算的时候,保留了更多的小数点,因此应该是同花顺更精准的。
我的疑问是:
我目前计算了 8 个周期,都已经出现了误差。后面我是打算通过这个值计算 MACD,MACD 一般会选择计算 EMA 12 、26 个周期,甚至还会对他们的差值计算 9 个周期的 EMA。那这个误差和同花顺的岂不是更大了。
所以,我应该怎么计算才是合理的?才能做到原本 EMA 的本意(ps. 其实计算 MACD 也是想通过缠论里描述的那样,计算一下背驰,可能能更好的选股吧)
(pps: 这里再说一下,其实在实现 EMA 的时候,我并没有通过迭代去做。因为那个表达式,其实可以通过数学的方式推到出他的通项公式,即 EMA(n) = (1 * x1 + 2 * x2 + ... n * xn) / (1 +2 + ... + n) 其中 x1 x2 .. xn 就是按照时间顺序的值。所以在这个的计算过程中,其实没有中间值,也不会产生误差,也是我发现问题的原因)
下面说一下我们俩的误差:
EMA 我也是学习了下百科里描述的表达式,链接如 [url]https://baike.baidu.com/item/EMA/12646151?fr=aladdin[/url]。
其实里面的计算方法,如果要计算某个时间,周期数量为 n 的 EMA,那么就通过上个时间周期的周期数量为 n -1 的 EMA 来计算。又定义而当周期数量为 1 时,EMA 就是数值本身。这样就可以迭代的推出来。具体表达式就是这么玩意:
[img]https://img.nga.178.com/attachments/mon_202205/21/jmQjgn-fqhkK8T1kSbq-1r.jpg[/img]
具体来说,就是如果我对 5 分钟的 k 线进行计算,如果我想要计算 13: 15 分的 EMA(8) 的值,我需要先拿到 13:10 分 EMA(7) 的值进行计算。如果我需要 13:10 分 EMA(7),那么就需要 13:05 EMA(6),以此类推,直到需要 11:10 分的 EMA(1),也就是这一刻的收盘值。然后就可以通过公式反推了。
上面是百科提供的计算方式,也没有问题。问题就出现在,当我使用了上面的方式计算后,当计算 EMA(1) EMA(2) 还没有问题,都和同花顺一样,当计算到 EMA(8) 的时候,值就和同花顺不一样了。
我当时计算的不一样是,中公教育(002607)2022-05-20 13:15 分的 EMA(8) 。我算出来的是 5.38,而同花顺计算的是 5.39。同花顺的图和我计算的过程我就不贴了。大家可以自己验证下。
但我目前得到的结论是,同花顺之所以和我不一样,是因为他每次使用上次的结果前,都会对结果保留两位小数点,并且四舍五入。随着计算周期增多,误差就会被放大。而我当时计算的时候,保留了更多的小数点,因此应该是同花顺更精准的。
我的疑问是:
我目前计算了 8 个周期,都已经出现了误差。后面我是打算通过这个值计算 MACD,MACD 一般会选择计算 EMA 12 、26 个周期,甚至还会对他们的差值计算 9 个周期的 EMA。那这个误差和同花顺的岂不是更大了。
所以,我应该怎么计算才是合理的?才能做到原本 EMA 的本意(ps. 其实计算 MACD 也是想通过缠论里描述的那样,计算一下背驰,可能能更好的选股吧)
(pps: 这里再说一下,其实在实现 EMA 的时候,我并没有通过迭代去做。因为那个表达式,其实可以通过数学的方式推到出他的通项公式,即 EMA(n) = (1 * x1 + 2 * x2 + ... n * xn) / (1 +2 + ... + n) 其中 x1 x2 .. xn 就是按照时间顺序的值。所以在这个的计算过程中,其实没有中间值,也不会产生误差,也是我发现问题的原因)