Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/kaelzhang/finmath

The collections of simple, weighted, exponential, smoothed moving averages.
https://github.com/kaelzhang/finmath

dmarc dynamic-weighted-moving-average ema exponential-moving-average fintech ma math math-library moving-average sma weighted-moving-average

Last synced: 4 days ago
JSON representation

The collections of simple, weighted, exponential, smoothed moving averages.

Awesome Lists containing this project

README

        

[![Build Status](https://travis-ci.org/kaelzhang/finmath.svg?branch=master)](https://travis-ci.org/kaelzhang/finmath)
[![Coverage](https://codecov.io/gh/kaelzhang/finmath/branch/master/graph/badge.svg)](https://codecov.io/gh/kaelzhang/finmath)

# MAINTENANCE WARNING

This module is lack of maintenance.

If you are familiar with python programming maybe you could check [**stock-pandas**](https://github.com/kaelzhang/stock-pandas) which provides powerful statistic indicators support, and is backed by [`numpy`](https://numpy.org/) and [`pandas`](https://pandas.pydata.org/).

The performance of [**stock-pandas**](https://github.com/kaelzhang/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](https://en.wikipedia.org/wiki/Financial_technology) , including:

- [Moving averages](https://en.wikipedia.org/wiki/Moving_average)
- [MACD](https://en.wikipedia.org/wiki/MACD)
- [Bollinger bands](https://en.wikipedia.org/wiki/Bollinger_Bands)
- [Standard deviations](https://en.wikipedia.org/wiki/Standard_deviation)
- Highest high values / Lowest low values

And all finmath methods also handle empty values.

# Table of Contents

- [simple Moving Average (MA)](#simple-moving-average-madata-size)
- [Dynamic weighted Moving Average (DMA)](#dynamic-weighted-moving-average-dmadata-alpha-nohead)
- [Exponential Moving Average (EMA)](#exponential-moving-average-emadata-size)
- [Smoothed Moving Average (SMA)](#smoothed-moving-average-smadata-size-times)
- [Weighted Moving Average (WMA)](#weighted-moving-average-wmadata-size)
- [MACD](#MACD-macddata-slowPeriods-fastPeriods-signalPeriods)
- [BOLLinger bands (BOLL)](#bollinger-bands-bolldata-size-times-options)
- [Standard Deviations (SD)](#standard-deviations-sddata-size)
- [Highest High Values (HHV)](#highest-high-values-hhvdata-periods)
- [Lowest Low Values (LLV)](#lowest-low-values-llvdata-periods)

## install

```sh
$ npm i finmath
```

## usage

```js
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]
```

## Simple Moving Average: `ma(data, size)`

```ts
type Data = EmptyableArray
```

- **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` represents an array of numbers or empty items. And every method of `finmath` does **NOT** accepts items that are not numbers.

```js
[1,, 2, 3] // OK ✅

[1, undefined, 2, 3] // NOT OK ❌

[1, null, 2, 3] // NOT OK ❌
```

#### Special Cases

```js
// 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.

## Dynamic Weighted Moving Average: `dma(data, alpha, noHead)`

- **data**
- **alpha** `Data` the coefficient or list of coefficients `alpha` 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 than `1` 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.
- **noHead** `Boolean=` whether we should abandon the first DMA.

Returns `Data`

```js
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]
```

## Exponential Moving Average: `ema(data, size)`

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`

## Smoothed Moving Average: `sma(data, size, times)`

Also known as the modified moving average or running moving average, with `alpha = times / size`.

- **data**
- **size**
- **times?** `Number=1`

Returns `Data`

## Weighted Moving Average: `wma(data, size)`

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 to `26`
- **fastPeriods?** `number=12` the size of fast periods. Defaults to `12`
- **signalPeriods?** `number=9` the size of periods to calculate the MACD signal line.

Returns `MACDGraph`

```js
macd(data)

// which returns:
// {
// MACD: ,
// signal: ,
// histogram:
// }
```

### struct `MACDGraph`

- **MACD** `Data` the difference between [EMAs](https://www.npmjs.com/package/moving-averages#exponential-moving-average-emadata-size) of the fast periods and EMAs of the slow periods.
- **signal** `Data` the EMAs of the `MACD`
- **histogram** `Data` `MACD` minus `signal`

In some countries, such as China, the three series above are commonly known as:

```sh
MACD -> DIF
signal -> DEA
histogram -> MACD
```

## Bollinger Bands: boll(data, size?, times?, options?)

```js
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 to `20`
- **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 provided `datum` and period `size`. This option is used to prevent duplicate calculation of moving average.
- **sd?** `Data=` the standard average of the provided `datum` and period `size`

Returns `Array` the array of the `Band` object.

```ts
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.

```js
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).

```js
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.

## License

[MIT](LICENSE)