在掌握了公式语言的一些常用编写方法之后,进阶之路在哪里呢?它们分别是公式分支、公式循环、公式数组、公式迭代和公式接口,只有进一步学习这些高级编程技巧,才能真正达到编写中所思便所得的自如境界。在这其中,比较难以理解的是公式迭代,但一旦掌握将会为我们解决很多过去无法解决的问题。
公式迭代就是公式语言中的迭代算法,迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。
我们在做证券分析时常常会用到迭代算法,比如:
EMA求指数平滑移动平均。
用法:
EMA(X,N),求X的N日指数平滑移动平均。算法:若Y=EMA(X,N)
则Y=[2*X+(N-1)*Y']/(N+1),其中Y'表示上一周期Y值。
今日指数平滑移动平均线等于昨日指数平滑移动平均线乘上(N-1)加上近日收盘价乘2,然后再除以N+1。涉及迭代的问题还包括SMA、DMA、MEMA等。所谓迭代,就是用上一周期的数值来计算本周期的数值。迭代公式就是指用现在的值,代到一个公式里面,算出下一个值再用下一个值代入公式,如此往复地代。
以EMA为例:
e:=(2*c+(n-1)*e)/(n+1);
我们只需按照其原理直接写入就可以了,简单吧!下面就来分析一下为什么可以这么写?赋值符号“:=”左边的e表示本周期的数值,而右边的e由于还没有赋值,仍保持为上一周期的数值,也就是说e还维持着上次计算的结果,它等同于ref(e,1)。
那么,计算第一天的时候,e的数值是多少呢?其初始变量设为0?显然如此设定是不正确,因为e等于0的话,计算结果就等于close/n,这当然不是第一天的均值,因此我们需要作如下说明,完整的写法要这样:
{ema}
INPUT:n(5,0,1000);
VARIABLE:e=0;
e:if(barpos=1,c,(2*c+(n-1)*e)/(n+1));
当计算第一天的时候,e等于收盘价,后面的等于指数平滑移动平均。
迭代应用实例1:MACD(平滑异同平均线)
{macd}
INPUT:long(26,20,100),short(12,5,40),m(9,2,60);
VARIABLE:e=0,e1=0,dea=0;
e:=if(barpos=1,c,(2*c+(short-1)*e)/(short+1));
e1:=if(barpos=1,c,(2*c+(long-1)*e1)/(long+1));
diff:e-e1;
dea:(2*diff+(m-1)*dea)/(m+1);
macd:2*(diff-dea),colorstick;
迭代应用实例2:
我们在学习成本分布原理的时候,常会看到下面一段文字:
成本分布原理:
投资者一般对股票平均成本感兴趣,移动平均MA、指数平滑移动平均EMA等算法都是计算股票平均成本的算法,但是这些算法没有考虑到成交量对平均成本的影响。例如,假设最近一段时间某股票在10-20元间波动,其平均价MA为15元,但观察其成交量发现在20元附近成交量巨大,而在10元附近成交量较少,我们认为其平均成本显然应该比15元更高才合理。为此我们可以引入换收率移动平均概念;以当天的换手率作为平滑因子计算指数平滑移动平均,用公式来表示为:
Y=(1-A)*Y'+A*C
其中A表示换手率,C表示收盘价,Y和Y'分别表示今日平均价和昨日平均价。
加权平均的计算方法是:∑aX,其中X位待统计数值,a为X占总量的比例。当日的平均成本Y可以表示为两个部分,当日买入的和以前买入的,当日买入的成本为收盘价C,以前买入的成本为Y',而当日买入的占总流通盘的比例为换收率A,而以前买入的则占1-A,因此今日的加权平均成本为(1-A)*Y'+A*C。因此,用这个公式更能反映股票的真实成本。
查阅指标函数,我们找到了这样一个函数:
DMA求动态移动平均。
用法:
DMA(X,A),求X的A日动态移动平均。
算法: 若Y=DMA(X,A)
则 Y=A*X+(1-A)*Y',其中Y'表示上一周期Y值,A必须小于1。
例如:DMA(CLOSE,VOL/CAPITAL)表示求以换手率作平滑因子的平均价
显然DMA(CLOSE,VOL/CAPITAL)就是成本分布中的加权平均成本(1-A)*Y'+A*C。
用迭代可以这样表述:
VARIABLE:y=0;
a:=vol/capital;
y:if(barpos=1,c,(1-a)*y+a*c);
迭代应用实例3:
有一求助贴
请问老师如何定义可以一直递归到开盘第一天的递归函数?
本文来自:理想论坛 www.55188.com 作者:天赢 浏览:164次
________________________________________
如何有递归函数需要一个公式 F: IF (是开盘日前一日 就返回发行价,((流通盘- vol)* REF(F,1)+close*vol)/流通盘); 可以一直递归到开盘第一天的
https://www.55188.com/viewthread.php?tid=4086339&page=1#pid84240961
这个命题用迭代可以完美的解决,同样的命题用C语言写,迭代的运算速度会大大超过递归。说到运算速度,有人会问迭代算法用在公式语言中会不会很慢,答案是否定的。无论是分析家还是在使用某些循环公式慢如蜗牛的大智慧,既是在不联网、不下载本地数据的情况下,使用迭代运算速度都非常的快。
好了,上面提到过在公式语言中用到迭代的还有SMA、DMA、MEMA、TMA等,现在就可以自己来动手试试,就算留道算术题吧,成功了!那么恭喜你---您进阶了!
注:二楼给出了SMA、DMA、MEMA、TMA的迭代公式写法。