finmagic 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Mohammad Esmaeilzadeh
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,64 @@
1
+ # 💰 finmagic
2
+
3
+ A TypeScript library for essential financial, technical, and statistical calculations. Designed for Node.js and browser environments, `finmagic` provides fast and reliable methods for traders, analysts, and developers.
4
+
5
+ ![npm version](https://img.shields.io/npm/v/finmagic)
6
+ ![npm license](https://img.shields.io/github/license/buglessir/finmagic)
7
+ ![npm downloads](https://img.shields.io/npm/dm/finmagic)
8
+ ![npm bundle size](https://img.shields.io/bundlephobia/minzip/finmagic)
9
+
10
+ ## Features
11
+
12
+ - Price calculations:
13
+ - `percentChange(current: number, previous: number): number`
14
+ - `dailyReturn(current: number, previous: number): number`
15
+ - `cumulativeReturn(returns: number[]): number`
16
+ - Moving averages:
17
+ - `SMA(values: number[], period: number): number`
18
+ - `EMA(values: number[], period: number): number`
19
+ - Financial calculations:
20
+ - `PV(futureValue: number, rate: number, periods: number): number`
21
+ - `FV(presentValue: number, rate: number, periods: number): number`
22
+ - `NPV(rate: number, cashFlows: number[]): number`
23
+ - `IRR(cashFlows: number[], guess?: number): number`
24
+ - Financial ratios:
25
+ - `PE(price: number, earnings: number): number`
26
+ - `PB(price: number, bookValue: number): number`
27
+ - `DividendYield(dividend: number, price: number): number`
28
+ - `Beta(portfolioReturn: number, marketReturn: number): number`
29
+ - `Alpha(expectedReturn: number, actualReturn: number): number`
30
+ - `Sharpe(returns: number[]): number`
31
+ - Risk management:
32
+ - `volatility(returns: number[]): number`
33
+ - `positionSizing(capital: number, risk: number, stopLossPoints: number): number`
34
+ - `stopLoss(entryPrice: number, percent: number): number`
35
+ - `takeProfit(entryPrice: number, percent: number): number`
36
+ - Volume indicators:
37
+ - `VWAP(prices: number[], volumes: number[]): number`
38
+ - `accumulationDistribution(close: number[], open: number[], volume: number[]): number`
39
+ - Statistical functions:
40
+ - `covariance(a: number[], b: number[]): number`
41
+ - `correlation(a: number[], b: number[]): number`
42
+
43
+ ## Installation
44
+
45
+ ```bash
46
+ npm install finmagic
47
+ ```
48
+
49
+ ## Usage
50
+ ```javascript
51
+ import { SMA, PV, Sharpe } from 'finmagic';
52
+
53
+ const prices = [10, 12, 11, 13, 15];
54
+ const average = SMA(prices, 5);
55
+
56
+ const presentValue = PV(1000, 0.05, 3);
57
+
58
+ const returns = [0.01, 0.02, 0.03];
59
+ const sharpeRatio = Sharpe(returns);
60
+ ```
61
+
62
+ ### Contributing
63
+
64
+ Contributions, bug reports, and feature requests are welcome. Please submit via GitHub issues or pull requests.
@@ -0,0 +1,4 @@
1
+ export declare const PV: (futureValue: number, rate: number, periods: number) => number;
2
+ export declare const FV: (presentValue: number, rate: number, periods: number) => number;
3
+ export declare const NPV: (rate: number, cashFlows: number[]) => number;
4
+ export declare const IRR: (cashFlows: number[], guess?: number) => number;
@@ -0,0 +1,131 @@
1
+ 'use strict';
2
+
3
+ const percentChange = (current, previous) => {
4
+ return ((current - previous) / previous) * 100;
5
+ };
6
+ const dailyReturn = (current, previous) => {
7
+ return percentChange(current, previous);
8
+ };
9
+ const cumulativeReturn = (returns) => {
10
+ return returns.reduce((acc, r) => acc * (1 + r / 100), 1) - 1;
11
+ };
12
+
13
+ const SMA = (data, period) => {
14
+ const slice = data.slice(-period);
15
+ const sum = slice.reduce((a, b) => a + b, 0);
16
+ return sum / slice.length;
17
+ };
18
+ const EMA = (data, period) => {
19
+ const k = 2 / (period + 1);
20
+ return data.reduce((prev, curr) => curr * k + prev * (1 - k));
21
+ };
22
+
23
+ const PV = (futureValue, rate, periods) => {
24
+ return futureValue / Math.pow(1 + rate, periods);
25
+ };
26
+ const FV = (presentValue, rate, periods) => {
27
+ return presentValue * Math.pow(1 + rate, periods);
28
+ };
29
+ const NPV = (rate, cashFlows) => {
30
+ return cashFlows.reduce((acc, cf, i) => acc + cf / Math.pow(1 + rate, i + 1), 0);
31
+ };
32
+ const IRR = (cashFlows, guess = 0.1) => {
33
+ let rate = guess;
34
+ let iteration = 0;
35
+ const maxIter = 1000;
36
+ const tol = 1e-6;
37
+ while (iteration < maxIter) {
38
+ const npv = cashFlows.reduce((acc, cf, i) => acc + cf / Math.pow(1 + rate, i), 0);
39
+ const derivative = cashFlows.reduce((acc, cf, i) => acc - (i * cf) / Math.pow(1 + rate, i + 1), 0);
40
+ const newRate = rate - npv / derivative;
41
+ if (Math.abs(newRate - rate) < tol)
42
+ break;
43
+ rate = newRate;
44
+ iteration++;
45
+ }
46
+ return rate;
47
+ };
48
+
49
+ const PE = (price, eps) => {
50
+ return price / eps;
51
+ };
52
+ const PB = (price, bookValue) => {
53
+ return price / bookValue;
54
+ };
55
+ const DividendYield = (dividend, price) => {
56
+ return (dividend / price) * 100;
57
+ };
58
+ const Beta = (covariance, marketVariance) => {
59
+ return covariance / marketVariance;
60
+ };
61
+ const Alpha = (actualReturn, expectedReturn) => {
62
+ return actualReturn - expectedReturn;
63
+ };
64
+ const Sharpe = (returns, riskFreeRate = 0) => {
65
+ const avg = returns.reduce((a, b) => a + b, 0) / returns.length;
66
+ const std = Math.sqrt(returns.reduce((a, b) => a + Math.pow(b - avg, 2), 0) / returns.length);
67
+ return (avg - riskFreeRate) / std;
68
+ };
69
+
70
+ const volatility = (returns) => {
71
+ const mean = returns.reduce((a, b) => a + b, 0) / returns.length;
72
+ return Math.sqrt(returns.reduce((a, b) => a + Math.pow(b - mean, 2), 0) / returns.length);
73
+ };
74
+ const positionSizing = (accountBalance, riskPercent, stopLossDistance) => {
75
+ return (accountBalance * riskPercent) / stopLossDistance;
76
+ };
77
+ const stopLoss = (entryPrice, riskDistance) => {
78
+ return entryPrice - riskDistance;
79
+ };
80
+ const takeProfit = (entryPrice, profitDistance) => {
81
+ return entryPrice + profitDistance;
82
+ };
83
+
84
+ const VWAP = (prices, volumes) => {
85
+ const totalVolume = volumes.reduce((a, b) => a + b, 0);
86
+ const weightedSum = prices.reduce((sum, price, i) => sum + price * volumes[i], 0);
87
+ return weightedSum / totalVolume;
88
+ };
89
+ const accumulationDistribution = (priceClose, priceOpen, volume) => {
90
+ return priceClose.reduce((acc, close, i) => {
91
+ const mfm = ((close - priceOpen[i]) / (priceClose[i] - priceOpen[i])) || 0;
92
+ return acc + mfm * volume[i];
93
+ }, 0);
94
+ };
95
+
96
+ const covariance = (a, b) => {
97
+ const meanA = a.reduce((x, y) => x + y, 0) / a.length;
98
+ const meanB = b.reduce((x, y) => x + y, 0) / b.length;
99
+ return a.reduce((acc, val, i) => acc + (val - meanA) * (b[i] - meanB), 0) / a.length;
100
+ };
101
+ const correlation = (a, b) => {
102
+ const cov = covariance(a, b);
103
+ const stdA = Math.sqrt(a.reduce((acc, val) => acc + Math.pow(val - a.reduce((x, y) => x + y, 0) / a.length, 2), 0) / a.length);
104
+ const stdB = Math.sqrt(b.reduce((acc, val) => acc + Math.pow(val - b.reduce((x, y) => x + y, 0) / b.length, 2), 0) / b.length);
105
+ return cov / (stdA * stdB);
106
+ };
107
+
108
+ exports.Alpha = Alpha;
109
+ exports.Beta = Beta;
110
+ exports.DividendYield = DividendYield;
111
+ exports.EMA = EMA;
112
+ exports.FV = FV;
113
+ exports.IRR = IRR;
114
+ exports.NPV = NPV;
115
+ exports.PB = PB;
116
+ exports.PE = PE;
117
+ exports.PV = PV;
118
+ exports.SMA = SMA;
119
+ exports.Sharpe = Sharpe;
120
+ exports.VWAP = VWAP;
121
+ exports.accumulationDistribution = accumulationDistribution;
122
+ exports.correlation = correlation;
123
+ exports.covariance = covariance;
124
+ exports.cumulativeReturn = cumulativeReturn;
125
+ exports.dailyReturn = dailyReturn;
126
+ exports.percentChange = percentChange;
127
+ exports.positionSizing = positionSizing;
128
+ exports.stopLoss = stopLoss;
129
+ exports.takeProfit = takeProfit;
130
+ exports.volatility = volatility;
131
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/price.ts","../src/moving.ts","../src/financial.ts","../src/ratios.ts","../src/risk.ts","../src/volume.ts","../src/statistics.ts"],"sourcesContent":["export const percentChange = (current: number, previous: number): number => {\r\n return ((current - previous) / previous) * 100;\r\n}\r\n\r\nexport const dailyReturn = (current: number, previous: number): number => {\r\n return percentChange(current, previous);\r\n}\r\n\r\nexport const cumulativeReturn = (returns: number[]): number => {\r\n return returns.reduce((acc, r) => acc * (1 + r / 100), 1) - 1;\r\n}\r\n","export const SMA = (data: number[], period: number): number => {\r\n const slice = data.slice(-period);\r\n const sum = slice.reduce((a, b) => a + b, 0);\r\n return sum / slice.length;\r\n}\r\n\r\nexport const EMA = (data: number[], period: number): number => {\r\n const k = 2 / (period + 1);\r\n return data.reduce((prev, curr) => curr * k + prev * (1 - k));\r\n}\r\n","export const PV = (futureValue: number, rate: number, periods: number): number => {\r\n return futureValue / Math.pow(1 + rate, periods);\r\n}\r\n\r\nexport const FV = (presentValue: number, rate: number, periods: number): number => {\r\n return presentValue * Math.pow(1 + rate, periods);\r\n}\r\n\r\nexport const NPV = (rate: number, cashFlows: number[]): number => {\r\n return cashFlows.reduce((acc, cf, i) => acc + cf / Math.pow(1 + rate, i + 1), 0);\r\n}\r\n\r\nexport const IRR = (cashFlows: number[], guess = 0.1): number => {\r\n let rate = guess;\r\n let iteration = 0;\r\n const maxIter = 1000;\r\n const tol = 1e-6;\r\n\r\n while (iteration < maxIter) {\r\n const npv = cashFlows.reduce((acc, cf, i) => acc + cf / Math.pow(1 + rate, i), 0);\r\n const derivative = cashFlows.reduce((acc, cf, i) => acc - (i * cf) / Math.pow(1 + rate, i + 1), 0);\r\n const newRate = rate - npv / derivative;\r\n if (Math.abs(newRate - rate) < tol) break;\r\n rate = newRate;\r\n iteration++;\r\n }\r\n\r\n return rate;\r\n}\r\n","export const PE = (price: number, eps: number): number => {\r\n return price / eps;\r\n}\r\n\r\nexport const PB = (price: number, bookValue: number): number => {\r\n return price / bookValue;\r\n}\r\n\r\nexport const DividendYield = (dividend: number, price: number): number => {\r\n return (dividend / price) * 100;\r\n}\r\n\r\nexport const Beta = (covariance: number, marketVariance: number): number => {\r\n return covariance / marketVariance;\r\n}\r\n\r\nexport const Alpha = (actualReturn: number, expectedReturn: number): number => {\r\n return actualReturn - expectedReturn;\r\n}\r\n\r\nexport const Sharpe = (returns: number[], riskFreeRate = 0): number => {\r\n const avg = returns.reduce((a, b) => a + b, 0) / returns.length;\r\n const std = Math.sqrt(returns.reduce((a, b) => a + Math.pow(b - avg, 2), 0) / returns.length);\r\n return (avg - riskFreeRate) / std;\r\n}\r\n","export const volatility = (returns: number[]): number => {\r\n const mean = returns.reduce((a, b) => a + b, 0) / returns.length;\r\n return Math.sqrt(returns.reduce((a, b) => a + Math.pow(b - mean, 2), 0) / returns.length);\r\n}\r\n\r\nexport const positionSizing = (accountBalance: number, riskPercent: number, stopLossDistance: number): number => {\r\n return (accountBalance * riskPercent) / stopLossDistance;\r\n}\r\n\r\nexport const stopLoss = (entryPrice: number, riskDistance: number): number => {\r\n return entryPrice - riskDistance;\r\n}\r\n\r\nexport const takeProfit = (entryPrice: number, profitDistance: number): number => {\r\n return entryPrice + profitDistance;\r\n}\r\n","export const VWAP = (prices: number[], volumes: number[]): number => {\r\n const totalVolume = volumes.reduce((a, b) => a + b, 0);\r\n const weightedSum = prices.reduce((sum, price, i) => sum + price * volumes[i], 0);\r\n return weightedSum / totalVolume;\r\n}\r\n\r\nexport const accumulationDistribution = (priceClose: number[], priceOpen: number[], volume: number[]): number => {\r\n return priceClose.reduce((acc, close, i) => {\r\n const mfm = ((close - priceOpen[i]) / (priceClose[i] - priceOpen[i])) || 0;\r\n return acc + mfm * volume[i];\r\n }, 0);\r\n}\r\n","export const covariance = (a: number[], b: number[]): number => {\r\n const meanA = a.reduce((x, y) => x + y, 0) / a.length;\r\n const meanB = b.reduce((x, y) => x + y, 0) / b.length;\r\n return a.reduce((acc, val, i) => acc + (val - meanA) * (b[i] - meanB), 0) / a.length;\r\n}\r\n\r\nexport const correlation = (a: number[], b: number[]): number => {\r\n const cov = covariance(a, b);\r\n const stdA = Math.sqrt(a.reduce((acc, val) => acc + Math.pow(val - a.reduce((x,y)=>x+y,0)/a.length,2),0)/a.length);\r\n const stdB = Math.sqrt(b.reduce((acc, val) => acc + Math.pow(val - b.reduce((x,y)=>x+y,0)/b.length,2),0)/b.length);\r\n return cov / (stdA * stdB);\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export * from './price';
2
+ export * from './moving';
3
+ export * from './financial';
4
+ export * from './ratios';
5
+ export * from './risk';
6
+ export * from './volume';
7
+ export * from './statistics';
@@ -0,0 +1,107 @@
1
+ const percentChange = (current, previous) => {
2
+ return ((current - previous) / previous) * 100;
3
+ };
4
+ const dailyReturn = (current, previous) => {
5
+ return percentChange(current, previous);
6
+ };
7
+ const cumulativeReturn = (returns) => {
8
+ return returns.reduce((acc, r) => acc * (1 + r / 100), 1) - 1;
9
+ };
10
+
11
+ const SMA = (data, period) => {
12
+ const slice = data.slice(-period);
13
+ const sum = slice.reduce((a, b) => a + b, 0);
14
+ return sum / slice.length;
15
+ };
16
+ const EMA = (data, period) => {
17
+ const k = 2 / (period + 1);
18
+ return data.reduce((prev, curr) => curr * k + prev * (1 - k));
19
+ };
20
+
21
+ const PV = (futureValue, rate, periods) => {
22
+ return futureValue / Math.pow(1 + rate, periods);
23
+ };
24
+ const FV = (presentValue, rate, periods) => {
25
+ return presentValue * Math.pow(1 + rate, periods);
26
+ };
27
+ const NPV = (rate, cashFlows) => {
28
+ return cashFlows.reduce((acc, cf, i) => acc + cf / Math.pow(1 + rate, i + 1), 0);
29
+ };
30
+ const IRR = (cashFlows, guess = 0.1) => {
31
+ let rate = guess;
32
+ let iteration = 0;
33
+ const maxIter = 1000;
34
+ const tol = 1e-6;
35
+ while (iteration < maxIter) {
36
+ const npv = cashFlows.reduce((acc, cf, i) => acc + cf / Math.pow(1 + rate, i), 0);
37
+ const derivative = cashFlows.reduce((acc, cf, i) => acc - (i * cf) / Math.pow(1 + rate, i + 1), 0);
38
+ const newRate = rate - npv / derivative;
39
+ if (Math.abs(newRate - rate) < tol)
40
+ break;
41
+ rate = newRate;
42
+ iteration++;
43
+ }
44
+ return rate;
45
+ };
46
+
47
+ const PE = (price, eps) => {
48
+ return price / eps;
49
+ };
50
+ const PB = (price, bookValue) => {
51
+ return price / bookValue;
52
+ };
53
+ const DividendYield = (dividend, price) => {
54
+ return (dividend / price) * 100;
55
+ };
56
+ const Beta = (covariance, marketVariance) => {
57
+ return covariance / marketVariance;
58
+ };
59
+ const Alpha = (actualReturn, expectedReturn) => {
60
+ return actualReturn - expectedReturn;
61
+ };
62
+ const Sharpe = (returns, riskFreeRate = 0) => {
63
+ const avg = returns.reduce((a, b) => a + b, 0) / returns.length;
64
+ const std = Math.sqrt(returns.reduce((a, b) => a + Math.pow(b - avg, 2), 0) / returns.length);
65
+ return (avg - riskFreeRate) / std;
66
+ };
67
+
68
+ const volatility = (returns) => {
69
+ const mean = returns.reduce((a, b) => a + b, 0) / returns.length;
70
+ return Math.sqrt(returns.reduce((a, b) => a + Math.pow(b - mean, 2), 0) / returns.length);
71
+ };
72
+ const positionSizing = (accountBalance, riskPercent, stopLossDistance) => {
73
+ return (accountBalance * riskPercent) / stopLossDistance;
74
+ };
75
+ const stopLoss = (entryPrice, riskDistance) => {
76
+ return entryPrice - riskDistance;
77
+ };
78
+ const takeProfit = (entryPrice, profitDistance) => {
79
+ return entryPrice + profitDistance;
80
+ };
81
+
82
+ const VWAP = (prices, volumes) => {
83
+ const totalVolume = volumes.reduce((a, b) => a + b, 0);
84
+ const weightedSum = prices.reduce((sum, price, i) => sum + price * volumes[i], 0);
85
+ return weightedSum / totalVolume;
86
+ };
87
+ const accumulationDistribution = (priceClose, priceOpen, volume) => {
88
+ return priceClose.reduce((acc, close, i) => {
89
+ const mfm = ((close - priceOpen[i]) / (priceClose[i] - priceOpen[i])) || 0;
90
+ return acc + mfm * volume[i];
91
+ }, 0);
92
+ };
93
+
94
+ const covariance = (a, b) => {
95
+ const meanA = a.reduce((x, y) => x + y, 0) / a.length;
96
+ const meanB = b.reduce((x, y) => x + y, 0) / b.length;
97
+ return a.reduce((acc, val, i) => acc + (val - meanA) * (b[i] - meanB), 0) / a.length;
98
+ };
99
+ const correlation = (a, b) => {
100
+ const cov = covariance(a, b);
101
+ const stdA = Math.sqrt(a.reduce((acc, val) => acc + Math.pow(val - a.reduce((x, y) => x + y, 0) / a.length, 2), 0) / a.length);
102
+ const stdB = Math.sqrt(b.reduce((acc, val) => acc + Math.pow(val - b.reduce((x, y) => x + y, 0) / b.length, 2), 0) / b.length);
103
+ return cov / (stdA * stdB);
104
+ };
105
+
106
+ export { Alpha, Beta, DividendYield, EMA, FV, IRR, NPV, PB, PE, PV, SMA, Sharpe, VWAP, accumulationDistribution, correlation, covariance, cumulativeReturn, dailyReturn, percentChange, positionSizing, stopLoss, takeProfit, volatility };
107
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["../src/price.ts","../src/moving.ts","../src/financial.ts","../src/ratios.ts","../src/risk.ts","../src/volume.ts","../src/statistics.ts"],"sourcesContent":["export const percentChange = (current: number, previous: number): number => {\r\n return ((current - previous) / previous) * 100;\r\n}\r\n\r\nexport const dailyReturn = (current: number, previous: number): number => {\r\n return percentChange(current, previous);\r\n}\r\n\r\nexport const cumulativeReturn = (returns: number[]): number => {\r\n return returns.reduce((acc, r) => acc * (1 + r / 100), 1) - 1;\r\n}\r\n","export const SMA = (data: number[], period: number): number => {\r\n const slice = data.slice(-period);\r\n const sum = slice.reduce((a, b) => a + b, 0);\r\n return sum / slice.length;\r\n}\r\n\r\nexport const EMA = (data: number[], period: number): number => {\r\n const k = 2 / (period + 1);\r\n return data.reduce((prev, curr) => curr * k + prev * (1 - k));\r\n}\r\n","export const PV = (futureValue: number, rate: number, periods: number): number => {\r\n return futureValue / Math.pow(1 + rate, periods);\r\n}\r\n\r\nexport const FV = (presentValue: number, rate: number, periods: number): number => {\r\n return presentValue * Math.pow(1 + rate, periods);\r\n}\r\n\r\nexport const NPV = (rate: number, cashFlows: number[]): number => {\r\n return cashFlows.reduce((acc, cf, i) => acc + cf / Math.pow(1 + rate, i + 1), 0);\r\n}\r\n\r\nexport const IRR = (cashFlows: number[], guess = 0.1): number => {\r\n let rate = guess;\r\n let iteration = 0;\r\n const maxIter = 1000;\r\n const tol = 1e-6;\r\n\r\n while (iteration < maxIter) {\r\n const npv = cashFlows.reduce((acc, cf, i) => acc + cf / Math.pow(1 + rate, i), 0);\r\n const derivative = cashFlows.reduce((acc, cf, i) => acc - (i * cf) / Math.pow(1 + rate, i + 1), 0);\r\n const newRate = rate - npv / derivative;\r\n if (Math.abs(newRate - rate) < tol) break;\r\n rate = newRate;\r\n iteration++;\r\n }\r\n\r\n return rate;\r\n}\r\n","export const PE = (price: number, eps: number): number => {\r\n return price / eps;\r\n}\r\n\r\nexport const PB = (price: number, bookValue: number): number => {\r\n return price / bookValue;\r\n}\r\n\r\nexport const DividendYield = (dividend: number, price: number): number => {\r\n return (dividend / price) * 100;\r\n}\r\n\r\nexport const Beta = (covariance: number, marketVariance: number): number => {\r\n return covariance / marketVariance;\r\n}\r\n\r\nexport const Alpha = (actualReturn: number, expectedReturn: number): number => {\r\n return actualReturn - expectedReturn;\r\n}\r\n\r\nexport const Sharpe = (returns: number[], riskFreeRate = 0): number => {\r\n const avg = returns.reduce((a, b) => a + b, 0) / returns.length;\r\n const std = Math.sqrt(returns.reduce((a, b) => a + Math.pow(b - avg, 2), 0) / returns.length);\r\n return (avg - riskFreeRate) / std;\r\n}\r\n","export const volatility = (returns: number[]): number => {\r\n const mean = returns.reduce((a, b) => a + b, 0) / returns.length;\r\n return Math.sqrt(returns.reduce((a, b) => a + Math.pow(b - mean, 2), 0) / returns.length);\r\n}\r\n\r\nexport const positionSizing = (accountBalance: number, riskPercent: number, stopLossDistance: number): number => {\r\n return (accountBalance * riskPercent) / stopLossDistance;\r\n}\r\n\r\nexport const stopLoss = (entryPrice: number, riskDistance: number): number => {\r\n return entryPrice - riskDistance;\r\n}\r\n\r\nexport const takeProfit = (entryPrice: number, profitDistance: number): number => {\r\n return entryPrice + profitDistance;\r\n}\r\n","export const VWAP = (prices: number[], volumes: number[]): number => {\r\n const totalVolume = volumes.reduce((a, b) => a + b, 0);\r\n const weightedSum = prices.reduce((sum, price, i) => sum + price * volumes[i], 0);\r\n return weightedSum / totalVolume;\r\n}\r\n\r\nexport const accumulationDistribution = (priceClose: number[], priceOpen: number[], volume: number[]): number => {\r\n return priceClose.reduce((acc, close, i) => {\r\n const mfm = ((close - priceOpen[i]) / (priceClose[i] - priceOpen[i])) || 0;\r\n return acc + mfm * volume[i];\r\n }, 0);\r\n}\r\n","export const covariance = (a: number[], b: number[]): number => {\r\n const meanA = a.reduce((x, y) => x + y, 0) / a.length;\r\n const meanB = b.reduce((x, y) => x + y, 0) / b.length;\r\n return a.reduce((acc, val, i) => acc + (val - meanA) * (b[i] - meanB), 0) / a.length;\r\n}\r\n\r\nexport const correlation = (a: number[], b: number[]): number => {\r\n const cov = covariance(a, b);\r\n const stdA = Math.sqrt(a.reduce((acc, val) => acc + Math.pow(val - a.reduce((x,y)=>x+y,0)/a.length,2),0)/a.length);\r\n const stdB = Math.sqrt(b.reduce((acc, val) => acc + Math.pow(val - b.reduce((x,y)=>x+y,0)/b.length,2),0)/b.length);\r\n return cov / (stdA * stdB);\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const SMA: (data: number[], period: number) => number;
2
+ export declare const EMA: (data: number[], period: number) => number;
@@ -0,0 +1,3 @@
1
+ export declare const percentChange: (current: number, previous: number) => number;
2
+ export declare const dailyReturn: (current: number, previous: number) => number;
3
+ export declare const cumulativeReturn: (returns: number[]) => number;
@@ -0,0 +1,6 @@
1
+ export declare const PE: (price: number, eps: number) => number;
2
+ export declare const PB: (price: number, bookValue: number) => number;
3
+ export declare const DividendYield: (dividend: number, price: number) => number;
4
+ export declare const Beta: (covariance: number, marketVariance: number) => number;
5
+ export declare const Alpha: (actualReturn: number, expectedReturn: number) => number;
6
+ export declare const Sharpe: (returns: number[], riskFreeRate?: number) => number;
package/dist/risk.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export declare const volatility: (returns: number[]) => number;
2
+ export declare const positionSizing: (accountBalance: number, riskPercent: number, stopLossDistance: number) => number;
3
+ export declare const stopLoss: (entryPrice: number, riskDistance: number) => number;
4
+ export declare const takeProfit: (entryPrice: number, profitDistance: number) => number;
@@ -0,0 +1,2 @@
1
+ export declare const covariance: (a: number[], b: number[]) => number;
2
+ export declare const correlation: (a: number[], b: number[]) => number;
@@ -0,0 +1,2 @@
1
+ export declare const VWAP: (prices: number[], volumes: number[]) => number;
2
+ export declare const accumulationDistribution: (priceClose: number[], priceOpen: number[], volume: number[]) => number;
@@ -0,0 +1,9 @@
1
+ module.exports = {
2
+ preset: 'ts-jest',
3
+ testEnvironment: 'node',
4
+ roots: ['<rootDir>/tests'],
5
+ moduleFileExtensions: ['ts', 'js', 'json', 'node'],
6
+ transform: {
7
+ '^.+\\.ts$': 'ts-jest'
8
+ }
9
+ };
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "finmagic",
3
+ "author": "Mohammad Esmaeilzadeh",
4
+ "description": "A TypeScript library for essential financial, technical, and statistical calculations.",
5
+ "version": "1.0.0",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/buglessir/finmagic.git"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/buglessir/finmagic/issues"
13
+ },
14
+ "homepage": "https://github.com/buglessir/finmagic",
15
+ "keywords": [
16
+ "finmagic",
17
+ "typescript",
18
+ "Price calculations",
19
+ "Moving averages",
20
+ "Financial calculations",
21
+ "Financial ratios",
22
+ "Risk management",
23
+ "Volume indicators",
24
+ "Statistical functions",
25
+ "Trade",
26
+ "Stocks"
27
+ ],
28
+ "type": "module",
29
+ "main": "dist/index.cjs.js",
30
+ "module": "dist/index.esm.js",
31
+ "types": "dist/index.d.ts",
32
+ "scripts": {
33
+ "build": "rollup -c",
34
+ "test": "jest"
35
+ },
36
+ "devDependencies": {
37
+ "@rollup/plugin-node-resolve": "^16.0.3",
38
+ "@rollup/plugin-typescript": "^12.3.0",
39
+ "@types/jest": "^30.0.0",
40
+ "jest": "^30.2.0",
41
+ "rollup": "^4.54.0",
42
+ "ts-jest": "^29.4.6",
43
+ "tslib": "^2.8.1",
44
+ "typescript": "^5.9.3"
45
+ }
46
+ }
@@ -0,0 +1,29 @@
1
+ import typescript from '@rollup/plugin-typescript';
2
+ import resolve from '@rollup/plugin-node-resolve';
3
+
4
+ export default [
5
+ {
6
+ input: 'src/index.ts',
7
+ output: {
8
+ file: 'dist/index.esm.js',
9
+ format: 'esm',
10
+ sourcemap: true
11
+ },
12
+ plugins: [
13
+ resolve(),
14
+ typescript({ tsconfig: './tsconfig.json' })
15
+ ]
16
+ },
17
+ {
18
+ input: 'src/index.ts',
19
+ output: {
20
+ file: 'dist/index.cjs.js',
21
+ format: 'cjs',
22
+ sourcemap: true
23
+ },
24
+ plugins: [
25
+ resolve(),
26
+ typescript({ tsconfig: './tsconfig.json' })
27
+ ]
28
+ }
29
+ ];
@@ -0,0 +1,29 @@
1
+ export const PV = (futureValue: number, rate: number, periods: number): number => {
2
+ return futureValue / Math.pow(1 + rate, periods);
3
+ }
4
+
5
+ export const FV = (presentValue: number, rate: number, periods: number): number => {
6
+ return presentValue * Math.pow(1 + rate, periods);
7
+ }
8
+
9
+ export const NPV = (rate: number, cashFlows: number[]): number => {
10
+ return cashFlows.reduce((acc, cf, i) => acc + cf / Math.pow(1 + rate, i + 1), 0);
11
+ }
12
+
13
+ export const IRR = (cashFlows: number[], guess = 0.1): number => {
14
+ let rate = guess;
15
+ let iteration = 0;
16
+ const maxIter = 1000;
17
+ const tol = 1e-6;
18
+
19
+ while (iteration < maxIter) {
20
+ const npv = cashFlows.reduce((acc, cf, i) => acc + cf / Math.pow(1 + rate, i), 0);
21
+ const derivative = cashFlows.reduce((acc, cf, i) => acc - (i * cf) / Math.pow(1 + rate, i + 1), 0);
22
+ const newRate = rate - npv / derivative;
23
+ if (Math.abs(newRate - rate) < tol) break;
24
+ rate = newRate;
25
+ iteration++;
26
+ }
27
+
28
+ return rate;
29
+ }
package/src/index.ts ADDED
@@ -0,0 +1,7 @@
1
+ export * from './price';
2
+ export * from './moving';
3
+ export * from './financial';
4
+ export * from './ratios';
5
+ export * from './risk';
6
+ export * from './volume';
7
+ export * from './statistics';
package/src/moving.ts ADDED
@@ -0,0 +1,10 @@
1
+ export const SMA = (data: number[], period: number): number => {
2
+ const slice = data.slice(-period);
3
+ const sum = slice.reduce((a, b) => a + b, 0);
4
+ return sum / slice.length;
5
+ }
6
+
7
+ export const EMA = (data: number[], period: number): number => {
8
+ const k = 2 / (period + 1);
9
+ return data.reduce((prev, curr) => curr * k + prev * (1 - k));
10
+ }
package/src/price.ts ADDED
@@ -0,0 +1,11 @@
1
+ export const percentChange = (current: number, previous: number): number => {
2
+ return ((current - previous) / previous) * 100;
3
+ }
4
+
5
+ export const dailyReturn = (current: number, previous: number): number => {
6
+ return percentChange(current, previous);
7
+ }
8
+
9
+ export const cumulativeReturn = (returns: number[]): number => {
10
+ return returns.reduce((acc, r) => acc * (1 + r / 100), 1) - 1;
11
+ }
package/src/ratios.ts ADDED
@@ -0,0 +1,25 @@
1
+ export const PE = (price: number, eps: number): number => {
2
+ return price / eps;
3
+ }
4
+
5
+ export const PB = (price: number, bookValue: number): number => {
6
+ return price / bookValue;
7
+ }
8
+
9
+ export const DividendYield = (dividend: number, price: number): number => {
10
+ return (dividend / price) * 100;
11
+ }
12
+
13
+ export const Beta = (covariance: number, marketVariance: number): number => {
14
+ return covariance / marketVariance;
15
+ }
16
+
17
+ export const Alpha = (actualReturn: number, expectedReturn: number): number => {
18
+ return actualReturn - expectedReturn;
19
+ }
20
+
21
+ export const Sharpe = (returns: number[], riskFreeRate = 0): number => {
22
+ const avg = returns.reduce((a, b) => a + b, 0) / returns.length;
23
+ const std = Math.sqrt(returns.reduce((a, b) => a + Math.pow(b - avg, 2), 0) / returns.length);
24
+ return (avg - riskFreeRate) / std;
25
+ }
package/src/risk.ts ADDED
@@ -0,0 +1,16 @@
1
+ export const volatility = (returns: number[]): number => {
2
+ const mean = returns.reduce((a, b) => a + b, 0) / returns.length;
3
+ return Math.sqrt(returns.reduce((a, b) => a + Math.pow(b - mean, 2), 0) / returns.length);
4
+ }
5
+
6
+ export const positionSizing = (accountBalance: number, riskPercent: number, stopLossDistance: number): number => {
7
+ return (accountBalance * riskPercent) / stopLossDistance;
8
+ }
9
+
10
+ export const stopLoss = (entryPrice: number, riskDistance: number): number => {
11
+ return entryPrice - riskDistance;
12
+ }
13
+
14
+ export const takeProfit = (entryPrice: number, profitDistance: number): number => {
15
+ return entryPrice + profitDistance;
16
+ }
@@ -0,0 +1,12 @@
1
+ export const covariance = (a: number[], b: number[]): number => {
2
+ const meanA = a.reduce((x, y) => x + y, 0) / a.length;
3
+ const meanB = b.reduce((x, y) => x + y, 0) / b.length;
4
+ return a.reduce((acc, val, i) => acc + (val - meanA) * (b[i] - meanB), 0) / a.length;
5
+ }
6
+
7
+ export const correlation = (a: number[], b: number[]): number => {
8
+ const cov = covariance(a, b);
9
+ const stdA = Math.sqrt(a.reduce((acc, val) => acc + Math.pow(val - a.reduce((x,y)=>x+y,0)/a.length,2),0)/a.length);
10
+ const stdB = Math.sqrt(b.reduce((acc, val) => acc + Math.pow(val - b.reduce((x,y)=>x+y,0)/b.length,2),0)/b.length);
11
+ return cov / (stdA * stdB);
12
+ }
package/src/volume.ts ADDED
@@ -0,0 +1,12 @@
1
+ export const VWAP = (prices: number[], volumes: number[]): number => {
2
+ const totalVolume = volumes.reduce((a, b) => a + b, 0);
3
+ const weightedSum = prices.reduce((sum, price, i) => sum + price * volumes[i], 0);
4
+ return weightedSum / totalVolume;
5
+ }
6
+
7
+ export const accumulationDistribution = (priceClose: number[], priceOpen: number[], volume: number[]): number => {
8
+ return priceClose.reduce((acc, close, i) => {
9
+ const mfm = ((close - priceOpen[i]) / (priceClose[i] - priceOpen[i])) || 0;
10
+ return acc + mfm * volume[i];
11
+ }, 0);
12
+ }
@@ -0,0 +1,20 @@
1
+ import { PV, FV, NPV, IRR } from '../src/financial';
2
+
3
+ describe('Financial calculations', () => {
4
+ test('PV calculates present value', () => {
5
+ expect(PV(1000, 0.1, 5)).toBeCloseTo(620.921, 2);
6
+ });
7
+
8
+ test('FV calculates future value', () => {
9
+ expect(FV(1000, 0.1, 5)).toBeCloseTo(1610.51, 2);
10
+ });
11
+
12
+ test('NPV calculates net present value', () => {
13
+ expect(NPV(0.1, [-1000, 200, 300, 500])).toBeCloseTo(-176.9, 1);
14
+ });
15
+
16
+ test('IRR calculates internal rate of return', () => {
17
+ const rate = IRR([-1000, 200, 300, 500]);
18
+ expect(rate).toBeCloseTo(-0.000000668, 6);
19
+ });
20
+ });
@@ -0,0 +1,11 @@
1
+ import { SMA, EMA } from '../src/moving';
2
+
3
+ describe('Moving averages', () => {
4
+ test('SMA calculates simple moving average', () => {
5
+ expect(SMA([1,2,3,4,5], 5)).toBe(3);
6
+ });
7
+
8
+ test('EMA calculates exponential moving average', () => {
9
+ expect(EMA([1,2,3,4,5], 3)).toBeCloseTo(4.0625, 4);
10
+ });
11
+ });
@@ -0,0 +1,17 @@
1
+ import { percentChange, dailyReturn, cumulativeReturn } from '../src/price';
2
+
3
+ describe('Price calculations', () => {
4
+ test('percentChange calculates correct percentage', () => {
5
+ expect(percentChange(110, 100)).toBe(10);
6
+ expect(percentChange(90, 100)).toBe(-10);
7
+ });
8
+
9
+ test('dailyReturn uses percentChange', () => {
10
+ expect(dailyReturn(105, 100)).toBe(5);
11
+ });
12
+
13
+ test('cumulativeReturn calculates cumulative growth', () => {
14
+ const returns = [5, 3, 2];
15
+ expect(cumulativeReturn(returns)).toBeCloseTo(0.107);
16
+ });
17
+ });
@@ -0,0 +1,28 @@
1
+ import { PE, PB, DividendYield, Beta, Alpha, Sharpe } from '../src/ratios';
2
+
3
+ describe('Financial ratios', () => {
4
+ test('PE ratio', () => {
5
+ expect(PE(50,5)).toBe(10);
6
+ });
7
+
8
+ test('PB ratio', () => {
9
+ expect(PB(50,20)).toBe(2.5);
10
+ });
11
+
12
+ test('DividendYield', () => {
13
+ expect(DividendYield(2,50)).toBe(4);
14
+ });
15
+
16
+ test('Beta calculation', () => {
17
+ expect(Beta(0.2,0.1)).toBe(2);
18
+ });
19
+
20
+ test('Alpha calculation', () => {
21
+ expect(Alpha(0.15,0.1)).toBeCloseTo(0.049999, 5);
22
+ });
23
+
24
+ test('Sharpe ratio', () => {
25
+ const returns = [0.01,0.02,0.03];
26
+ expect(Sharpe(returns)).toBeCloseTo(2.4495, 4);
27
+ });
28
+ });
@@ -0,0 +1,20 @@
1
+ import { volatility, positionSizing, stopLoss, takeProfit } from '../src/risk';
2
+
3
+ describe('Risk management', () => {
4
+ test('volatility calculation', () => {
5
+ const returns = [0.01, -0.02, 0.03];
6
+ expect(volatility(returns)).toBeCloseTo(0.025, 2);
7
+ });
8
+
9
+ test('positionSizing', () => {
10
+ expect(positionSizing(10000,0.02,5)).toBe(40);
11
+ });
12
+
13
+ test('stopLoss', () => {
14
+ expect(stopLoss(100,5)).toBe(95);
15
+ });
16
+
17
+ test('takeProfit', () => {
18
+ expect(takeProfit(100,10)).toBe(110);
19
+ });
20
+ });
@@ -0,0 +1,11 @@
1
+ import { covariance, correlation } from '../src/statistics';
2
+
3
+ describe('Statistics', () => {
4
+ test('covariance', () => {
5
+ expect(covariance([1,2,3],[4,5,6])).toBe(0.6666666666666666);
6
+ });
7
+
8
+ test('correlation', () => {
9
+ expect(correlation([1,2,3],[4,5,6])).toBeCloseTo(1,2);
10
+ });
11
+ });
@@ -0,0 +1,16 @@
1
+ import { VWAP, accumulationDistribution } from '../src/volume';
2
+
3
+ describe('Volume calculations', () => {
4
+ test('VWAP calculation', () => {
5
+ const prices = [100,102,101];
6
+ const volumes = [50,60,40];
7
+ expect(VWAP(prices, volumes)).toBeCloseTo(101.0666666667, 4);
8
+ });
9
+
10
+ test('AccumulationDistribution', () => {
11
+ const close = [10,12];
12
+ const open = [9,11];
13
+ const volume = [100,200];
14
+ expect(accumulationDistribution(close, open, volume)).toBe(300);
15
+ });
16
+ });
package/tsconfig.json ADDED
@@ -0,0 +1,13 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "module": "ESNext",
5
+ "strict": true,
6
+ "declaration": true,
7
+ "declarationDir": "dist",
8
+ "esModuleInterop": true,
9
+ "moduleResolution": "node",
10
+ "outDir": "dist"
11
+ },
12
+ "include": ["src"]
13
+ }