废话不多,直接上代码
如果您没时间,这个函数您可以直接拿去用了
如果您想知道我之所以这样写的原因,可以往下看:
第一行很简单,np.cumsum是逐项累加的意思
举个例子:
a1=np.array([1,2,3,4,5])
a2=np.cumsum(a1)
所以a2就是[ 1,3,6,10,15]
那这里为什么要逐项累加呢?
因为我们要求移动均线嘛,均线嘛,当然要先求和,再求平均啦
第二行,mov[n:]=mov[n:]-mov[:-n]怎么理解?
我举个例子吧,
假如array=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],n=5(炒股的人都懂吧,n=5,求出来的结果就是5日线),
那么,
mov=[ 1,3,6,10,15,21,28,36,45,55, 66,78,91,105,120] ,
mov[n:]=[21,28, 36,45,55,66,78,91,105,120],即从index=5的数开始往后取,也就是说舍弃了前5个数,
mov[:-n]=[1,3,6,10,15,21,28,36,45,55],即从index=-6的数开始往前取,也就是说舍弃了后5个数。
- 那mov[n:]-mov[:-n]怎么理解呢?为什么要相减?
因为5日线啊,我们只要最近5天的股价之和,再往前的数我们就不要了。
而cumsum把从开始到结束所有的项目都逐个累加。
所以我们在第6天的时候,就要把数组里累加了1天的值减掉;
在第7天的时候,就要把数组里累加了2天的值减掉;
在第8天的时候,就要把数组里累加了3天的值减掉;
…………
在最后一天的时候,就要把数组里累加到了倒数第6天(也就是-5,即mov[-n])的值减掉。
发现规律了没?错位就是5,就是那个n,每天都要减去往前5天的累加值。
所以mov[n:]很好理解,就是从第6天开始取每天累加的值,
mov[:-n]就是从第1天开始取每天累加的值一直到倒数第6天。
所以mov[n:]-mov[:-n]什么意思呢?
因为mov[n:]把mov的前5个数都不取,所以
mov[n:]的第1项就是累加了6天的值,
第2项就是累加了7天的值,以此类推。
所以mov[n:]-mov[:-n],每个对应位置相减,正好就是:
[(第6天的累加值-第1天的累加值),(第7天的累加值-第2天的累加值),……,(最后一天的累加值-倒数第6天的累加值)]
也就是移动的最近5天的股价之和!
是不是突然就豁然开朗了?
- 那mov[n:]=mov[n:]-mov[:-n]怎么理解?为什么要把移动的最近5天的股价之和,放回原累加和的数组?
因为前5个数,对于我们来说还有用的。 我们之所以从第6天往后的数拿出来处理,是因为前面5天,都没超过5天,所以不需要处理。
第三行,mov[(n-1):]/n怎么理解呢?
/n很好理解,我们要求5日均线嘛,所以当然要除以5。
那为什么分子是mov[(n-1):],而不是mov[n:]?
注意这里mov[(n-1):]是指从第5(index=4)项(包括第5项)开始往后的所有项。
虽然我们从第6天的累加值开始处理,但实际上第5天就开始,它的累加值除以5就有意义啦!
不信我们打开新股金龙鱼来看,是不是上市的第5天开始出现5日线了?
所以以上就是为什么这样写的原因,而这样写,也明显运行起来更快。