39

js数组的reduce方法在股票参数计算中的运用-张阳君的个人网站

 4 years ago
source link: https://www.zhangyangjun.com/post/js-array-reduce-in-stock-calc.html?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

2019年11月08日 作者: 张阳君 分类: 前端技术

最近在用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的具体数值。下面我们以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迭代器承担着十分重要的角色,大家也可以尝试自己去写一下,最后对照实际指标,看看运算结果有没有出入。最后顺带提一句,近期比特币短线指标看跌。

(全文完)

本文由张阳君原创,文章链接:https://www.zhangyangjun.com/post/js-array-reduce-in-stock-calc.html,转载请注明出处!

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK