js数组的reduce方法在股票参数计算中的运用

最近在用js做股票和币圈的一些走势分析,这就不免要去计算K线中的一些技术指标,如移动均线MA、布林带轨线、MACD等等等,这些指标运算公式看上去不复杂,实际动手写起来还是要费一点脑子的,我们把K线数据集表示为一个数组,那么计算K线指标就是对这个数组进行一系列操作,问题的核心就在对数组的操作上。

很多时候,我们会使用for循环去解决所有的数组问题,这没毛病,也是绝对保险的一条路,但是在解决股票参数计算这种问题上,for循环并不是那么好用,对于需要反复迭代运算的指标(譬如KDJ),用for可能会写出语句松散、代码量很大的函数。这里就引出了数组迭代运算的主角:reduce。这个reduce很多人肯定在数组求和时用过,这也是reduce最广为人知的使用场景,那么我们就从数组求和说起。

布林带上下轨的计算

在股票中,布林带的上下轨线是基于20日均线的标准差得到的,其中标准差的计算公式比较复杂,但是用reduce的话一切都是水到渠成的事:

let avg = ma20.reduce((a, b) => a + b) / 20;
let sd = Math.pow(ma20.reduce((a, b) => a + Math.pow(b - avg, 2), 0) / 20,0.5);

两句话就能计算出数组的标准差,第一步是计算平均值,第二步是套用标准差公式,reduce在迭代运算场景中的适性由此可见一斑。而如果我们用for循环去计算标准差,可能会写出很长一串代码,而且需要声明很多变量作为中转,事倍功半。上述计算标准差的本质,其实还是一开始提到的求和那一套东西,让我们再来看看比较复杂的场景。

计算KDJ指标

KDJ是判断股市行情的一个重要指标,其计算公式比较特殊,是一种递归运算,也就是说,某个时间点的KDJ值取决于其前一个KDJ的具体数值。下面我们以KDJ中的K指标为例,介绍一下计算方法。

百度百科给出的公式为: 当日K值=2/3×前一日K值+1/3×当日RSV ,若无前一日K值,则可以用50代替。这里我们假设已经得到了一组RSV,那么reduce的计算公式该如何用js代码表示呢?看下面:

let k = [];
rsv.reduce((a, b) => {
    let result = (2 / 3) * a + (1 / 3) * b;
    k.push(result);
    return result;
}, 50);

我们依然使用了reduce去迭代,和前一个案例不同的是,这次我们赋予了一个初始值50,并且每次迭代计算时我们都会将当前结果放入k数组,这样才能完整保留每次运算的K值。同时,我们将当前结果传递为下次的初始值,这样一套迭代计算之后得到的k数组就是每个时间点K值的集合。相信大家看到这里,应该能明白reduce迭代运算的强大了吧!

在K线指标计算中,reduce迭代器承担着十分重要的角色,大家也可以尝试自己去写一下,最后对照实际指标,看看运算结果有没有出入。最后顺带提一句,近期比特币短线指标看跌。

(全文完)