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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
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":";;
|
|
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.
|
|
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": "^
|
|
37
|
+
"@types/node": "^26.1.2",
|
|
38
38
|
"jest": "^30.4.2",
|
|
39
39
|
"rimraf": "^6.1.3",
|
|
40
|
-
"ts-jest": "^29.4.
|
|
40
|
+
"ts-jest": "^29.4.12",
|
|
41
41
|
"typescript": "^6.0.3"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"axios": "^1.18.
|
|
44
|
+
"axios": "^1.18.1",
|
|
45
45
|
"crypto-js": "^4.2.0",
|
|
46
46
|
"dotenv": "^17.4.2",
|
|
47
|
-
"itrm-tools": "
|
|
47
|
+
"itrm-tools": "1.3.48",
|
|
48
48
|
"morgan": "^1.11.0"
|
|
49
49
|
},
|
|
50
50
|
"optionalDependencies": {
|