qntjs-lib 1.0.3 → 1.1.1

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/dist/index.d.ts CHANGED
@@ -2,4 +2,6 @@ export * as math from './math/index.js';
2
2
  export * as ta from './ta/index.js';
3
3
  export * as arr from './arr/arr.js';
4
4
  export * as stats from './stats/index.js';
5
+ export * as perf from './perf/index.js';
6
+ export type { MaxDrawdownInfo, DrawdownDurationResult } from './perf/index.js';
5
7
  export type { KstOptions, UltoscOptions, IchimokuOptions } from './ta/index.js';
@@ -0,0 +1,80 @@
1
+ export type DrawdownDurationResult = {
2
+ durations: Int32Array;
3
+ maxDuration: number;
4
+ };
5
+ export type MaxDrawdownInfo = {
6
+ maxDrawdown: number;
7
+ peakIndex: number;
8
+ troughIndex: number;
9
+ startIndex: number;
10
+ endIndex: number;
11
+ };
12
+ /**
13
+ * Compute the drawdown series from an equity/price series.
14
+ * For valid points: out[i] = equity[i]/peak - 1 (<= 0). NaNs propagate and do not update the peak.
15
+ * @param equity Array-like equity or price series
16
+ * @returns Float64Array of drawdowns (same length)
17
+ */
18
+ export declare function dd(equity: ArrayLike<number>): Float64Array;
19
+ /**
20
+ * Compute the maximum drawdown magnitude over the entire series.
21
+ * Returns a positive number (0..+inf) or NaN when no valid points.
22
+ * @param equity Array-like equity or price series
23
+ * @returns Maximum drawdown magnitude (positive) or NaN
24
+ */
25
+ export declare function maxdd(equity: ArrayLike<number>): number;
26
+ /**
27
+ * Compute detailed information about the maximum drawdown, including peak, trough, and recovery indices.
28
+ * When no valid points exist returns NaN/placeholder indices (-1).
29
+ * @param equity Array-like equity or price series
30
+ * @returns MaxDrawdownInfo with `maxDrawdown`, `peakIndex`, `troughIndex`, `startIndex`, and `endIndex`
31
+ */
32
+ export declare function maxddDetails(equity: ArrayLike<number>): MaxDrawdownInfo;
33
+ /**
34
+ * Rolling maximum drawdown over a trailing window.
35
+ * For each index i computes the max drawdown observed within the trailing window.
36
+ * @param equity Array-like equity or price series
37
+ * @param window Rolling window length (positive integer)
38
+ * @returns Float64Array of rolling max drawdowns
39
+ */
40
+ export declare function rollmaxdd(equity: ArrayLike<number>, window: number): Float64Array;
41
+ /**
42
+ * Compute drawdown durations (consecutive periods in current drawdown) and the maximum duration.
43
+ * Positions where equity is NaN are marked with -1.
44
+ * @param equity Array-like equity or price series
45
+ * @returns DrawdownDurationResult { durations: Int32Array, maxDuration: number }
46
+ */
47
+ export declare function dduration(equity: ArrayLike<number>): DrawdownDurationResult;
48
+ /**
49
+ * Recovery factor: ratio of annualized return (CAGR) to maximum drawdown magnitude.
50
+ * Returns NaN if insufficient data, invalid start value, or zero/NaN max drawdown.
51
+ * @param equity Array-like equity or price series
52
+ * @param freq Periods per year (default 252)
53
+ * @returns Recovery factor or NaN
54
+ */
55
+ export declare function recoveryFactor(equity: ArrayLike<number>, freq?: number): number;
56
+ /**
57
+ * Calmar ratio: CAGR over a lookback period divided by the max drawdown magnitude over the same period.
58
+ * If `lookbackPeriodYears` is null uses the entire series. Returns NaN on invalid inputs or zero drawdown.
59
+ * @param equity Array-like equity or price series
60
+ * @param lookbackPeriodYears Lookback window in years (null = full span)
61
+ * @param freq Periods per year (default 252)
62
+ * @returns Calmar ratio or NaN
63
+ */
64
+ export declare function calmarRatio(equity: ArrayLike<number>, lookbackPeriodYears?: number | null, freq?: number): number;
65
+ /**
66
+ * Ulcer Index: measures depth and duration of drawdowns (root-mean-square of depths).
67
+ * Returns NaN for empty input.
68
+ * @param equity Array-like equity or price series
69
+ * @returns Ulcer Index (>=0) or NaN
70
+ */
71
+ export declare function ulcerIndex(equity: ArrayLike<number>): number;
72
+ /**
73
+ * Rolling Ulcer Index computed over a trailing window.
74
+ * Returns NaN for windows with insufficient valid samples (< minPeriod) or invalid window.
75
+ * @param equity Array-like equity or price series
76
+ * @param window Rolling window length (positive integer)
77
+ * @param minPeriod Minimum number of valid points required in window
78
+ * @returns Float64Array of rolling ulcer index values
79
+ */
80
+ export declare function rollUlcerIndex(equity: ArrayLike<number>, window: number, minPeriod?: number): Float64Array;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Value-at-Risk (VaR) estimator.
3
+ * Supports `historical` (empirical quantile) and `parametric` (normal) methods.
4
+ * Returns NaN for empty inputs or invalid alpha or when parametric stats are invalid.
5
+ * @param returns Array-like returns series
6
+ * @param alpha Tail probability (default 0.05)
7
+ * @param method 'historical' | 'parametric' (default 'historical')
8
+ * @returns VaR as a number (left-tail) or NaN
9
+ */
10
+ export declare function valueAtRisk(returns: ArrayLike<number>, alpha?: number, method?: 'historical' | 'parametric'): number;
11
+ /**
12
+ * Expected shortfall (conditional tail expectation) estimator.
13
+ * Supports `historical` (empirical mean of losses <= VaR) and `parametric` (normal) methods.
14
+ * Returns NaN for empty inputs, invalid alpha, or invalid parametric stats.
15
+ * @param returns Array-like returns series
16
+ * @param alpha Tail probability (default 0.05)
17
+ * @param method 'historical' | 'parametric' (default 'historical')
18
+ * @returns Expected shortfall (left-tail) or NaN
19
+ */
20
+ export declare function expectedShortfall(returns: ArrayLike<number>, alpha?: number, method?: 'historical' | 'parametric'): number;
21
+ /**
22
+ * Tail ratio: mean of upper tail divided by absolute mean of lower tail.
23
+ * Returns NaN for empty inputs, invalid alpha, or when either tail has no observations or lower mean is zero.
24
+ * @param returns Array-like returns series
25
+ * @param alpha Tail probability (default 0.05)
26
+ * @returns Tail ratio or NaN
27
+ */
28
+ export declare function tailRatio(returns: ArrayLike<number>, alpha?: number): number;
29
+ /**
30
+ * Omega ratio: sum of gains above `requiredReturn` divided by sum of losses below it.
31
+ * Returns NaN for empty inputs or when there is no variation (all gains or all losses zero).
32
+ * @param returns Array-like returns series
33
+ * @param requiredReturn Threshold for gains/losses (default 0)
34
+ * @returns Omega ratio number, Infinity if no losses, or NaN when no variation
35
+ */
36
+ export declare function omegaRatio(returns: ArrayLike<number>, requiredReturn?: number): number;
37
+ declare const _default: {
38
+ valueAtRisk: typeof valueAtRisk;
39
+ expectedShortfall: typeof expectedShortfall;
40
+ tailRatio: typeof tailRatio;
41
+ omegaRatio: typeof omegaRatio;
42
+ };
43
+ export default _default;
@@ -0,0 +1,5 @@
1
+ export { cagr, cumreturns, logreturns, returns, dailyReturns } from './returns.js';
2
+ export { dd, dduration, maxdd, maxddDetails, recoveryFactor, calmarRatio, rollmaxdd, ulcerIndex, rollUlcerIndex } from './dd.js';
3
+ export type { DrawdownDurationResult, MaxDrawdownInfo } from './dd.js';
4
+ export { sharpe, sortino, rollsharpe, rollsortino, vol, rollvol } from './volatility.js';
5
+ export { valueAtRisk, expectedShortfall, omegaRatio, tailRatio } from './distribution.js';
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Compute simple period returns from a level series.
3
+ * For each i>0: returns[i] = source[i]/source[i-1] - 1 when both values are finite and previous != 0.
4
+ * The first element is always NaN. Invalid or non-finite inputs produce NaN at that position.
5
+ * @param source Input level series (prices/equity)
6
+ * @returns Float32Array of simple returns (same length as `source`)
7
+ */
8
+ export declare function returns(source: ArrayLike<number>): Float32Array;
9
+ /**
10
+ * Compute log returns from a level series.
11
+ * For each i>0: logreturns[i] = log(source[i]/source[i-1]) when both values are finite and previous>0.
12
+ * The first element is always NaN. Invalid or non-positive previous values yield NaN.
13
+ * @param source Input level series (prices/equity)
14
+ * @returns Float32Array of log returns (same length as `source`)
15
+ */
16
+ export declare function logreturns(source: ArrayLike<number>): Float32Array;
17
+ /**
18
+ * Compute cumulative compound returns from a returns series, skipping NaNs.
19
+ * Cumulative return at i is prod_{j<=i, r_j finite} (1+r_j) - 1; NaN inputs leave an output NaN at that position.
20
+ * @param returns Simple returns series
21
+ * @returns Float64Array of cumulative returns
22
+ */
23
+ export declare function cumreturns(returns: ArrayLike<number>): Float64Array;
24
+ /**
25
+ * Compute the compound annual growth rate (CAGR) from a returns series.
26
+ * Ignores NaNs. `freq` is the number of periods per year (default 252).
27
+ * @param returns Simple returns series
28
+ * @param freq Periods per year (default 252)
29
+ * @returns CAGR as a number, or NaN when insufficient data
30
+ */
31
+ export declare function cagr(returns: ArrayLike<number>, freq?: number): number;
32
+ /**
33
+ * Aggregate irregular (event-aligned) returns into calendar-day returns.
34
+ *
35
+ * The function groups `returnsArr` by calendar day (optionally shifted by `tzOffsetMinutes`),
36
+ * compounds returns within each day (prod(1+r)-1) and returns a continuous range of days
37
+ * from the minimum to the maximum observed day. Missing days are filled with zero returns.
38
+ *
39
+ * @param tsMs Array of timestamps (ms since epoch) aligned to `returnsArr`
40
+ * @param returnsArr Array of simple returns aligned to `tsMs`
41
+ * @param tzOffsetMinutes Optional timezone offset in minutes (default 0, UTC)
42
+ * @returns Object { days: number[], dailyReturns: Float32Array }
43
+ */
44
+ export declare function dailyReturns(tsMs: ArrayLike<number>, returnsArr: ArrayLike<number>, tzOffsetMinutes?: number): {
45
+ days: number[];
46
+ dailyReturns: Float32Array<ArrayBuffer>;
47
+ };
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Compute the (annualized) Sharpe ratio for a returns series.
3
+ * Uses NaN-aware mean and sample standard deviation (ddof=1).
4
+ * Returns NaN for empty input, zero or NaN volatility, or invalid mean.
5
+ * @param returns Array-like returns series
6
+ * @param riskFree Annualized risk-free rate (default 0)
7
+ * @param freq Periods per year (default 252)
8
+ * @returns Sharpe ratio (annualized) or NaN
9
+ */
10
+ export declare function sharpe(returns: ArrayLike<number>, riskFree?: number, freq?: number): number;
11
+ /**
12
+ * Compute the (annualized) Sortino ratio for a returns series.
13
+ * Uses downside deviation (sample corrected) computed over negative excess returns.
14
+ * Requires at least two downside observations; returns NaN otherwise.
15
+ * @param returns Array-like returns series
16
+ * @param requiredReturn Target return to define downside (default 0)
17
+ * @param freq Periods per year (default 252)
18
+ * @param minPeriod Minimum valid periods (unused for scalar Sortino)
19
+ * @returns Sortino ratio (annualized) or NaN
20
+ */
21
+ export declare function sortino(returns: ArrayLike<number>, requiredReturn?: number, freq?: number, minPeriod?: number): number;
22
+ /**
23
+ * Rolling Sharpe ratio computed over a trailing window.
24
+ * Output is a Float64Array aligned with `returns`; positions before enough data are NaN.
25
+ * @param returns Array-like returns series
26
+ * @param window Rolling window length
27
+ * @param riskFree Annualized risk-free rate (default 0)
28
+ * @param freq Periods per year (default 252)
29
+ * @param minPeriod Minimum number of valid samples required per window (default 1)
30
+ * @returns Float64Array of rolling Sharpe ratios
31
+ */
32
+ export declare function rollsharpe(returns: ArrayLike<number>, window: number, riskFree?: number, freq?: number, minPeriod?: number): Float64Array;
33
+ /**
34
+ * Rolling Sortino ratio computed over a trailing window using downside deviations.
35
+ * Outputs NaN where insufficient downside or invalid data exists.
36
+ * @param returns Array-like returns series
37
+ * @param window Rolling window length
38
+ * @param requiredReturn Target return to define downside (default 0)
39
+ * @param freq Periods per year (default 252)
40
+ * @param minPeriod Minimum number of valid samples required per window (default 1)
41
+ * @returns Float64Array of rolling Sortino ratios
42
+ */
43
+ export declare function rollsortino(returns: ArrayLike<number>, window: number, requiredReturn?: number, freq?: number, minPeriod?: number): Float64Array;
44
+ /**
45
+ * Annualized volatility (sample standard deviation) of returns.
46
+ * Uses NaN-aware `stats.stdev` with ddof=1. Returns NaN for empty input or zero/NaN sigma.
47
+ * @param returns Array-like returns series
48
+ * @param freq Periods per year (default 252)
49
+ * @returns Annualized volatility or NaN
50
+ */
51
+ export declare function vol(returns: ArrayLike<number>, freq?: number): number;
52
+ /**
53
+ * Rolling annualized volatility (sample stddev) over a trailing window.
54
+ * Outputs NaN for windows with insufficient valid samples or zero/NaN sigma.
55
+ * @param returns Array-like returns series
56
+ * @param window Rolling window length
57
+ * @param freq Periods per year (default 252)
58
+ * @param minPeriod Minimum number of valid samples required per window (default 1)
59
+ * @returns Float64Array of rolling volatilities
60
+ */
61
+ export declare function rollvol(returns: ArrayLike<number>, window: number, freq?: number, minPeriod?: number): Float64Array;
@@ -31,6 +31,19 @@ export type IchimokuOptions = {
31
31
  senkouB?: number;
32
32
  };
