elemento-alpha-tools 1.3.7 → 1.3.10

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.
@@ -2,5 +2,8 @@ export interface AssetMetrics {
2
2
  return: number;
3
3
  volatility: number;
4
4
  ratio: number;
5
+ sortino: number;
6
+ maxdrawdown: number;
7
+ downsiderisk: number;
5
8
  }
6
9
  export declare function computeAssetMetrics(rawPrices: Array<number | null | undefined>): AssetMetrics | null;
@@ -1,24 +1,65 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.computeAssetMetrics = computeAssetMetrics;
4
- function computeAssetMetrics(rawPrices) {
5
- const prices = rawPrices.filter((price) => typeof price === 'number' && Number.isFinite(price) && price > 0);
6
- if (prices.length > 2) {
7
- const dailyReturns = [];
8
- for (let i = 1; i < prices.length; i++)
9
- dailyReturns.push(prices[i] / prices[i - 1] - 1);
10
- const averageDailyReturn = dailyReturns.reduce((total, value) => total + value, 0) / dailyReturns.length;
11
- const annualReturn = Math.pow(1 + averageDailyReturn, 365) - 1;
12
- const variance = dailyReturns.reduce((total, value) => total + Math.pow(value - averageDailyReturn, 2), 0) / dailyReturns.length;
13
- const volatility = Math.sqrt(variance * 365);
14
- if (Number.isFinite(annualReturn) && Number.isFinite(volatility)) {
15
- const ratio = volatility > 0 ? annualReturn / volatility : 0;
16
- return { return: annualReturn, volatility, ratio };
4
+ const ANNUALIZATION_DAYS = 365;
5
+ function dailyReturns(prices) {
6
+ const returns = [];
7
+ for (let i = 1; i < prices.length; i++)
8
+ returns.push(prices[i] / prices[i - 1] - 1);
9
+ return returns;
10
+ }
11
+ function average(values) {
12
+ return values.reduce((total, value) => total + value, 0) / values.length;
13
+ }
14
+ function annualizedReturn(returns) {
15
+ return Math.pow(1 + average(returns), ANNUALIZATION_DAYS) - 1;
16
+ }
17
+ function annualizedVolatility(returns) {
18
+ const mean = average(returns);
19
+ const variance = average(returns.map(r => Math.pow((r - mean), 2)));
20
+ return Math.sqrt(variance * ANNUALIZATION_DAYS);
21
+ }
22
+ function annualizedDownsideRisk(returns) {
23
+ const negatives = returns.filter(r => r < 0);
24
+ if (negatives.length === 0)
25
+ return 0;
26
+ const mean = average(negatives);
27
+ const variance = average(negatives.map(r => Math.pow((r - mean), 2)));
28
+ return Math.sqrt(variance) * Math.sqrt(ANNUALIZATION_DAYS);
29
+ }
30
+ function maxDrawdown(returns) {
31
+ let value = 100;
32
+ let peak = value;
33
+ let worst = 0;
34
+ for (const r of returns) {
35
+ value *= 1 + r;
36
+ if (value > peak)
37
+ peak = value;
38
+ else {
39
+ const drawdown = Math.abs(value / peak - 1);
40
+ if (drawdown > worst)
41
+ worst = drawdown;
17
42
  }
18
- else
19
- return null;
20
43
  }
21
- else
44
+ return worst;
45
+ }
46
+ function computeAssetMetrics(rawPrices) {
47
+ const prices = rawPrices.filter((price) => typeof price === 'number' && Number.isFinite(price) && price > 0);
48
+ if (prices.length <= 2)
49
+ return null;
50
+ const returns = dailyReturns(prices);
51
+ const annualReturn = annualizedReturn(returns);
52
+ const volatility = annualizedVolatility(returns);
53
+ const downsiderisk = annualizedDownsideRisk(returns);
54
+ if (![annualReturn, volatility, downsiderisk].every(Number.isFinite))
22
55
  return null;
56
+ return {
57
+ return: annualReturn,
58
+ volatility,
59
+ ratio: volatility > 0 ? annualReturn / volatility : 0,
60
+ sortino: downsiderisk > 0 ? annualReturn / downsiderisk : 0,
61
+ maxdrawdown: maxDrawdown(returns),
62
+ downsiderisk
63
+ };
23
64
  }
24
65
  //# sourceMappingURL=AssetMetricsCalculator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssetMetricsCalculator.js","sourceRoot":"","sources":["../../../src/optimization/assetsMetricsCalculator/AssetMetricsCalculator.ts"],"names":[],"mappings":";;AAMA,kDAiBC;AAjBD,SAAgB,mBAAmB,CAAC,SAA2C;IAC7E,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;IAE9H,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAEzF,MAAM,kBAAkB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC;QACzG,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,kBAAkB,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,kBAAkB,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC;QACjI,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;QAE7C,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACjE,MAAM,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7D,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QACrD,CAAC;;YAAM,OAAO,IAAI,CAAC;IACrB,CAAC;;QAAM,OAAO,IAAI,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"AssetMetricsCalculator.js","sourceRoot":"","sources":["../../../src/optimization/assetsMetricsCalculator/AssetMetricsCalculator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "elemento-alpha-tools",
3
- "version": "1.3.7",
3
+ "version": "1.3.10",
4
4
  "description": "Librería para los servicios de elemento alpha",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -34,17 +34,17 @@
34
34
  "@types/express": "^5.0.6",
35
35
  "@types/jest": "^30.0.0",
36
36
  "@types/morgan": "^1.9.9",
37
- "@types/node": "^25.9.3",
37
+ "@types/node": "^26.1.2",
38
38
  "jest": "^30.4.2",
39
39
  "rimraf": "^6.1.3",
40
- "ts-jest": "^29.4.11",
40
+ "ts-jest": "^29.4.12",
41
41
  "typescript": "^6.0.3"
42
42
  },
43
43
  "dependencies": {
44
- "axios": "^1.18.0",
44
+ "axios": "^1.18.1",
45
45
  "crypto-js": "^4.2.0",
46
46
  "dotenv": "^17.4.2",
47
- "itrm-tools": "^1.3.43",
47
+ "itrm-tools": "1.3.48",
48
48
  "morgan": "^1.11.0"
49
49
  },
50
50
  "optionalDependencies": {