cfs.js
Version:
financial math library
500 lines (311 loc) • 6.21 kB
Markdown
# cfa.js
still in beta - ironing some bugs...
readme is due to changes
## Installation
via npm:
```console
npm i cfs.js
```
or frontside:
```javascript
<script src="cfa.js></script>
```
## Contetnts
1. [Time value of money functions](#time-value-of-money-functions)
2. [Statistics](#statistics)
3. [Linear Regression](#linear-regression)
4. [Probability](#probabililty)
5. [Derivatives](#derivatives)
6. [Helper Functions](#helper-functions)
## Examples
Calculate rolling return in an array
> rolling return day by day (you can input any number of days - lower than array length of course)
```javascript
let array = [1, 1.02, 1.03, 1, 1.03, 1.05]
cfa.yield_array(array2, 1)
```
returns:
```javascript
[
0.020000000000000018,
0.009803921568627416,
-0.029126213592232997,
0.030000000000000027,
0.01941747572815533
]
```
Calculate irr of a project
> irr functions takes as an input an array where `array[0]` (first element of the array) is the initial outlay.
```javascript
const array = [-50, 20, 10, 5, 30, 50]
cfa.irr(array)
```
returns:
```javascript
{ rate: 27.860000000001556, NPV: 0.007680729691662336 }
```
> calculated irr must be from <0, 100> extent.
> irr function uses 0.001 step
Calculate value of a call option using Black Scholes formula:
```javascript
let vol = 0.2 // standard deviation = 20%
let price = 42
let strike = 40
let time = 0.5 // in years
let rate = 0.1 // yearly = 10%
let dividend = 0.03 // dividend yield = 3%
cfa.callOption(vol, price, strike, time, rate, dividend)
// {
// d1: 0.6631966109280495,
// d2: 0.5217752546907399,
// Nd1: 0.7463978073568774,
// Nd2: 0.6990866809248882,
// callValue: 4.2823136053820505
// }
```
## TIME VALUE OF MONEY FUNCTIONS
__CAGR - compounded annual growth rate__
```javascript
cfa.cagr(ending, start, years)
cfa.cagr(125,100,2)
// 0.1180339887498949
```
__Future value__
```javascript
cfa.fv(pv, r, n, m)
```
__Present value__
```javascript
cfa.pv(fv,r,n,m)
```
__Continous compounding__
```javascript
cfa.fv_continous(pv, r, n)
```
__Effective Annual Rate__
```javascript
cfa.ear(r,m)
```
__Continous Effective Annual Rate__
```javascript
cfa.ear_continous(r)
```
__Future Value of Ordinary Annuity__
```javascript
cfa.fv_annuity_ordinary(a,r,n)
```
__Present Value of Ordinary Annuity__
```javascript
cfa.pv_annuity_ordinary(a,r,n)
```
__Future Value of Unequal Cash Flows__
```javascript
cfa.fv_unequal_cf(array, r)
```
__Present Value of Unequal Cash Flows__
```javascript
cfa.pv_unequal_cf(array, r)
```
__Present Value of Perpetuity__
```javascript
cfa.pv_perpetuity(a, r)
```
__Net Present Value__
```javascript
cfa.npv(array, r)
```
__Internal Rate of Return__
```javascript
cfa.irr(array)
```
returns object:
```javascript
{rate, NPV}
```
for instance:
```javascript
let array = [-50, 20, 10, 5, 30, 50]
cfa.irr(array)
```
returns:
```javascript
{ rate: 27.860000000001556, NPV: 0.007680729691662336 }
```
<!-- // 1.13 XIRR doesn't work -->
## Statistics
__Normal Distribution__
> using Hastings approximation
```javascript
cfa.normal(x)
// returns object {pdf, CDF, mean, variance}
cfa.normal(1)
// {
// pdf: 0.24197072451914337,
// CDF: 0.8413447721886403,
// mean: 0,
// variance: 1
// }
```
__Binomial Coefficient__ - nCk, n Chooses k
```javascript
cfa.nCk(9,3)
// 84
```
__Binomial__
```javascript
cfa.binomial(trials, success, probability)
// returns object {pdf, CDF, mean, variance}
cfa.binomial(5,2,0.3)
// {
// pdf: 0.3086999999999999,
// CDF: 0.8369199999999997,
// mean: 1.5,
// variance: 1.0499999999999998
// }
```
__Median__
```javascript
cfa.median(array)
```
__Mode - Single modality so far__
```javascript
cfa.mode(array)
```
__Weighted Mean__
```javascript
cfa.weighted_mean(array)
```
__Geometric Mean__
```javascript
cfa.geometric_mean(array)
```
__Harmonic Mean__
```javascript
cfa.harmonic_mean(array)
```
__Covariance__
```javascript
cfa.covariance(array_X, array_Y)
```
__Sample variance__
```javascript
cfa.sample_variance(array)
```
__Sample standard deviation__
```javascript
cfa.standard_deviation(array)
```
__Sample correlation__
```javascript
cfa.sample_correlation(array_X, array_Y)
```
__Significance of correlation coefficient__
```javascript
cfa.corr_significance(array_X, array_Y)
```
## Linear regression
__Mean Absolute Deviation__
```javascript
cfa.mad(array)
```
__Semivariance__
```javascript
cfa.semivariance(array)
```
__Semideviation__
```javascript
cfa.semideviation(array)
```
__Target semivariance__
```javascript
cfa.target_semivariance(array, target)
```
__Target Semideviation__
```javascript
cfa.target_semideviation(array, target)
```
__Coefficient of variation__
```javascript
cfa.cv(array)
```
__Sharpe Ratio__
```javascript
cfa.sharpe(array_portfolio, array_rf)
```
__Sample Skewness__
```javascript
cfa.sample_skewness(array)
```
__Sample Kurtosis__
```javascript
cfa.sample_kurtosis(array)
```
## Probabililty
__Covariance Matrix__ - takes array of arrays
```javascript
cfa.covariance_matrix(array)
```
__Correlation Matrix__ - takes array of arrays
```javascript
cfa.correlation_matrix(array)
```
## Derivatives
__Call option__ - valuation of a call option using Black Scholes formula
```javascript
cfa.callOption(vol, price, strike, time, rate, dividend)
// returns
// {d1, d2, Nd1, Nd2, callValue }
```
## HELPER FUNCTIONS
__Factorial__
```javascript
cfa.factorial(num)
cfa.factorial(3)
// 6
cfa.factorial(5)
// 120
__Yield__
```javascript
cfa.yield(a,b)
```
__Average__
```javascript
cfa.average(array)
```
__Array parse to float__
```javascript
cfa.float_array(array)
```
__Sum of array__
```javascript
cfa.sum(array)
```
__Array - sort descending__
```javascript
cfa.sort_desc(array)
```
__Array - Extent__
```javascript
cfa.extent(array)
```
__MAX__
```javascript
cfa.max(array)
```
__MIN__
```javascript
cfa.min(array)
```
__Range__
```javascript
cfa.range(array)
```
__k days yield array__
```javascript
cfa.yield_array(array, days)
```
__Rolling function with callback__
```javascript
cfa.rolling(array, days, callback)
```
---