moving-averages-js
Version:
The FinTech utility collections of simple, cumulative, and exponential moving averages.
54 lines (53 loc) • 1.59 kB
JavaScript
;
// Dynamic Weighted Moving Average
Object.defineProperty(exports, "__esModule", { value: true });
var common_1 = require("./common");
// @param {Number|Array.<Number>} alpha
exports.default = (function (data, alpha, noHead) {
var length = data.length;
if (alpha > 1) {
return Array(length);
}
if (alpha === 1) {
return data.slice();
}
var noArrayWeight = !(0, common_1.isArray)(alpha);
var ret = [];
var datum;
// period `i`
var i = 0;
// `s` is the value of the DWMA at any time period `i`
var s = 0;
// Handles head
for (; i < length; i++) {
datum = data[i];
if ((0, common_1.isNumber)(datum) && (noArrayWeight || (0, common_1.isNumber)(datum))) {
ret[i] = noHead ? 0 : datum;
s = datum;
i++;
break;
}
}
// Dynamic weights: an array of weights
// Ref:
// https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average
// with a dynamic alpha
if (!noArrayWeight) {
for (; i < length; i++) {
datum = data[i];
(0, common_1.isNumber)(datum) && (0, common_1.isNumber)(alpha[i])
? (s = ret[i] = alpha[i] * datum + (1 - alpha[i]) * s)
: (ret[i] = ret[i - 1]);
}
return ret;
}
var o = 1 - alpha;
// Fixed alpha
for (; i < length; i++) {
datum = data[i];
(0, common_1.isNumber)(datum)
? (s = ret[i] = alpha * datum + o * s)
: (ret[i] = ret[i - 1]);
}
return ret;
});