MAINTENANCE WARNING
This module is lack of maintenance.
If you are familiar with python programming maybe you could check stock-pandas which provides powerful statistic indicators support, and is backed by numpy
and pandas
.
The performance of stock-pandas is many times higher than JavaScript libraries, and can be directly used by machine learning programs.
finmath
The complete collection of mathematical utility methods for FinTech , including:
- Moving averages
- MACD
- Bollinger bands
- Standard deviations
- Highest high values / Lowest low values
And all finmath methods also handle empty values.
Table of Contents
- simple Moving Average (MA)
- Dynamic weighted Moving Average (DMA)
- Exponential Moving Average (EMA)
- Smoothed Moving Average (SMA)
- Weighted Moving Average (WMA)
- MACD
- BOLLinger bands (BOLL)
- Standard Deviations (SD)
- Highest High Values (HHV)
- Lowest Low Values (LLV)
install
$ npm i finmath
usage
import {
ma, dma, ema, sma, wma,
macd,
boll,
sd,
hhv, llv,
add, sub, mul, div
} from 'finmath'
ma([1, 2, 3, 4, 5], 2)
// [<1 empty item>, 1.5, 2.5, 3.5, 4.5]
ma(data, size)
Simple Moving Average: type Data = EmptyableArray<number>
-
data
Data
the collection of data inside which empty values are allowed. Empty values are useful if a stock is suspended. -
size
number
the size of the periods.
Returns Data
Type Array<number|Empty>
represents an array of numbers or empty items. And every method of finmath
does NOT accepts items that are not numbers.
[1,, 2, 3] // OK ✅
[1, undefined, 2, 3] // NOT OK ❌
[1, null, 2, 3] // NOT OK ❌
Special Cases
// If the size is less than `1`
ma([1, 2, 3], 0.5) // [1, 2, 3]
// If the size is larger than data length
ma([1, 2, 3], 5) // [<3 empty items>]
ma([, 1,, 3, 4, 5], 2)
// [<2 empty items>, 0.5, 1.5, 3.5, 4.5]
And all of the other moving average methods have similar mechanism.
dma(data, alpha, noHead)
Dynamic Weighted Moving Average: - data
-
alpha
Data
the coefficient or list of coefficientsalpha
represents the degree of weighting decrease for each datum.- If
alpha
is a number, then the weighting decrease for each datum is the same. - If
alpha
larger than1
is invalid, then the return value will be an empty array of the same length of the original data. - If
alpha
is an array, then it could provide different decreasing degree for each datum.
- If
-
noHead
Boolean=
whether we should abandon the first DMA.
Returns Data
dma([1, 2, 3], 2) // [<3 empty items>]
dma([1, 2, 3], 0.5) // [1, 1.5, 2.25]
dma([1, 2, 3, 4, 5], [0.1, 0.2, 0.1])
// [1, 1.2, 1.38]
ema(data, size)
Exponential Moving Average: Calulates the most frequent used exponential average which covers about 86% of the total weight (when alpha = 2 / (N + 1)
).
- data
-
size
Number
the size of the periods.
Returns Data
sma(data, size, times)
Smoothed Moving Average: Also known as the modified moving average or running moving average, with alpha = times / size
.
- data
- size
-
times?
Number=1
Returns Data
wma(data, size)
Weighted Moving Average: Calculates convolution of the datum points with a fixed weighting function.
Returns Data
MACD: macd(data, slowPeriods?, fastPeriods?, signalPeriods?)
MACD, short for Moving Average Convergence / Divergence, is a trading indicator used in technical analysis of stock prices, created by Gerald Appel in the late 1970s.
-
data
Data
the collection of prices -
slowPeriods?
number=26
the size of slow periods. Defaults to26
-
fastPeriods?
number=12
the size of fast periods. Defaults to12
-
signalPeriods?
number=9
the size of periods to calculate the MACD signal line.
Returns MACDGraph
macd(data)
// which returns:
// {
// MACD: <Array>,
// signal: <Array>,
// histogram: <Array>
// }
MACDGraph
struct -
MACD
Data
the difference between EMAs of the fast periods and EMAs of the slow periods. -
signal
Data
the EMAs of theMACD
-
histogram
Data
MACD
minussignal
In some countries, such as China, the three series above are commonly known as:
MACD -> DIF
signal -> DEA
histogram -> MACD
Bollinger Bands: boll(data, size?, times?, options?)
boll([1, 2, 4, 8], 2, 2)
// {
// upper: [, 2.5, 5, 10],
// mid : [, 1.5, 3, 6],
// lower: [, 0.5, 1, 2]
// }
-
data
Data
the collection of data -
size?
Number=20
the period size, defaults to20
-
times?
Number=2
the times of standard deviation between the upper band and the moving average. -
options?
Object=
optional options-
ma?
Data=
the moving averages of the provideddatum
and periodsize
. This option is used to prevent duplicate calculation of moving average. -
sd?
Data=
the standard average of the provideddatum
and periodsize
-
ma?
Returns Array<Band>
the array of the Band
object.
interface Band {
// the value of the upper band
upper: number
// the value middle band (simple moving average)
mid: number
// the value of the lower band
lower: number
}
Standard deviations: sd(data, size)
-
data
Data
the collection of data -
size
number
the sample size of
Returns Data
the array of standard deviations.
sd([1, 2, 4, 8], 2) // [<1 empty item>, 0.5, 1, 2]
sd([1, 2, 3, 4, 5, 6], 4)
// [
// <3 empty items>,
// 1.118033988749895,
// 1.118033988749895,
// 1.118033988749895
// ]
Highest High Values: hhv(data, periods)
-
data
Data
the array of closing prices. -
periods
number
the size of periods
Returns Data
the highest high values of closing prices over the preceding periods
periods (periods includes the current time).
const array = [1, 2, 4, 1]
hhv(array, 2) // [, 2, 4, 4]
hhv(array) // 4
hhv(array, 5) // [<4 empty items>]
hhv(array, 1) // [1, 2, 4, 1]
hhv(array, 2) // [, 1, 2, 2]
Lowest Low Values: llv(data, periods)
Instead, returns Data
the lowest low values.