33
33
 
34
+ export type DrawdownDurationResult = {
35
+ durations: Int32Array;
36
+ maxDuration: number;
37
+ };
38
+
39
+ export type MaxDrawdownInfo = {
40
+ maxDrawdown: number;
41
+ peakIndex: number;
42
+ troughIndex: number;
43
+ startIndex: number;
44
+ endIndex: number;
45
+ };
46
+
34
47
  declare namespace math {
35
48
  /**
36
49
  * Element-wise absolute value.
@@ -1191,4 +1204,220 @@ declare namespace stats {
1191
1204
  export function zscore(source: ArrayLike<number>, skipna?: boolean): number[];
1192
1205
  }
1193
1206
 
1194
- export { math, ta, arr, stats };
1207
+ declare namespace perf {
1208
+ /**
1209
+ * Compute the compound annual growth rate (CAGR) from a returns series.
1210
+ * Ignores NaNs. `freq` is the number of periods per year (default 252).
1211
+ * @param returns Simple returns series
1212
+ * @param freq Periods per year (default 252)
1213
+ * @returns CAGR as a number, or NaN when insufficient data
1214
+ */
1215
+ export function cagr(returns: ArrayLike<number>, freq?: number): number;
1216
+ /**
1217
+ * Calmar ratio: CAGR over a lookback period divided by the max drawdown magnitude over the same period.
1218
+ * If `lookbackPeriodYears` is null uses the entire series. Returns NaN on invalid inputs or zero drawdown.
1219
+ * @param equity Array-like equity or price series
1220
+ * @param lookbackPeriodYears Lookback window in years (null = full span)
1221
+ * @param freq Periods per year (default 252)
1222
+ * @returns Calmar ratio or NaN
1223
+ */
1224
+ export function calmarRatio(equity: ArrayLike<number>, lookbackPeriodYears?: number | null, freq?: number): number;
1225
+ /**
1226
+ * Compute cumulative compound returns from a returns series, skipping NaNs.
1227
+ * Cumulative return at i is prod_{j<=i, r_j finite} (1+r_j) - 1; NaN inputs leave an output NaN at that position.
1228
+ * @param returns Simple returns series
1229
+ * @returns Float64Array of cumulative returns
1230
+ */
1231
+ export function cumreturns(returns: ArrayLike<number>): number[];
1232
+ /**
1233
+ * Aggregate irregular (event-aligned) returns into calendar-day returns.
1234
+ *
1235
+ * The function groups `returnsArr` by calendar day (optionally shifted by `tzOffsetMinutes`),
1236
+ * compounds returns within each day (prod(1+r)-1) and returns a continuous range of days
1237
+ * from the minimum to the maximum observed day. Missing days are filled with zero returns.
1238
+ *
1239
+ * @param tsMs Array of timestamps (ms since epoch) aligned to `returnsArr`
1240
+ * @param returnsArr Array of simple returns aligned to `tsMs`
1241
+ * @param tzOffsetMinutes Optional timezone offset in minutes (default 0, UTC)
1242
+ * @returns Object { days: number[], dailyReturns: Float32Array }
1243
+ */
1244
+ export function dailyReturns(tsMs: ArrayLike<number>, returnsArr: ArrayLike<number>, tzOffsetMinutes?: number): {
1245
+ days: number[];
1246
+ dailyReturns: Float32Array<ArrayBuffer>;
1247
+ };
1248
+ /**
1249
+ * Compute the drawdown series from an equity/price series.
1250
+ * For valid points: out[i] = equity[i]/peak - 1 (<= 0). NaNs propagate and do not update the peak.
1251
+ * @param equity Array-like equity or price series
1252
+ * @returns Float64Array of drawdowns (same length)
1253
+ */
1254
+ export function dd(equity: ArrayLike<number>): number[];
1255
+ /**
1256
+ * Compute drawdown durations (consecutive periods in current drawdown) and the maximum duration.
1257
+ * Positions where equity is NaN are marked with -1.
1258
+ * @param equity Array-like equity or price series
1259
+ * @returns DrawdownDurationResult { durations: Int32Array, maxDuration: number }
1260
+ */
1261
+ export function dduration(equity: ArrayLike<number>): DrawdownDurationResult;
1262
+ /**
1263
+ * Expected shortfall (conditional tail expectation) estimator.
1264
+ * Supports `historical` (empirical mean of losses <= VaR) and `parametric` (normal) methods.
1265
+ * Returns NaN for empty inputs, invalid alpha, or invalid parametric stats.
1266
+ * @param returns Array-like returns series
1267
+ * @param alpha Tail probability (default 0.05)
1268
+ * @param method 'historical' | 'parametric' (default 'historical')
1269
+ * @returns Expected shortfall (left-tail) or NaN
1270
+ */
1271
+ export function expectedShortfall(returns: ArrayLike<number>, alpha?: number, method?: 'historical' | 'parametric'): number;
1272
+ /**
1273
+ * Compute log returns from a level series.
1274
+ * For each i>0: logreturns[i] = log(source[i]/source[i-1]) when both values are finite and previous>0.
1275
+ * The first element is always NaN. Invalid or non-positive previous values yield NaN.
1276
+ * @param source Input level series (prices/equity)
1277
+ * @returns Float32Array of log returns (same length as `source`)
1278
+ */
1279
+ export function logreturns(source: ArrayLike<number>): Float32Array;
1280
+ /**
1281
+ * Compute the maximum drawdown magnitude over the entire series.
1282
+ * Returns a positive number (0..+inf) or NaN when no valid points.
1283
+ * @param equity Array-like equity or price series
1284
+ * @returns Maximum drawdown magnitude (positive) or NaN
1285
+ */
1286
+ export function maxdd(equity: ArrayLike<number>): number;
1287
+ /**
1288
+ * Compute detailed information about the maximum drawdown, including peak, trough, and recovery indices.
1289
+ * When no valid points exist returns NaN/placeholder indices (-1).
1290
+ * @param equity Array-like equity or price series
1291
+ * @returns MaxDrawdownInfo with `maxDrawdown`, `peakIndex`, `troughIndex`, `startIndex`, and `endIndex`
1292
+ */
1293
+ export function maxddDetails(equity: ArrayLike<number>): MaxDrawdownInfo;
1294
+ /**
1295
+ * Omega ratio: sum of gains above `requiredReturn` divided by sum of losses below it.
1296
+ * Returns NaN for empty inputs or when there is no variation (all gains or all losses zero).
1297
+ * @param returns Array-like returns series
1298
+ * @param requiredReturn Threshold for gains/losses (default 0)
1299
+ * @returns Omega ratio number, Infinity if no losses, or NaN when no variation
1300
+ */
1301
+ export function omegaRatio(returns: ArrayLike<number>, requiredReturn?: number): number;
1302
+ /**
1303
+ * Recovery factor: ratio of annualized return (CAGR) to maximum drawdown magnitude.
1304
+ * Returns NaN if insufficient data, invalid start value, or zero/NaN max drawdown.
1305
+ * @param equity Array-like equity or price series
1306
+ * @param freq Periods per year (default 252)
1307
+ * @returns Recovery factor or NaN
1308
+ */
1309
+ export function recoveryFactor(equity: ArrayLike<number>, freq?: number): number;
1310
+ /**
1311
+ * Compute simple period returns from a level series.
1312
+ * For each i>0: returns[i] = source[i]/source[i-1] - 1 when both values are finite and previous != 0.
1313
+ * The first element is always NaN. Invalid or non-finite inputs produce NaN at that position.
1314
+ * @param source Input level series (prices/equity)
1315
+ * @returns Float32Array of simple returns (same length as `source`)
1316
+ */
1317
+ export function returns(source: ArrayLike<number>): Float32Array;
1318
+ /**
1319
+ * Rolling Ulcer Index computed over a trailing window.
1320
+ * Returns NaN for windows with insufficient valid samples (< minPeriod) or invalid window.
1321
+ * @param equity Array-like equity or price series
1322
+ * @param window Rolling window length (positive integer)
1323
+ * @param minPeriod Minimum number of valid points required in window
1324
+ * @returns Float64Array of rolling ulcer index values
1325
+ */
1326
+ export function rollUlcerIndex(equity: ArrayLike<number>, window: number, minPeriod?: number): number[];
1327
+ /**
1328
+ * Rolling maximum drawdown over a trailing window.
1329
+ * For each index i computes the max drawdown observed within the trailing window.
1330
+ * @param equity Array-like equity or price series
1331
+ * @param window Rolling window length (positive integer)
1332
+ * @returns Float64Array of rolling max drawdowns
1333
+ */
1334
+ export function rollmaxdd(equity: ArrayLike<number>, window: number): number[];
1335
+ /**
1336
+ * Rolling Sharpe ratio computed over a trailing window.
1337
+ * Output is a Float64Array aligned with `returns`; positions before enough data are NaN.
1338
+ * @param returns Array-like returns series
1339
+ * @param window Rolling window length
1340
+ * @param riskFree Annualized risk-free rate (default 0)
1341
+ * @param freq Periods per year (default 252)
1342
+ * @param minPeriod Minimum number of valid samples required per window (default 1)
1343
+ * @returns Float64Array of rolling Sharpe ratios
1344
+ */
1345
+ export function rollsharpe(returns: ArrayLike<number>, window: number, riskFree?: number, freq?: number, minPeriod?: number): number[];
1346
+ /**
1347
+ * Rolling Sortino ratio computed over a trailing window using downside deviations.
1348
+ * Outputs NaN where insufficient downside or invalid data exists.
1349
+ * @param returns Array-like returns series
1350
+ * @param window Rolling window length
1351
+ * @param requiredReturn Target return to define downside (default 0)
1352
+ * @param freq Periods per year (default 252)
1353
+ * @param minPeriod Minimum number of valid samples required per window (default 1)
1354
+ * @returns Float64Array of rolling Sortino ratios
1355
+ */
1356
+ export function rollsortino(returns: ArrayLike<number>, window: number, requiredReturn?: number, freq?: number, minPeriod?: number): number[];
1357
+ /**
1358
+ * Rolling annualized volatility (sample stddev) over a trailing window.
1359
+ * Outputs NaN for windows with insufficient valid samples or zero/NaN sigma.
1360
+ * @param returns Array-like returns series
1361
+ * @param window Rolling window length
1362
+ * @param freq Periods per year (default 252)
1363
+ * @param minPeriod Minimum number of valid samples required per window (default 1)
1364
+ * @returns Float64Array of rolling volatilities
1365
+ */
1366
+ export function rollvol(returns: ArrayLike<number>, window: number, freq?: number, minPeriod?: number): number[];
1367
+ /**
1368
+ * Compute the (annualized) Sharpe ratio for a returns series.
1369
+ * Uses NaN-aware mean and sample standard deviation (ddof=1).
1370
+ * Returns NaN for empty input, zero or NaN volatility, or invalid mean.
1371
+ * @param returns Array-like returns series
1372
+ * @param riskFree Annualized risk-free rate (default 0)
1373
+ * @param freq Periods per year (default 252)
1374
+ * @returns Sharpe ratio (annualized) or NaN
1375
+ */
1376
+ export function sharpe(returns: ArrayLike<number>, riskFree?: number, freq?: number): number;
1377
+ /**
1378
+ * Compute the (annualized) Sortino ratio for a returns series.
1379
+ * Uses downside deviation (sample corrected) computed over negative excess returns.
1380
+ * Requires at least two downside observations; returns NaN otherwise.
1381
+ * @param returns Array-like returns series
1382
+ * @param requiredReturn Target return to define downside (default 0)
1383
+ * @param freq Periods per year (default 252)
1384
+ * @param minPeriod Minimum valid periods (unused for scalar Sortino)
1385
+ * @returns Sortino ratio (annualized) or NaN
1386
+ */
1387
+ export function sortino(returns: ArrayLike<number>, requiredReturn?: number, freq?: number, minPeriod?: number): number;
1388
+ /**
1389
+ * Tail ratio: mean of upper tail divided by absolute mean of lower tail.
1390
+ * Returns NaN for empty inputs, invalid alpha, or when either tail has no observations or lower mean is zero.
1391
+ * @param returns Array-like returns series
1392
+ * @param alpha Tail probability (default 0.05)
1393
+ * @returns Tail ratio or NaN
1394
+ */
1395
+ export function tailRatio(returns: ArrayLike<number>, alpha?: number): number;
1396
+ /**
1397
+ * Ulcer Index: measures depth and duration of drawdowns (root-mean-square of depths).
1398
+ * Returns NaN for empty input.
1399
+ * @param equity Array-like equity or price series
1400
+ * @returns Ulcer Index (>=0) or NaN
1401
+ */
1402
+ export function ulcerIndex(equity: ArrayLike<number>): number;
1403
+ /**
1404
+ * Value-at-Risk (VaR) estimator.
1405
+ * Supports `historical` (empirical quantile) and `parametric` (normal) methods.
1406
+ * Returns NaN for empty inputs or invalid alpha or when parametric stats are invalid.
1407
+ * @param returns Array-like returns series
1408
+ * @param alpha Tail probability (default 0.05)
1409
+ * @param method 'historical' | 'parametric' (default 'historical')
1410
+ * @returns VaR as a number (left-tail) or NaN
1411
+ */
1412
+ export function valueAtRisk(returns: ArrayLike<number>, alpha?: number, method?: 'historical' | 'parametric'): number;
1413
+ /**
1414
+ * Annualized volatility (sample standard deviation) of returns.
1415
+ * Uses NaN-aware `stats.stdev` with ddof=1. Returns NaN for empty input or zero/NaN sigma.
1416
+ * @param returns Array-like returns series
1417
+ * @param freq Periods per year (default 252)
1418
+ * @returns Annualized volatility or NaN
1419
+ */
1420
+ export function vol(returns: ArrayLike<number>, freq?: number): number;
1421
+ }
1422
+
1423
+ export { math, ta, arr, stats, perf };
@@ -24,6 +24,7 @@ export const math = wrapNamespace(core.math || {});
24
24
  export const ta = wrapNamespace(core.ta || {});
25
25
  export const arr = wrapNamespace(core.arr || {});
26
26
  export const stats = wrapNamespace(core.stats || {});
27
+ export const perf = wrapNamespace(core.perf || {});
27
28
 
28
- const _default = { math, ta, arr, stats };
29
+ const _default = { math, ta, arr, stats, perf };
29
30
  export default _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qntjs-lib",
3
- "version": "1.0.3",
3
+ "version": "1.1.1",
4
4
  "type": "module",
5
5
  "main": "./dist/bundle/index.js",
6
6
  "types": "./dist/index.d.ts",