orderflow-metrics 0.24.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/CHANGELOG.md +229 -0
- package/LICENSE +21 -0
- package/README.md +556 -0
- package/dist/bars.d.ts +67 -0
- package/dist/bars.d.ts.map +1 -0
- package/dist/bars.js +92 -0
- package/dist/bars.js.map +1 -0
- package/dist/classify.d.ts +25 -0
- package/dist/classify.d.ts.map +1 -0
- package/dist/classify.js +57 -0
- package/dist/classify.js.map +1 -0
- package/dist/covariance.d.ts +37 -0
- package/dist/covariance.d.ts.map +1 -0
- package/dist/covariance.js +72 -0
- package/dist/covariance.js.map +1 -0
- package/dist/efficiency.d.ts +24 -0
- package/dist/efficiency.d.ts.map +1 -0
- package/dist/efficiency.js +65 -0
- package/dist/efficiency.js.map +1 -0
- package/dist/entropy.d.ts +40 -0
- package/dist/entropy.d.ts.map +1 -0
- package/dist/entropy.js +73 -0
- package/dist/entropy.js.map +1 -0
- package/dist/execution.d.ts +40 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +64 -0
- package/dist/execution.js.map +1 -0
- package/dist/fairvalue.d.ts +19 -0
- package/dist/fairvalue.d.ts.map +1 -0
- package/dist/fairvalue.js +27 -0
- package/dist/fairvalue.js.map +1 -0
- package/dist/hurst.d.ts +23 -0
- package/dist/hurst.d.ts.map +1 -0
- package/dist/hurst.js +71 -0
- package/dist/hurst.js.map +1 -0
- package/dist/imbalance.d.ts +12 -0
- package/dist/imbalance.d.ts.map +1 -0
- package/dist/imbalance.js +19 -0
- package/dist/imbalance.js.map +1 -0
- package/dist/impact.d.ts +59 -0
- package/dist/impact.d.ts.map +1 -0
- package/dist/impact.js +63 -0
- package/dist/impact.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/jumps.d.ts +33 -0
- package/dist/jumps.d.ts.map +1 -0
- package/dist/jumps.js +63 -0
- package/dist/jumps.js.map +1 -0
- package/dist/liquidity.d.ts +18 -0
- package/dist/liquidity.d.ts.map +1 -0
- package/dist/liquidity.js +22 -0
- package/dist/liquidity.js.map +1 -0
- package/dist/moments.d.ts +20 -0
- package/dist/moments.d.ts.map +1 -0
- package/dist/moments.js +48 -0
- package/dist/moments.js.map +1 -0
- package/dist/ofi.d.ts +22 -0
- package/dist/ofi.d.ts.map +1 -0
- package/dist/ofi.js +25 -0
- package/dist/ofi.js.map +1 -0
- package/dist/online.d.ts +101 -0
- package/dist/online.d.ts.map +1 -0
- package/dist/online.js +205 -0
- package/dist/online.js.map +1 -0
- package/dist/orderbook.d.ts +30 -0
- package/dist/orderbook.d.ts.map +1 -0
- package/dist/orderbook.js +66 -0
- package/dist/orderbook.js.map +1 -0
- package/dist/rangevol.d.ts +40 -0
- package/dist/rangevol.d.ts.map +1 -0
- package/dist/rangevol.js +101 -0
- package/dist/rangevol.js.map +1 -0
- package/dist/scheduling.d.ts +19 -0
- package/dist/scheduling.d.ts.map +1 -0
- package/dist/scheduling.js +45 -0
- package/dist/scheduling.js.map +1 -0
- package/dist/semivar.d.ts +49 -0
- package/dist/semivar.d.ts.map +1 -0
- package/dist/semivar.js +59 -0
- package/dist/semivar.js.map +1 -0
- package/dist/shortfall.d.ts +42 -0
- package/dist/shortfall.d.ts.map +1 -0
- package/dist/shortfall.js +32 -0
- package/dist/shortfall.js.map +1 -0
- package/dist/simulate.d.ts +29 -0
- package/dist/simulate.d.ts.map +1 -0
- package/dist/simulate.js +36 -0
- package/dist/simulate.js.map +1 -0
- package/dist/spreadest.d.ts +38 -0
- package/dist/spreadest.d.ts.map +1 -0
- package/dist/spreadest.js +68 -0
- package/dist/spreadest.js.map +1 -0
- package/dist/types.d.ts +24 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/volatility.d.ts +21 -0
- package/dist/volatility.d.ts.map +1 -0
- package/dist/volatility.js +33 -0
- package/dist/volatility.js.map +1 -0
- package/dist/vpin.d.ts +38 -0
- package/dist/vpin.d.ts.map +1 -0
- package/dist/vpin.js +81 -0
- package/dist/vpin.js.map +1 -0
- package/package.json +70 -0
- package/src/bars.ts +141 -0
- package/src/classify.ts +59 -0
- package/src/covariance.ts +72 -0
- package/src/efficiency.ts +64 -0
- package/src/entropy.ts +67 -0
- package/src/execution.ts +100 -0
- package/src/fairvalue.ts +33 -0
- package/src/hurst.ts +77 -0
- package/src/imbalance.ts +25 -0
- package/src/impact.ts +99 -0
- package/src/index.ts +87 -0
- package/src/jumps.ts +61 -0
- package/src/liquidity.ts +29 -0
- package/src/moments.ts +45 -0
- package/src/ofi.ts +46 -0
- package/src/online.ts +228 -0
- package/src/orderbook.ts +76 -0
- package/src/rangevol.ts +108 -0
- package/src/scheduling.ts +50 -0
- package/src/semivar.ts +67 -0
- package/src/shortfall.ts +69 -0
- package/src/simulate.ts +68 -0
- package/src/spreadest.ts +75 -0
- package/src/types.ts +26 -0
- package/src/volatility.ts +36 -0
- package/src/vpin.ts +98 -0
package/dist/bars.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/** Aggregate a non-empty slice of trades into a single bar. */
|
|
2
|
+
function buildBar(trades) {
|
|
3
|
+
const first = trades[0];
|
|
4
|
+
const last = trades[trades.length - 1];
|
|
5
|
+
let high = first.price;
|
|
6
|
+
let low = first.price;
|
|
7
|
+
let volume = 0;
|
|
8
|
+
let dollar = 0;
|
|
9
|
+
let buyVolume = 0;
|
|
10
|
+
let sellVolume = 0;
|
|
11
|
+
for (const t of trades) {
|
|
12
|
+
if (t.price > high)
|
|
13
|
+
high = t.price;
|
|
14
|
+
if (t.price < low)
|
|
15
|
+
low = t.price;
|
|
16
|
+
volume += t.size;
|
|
17
|
+
dollar += t.price * t.size;
|
|
18
|
+
if (t.side === "buy")
|
|
19
|
+
buyVolume += t.size;
|
|
20
|
+
else
|
|
21
|
+
sellVolume += t.size;
|
|
22
|
+
}
|
|
23
|
+
const bar = {
|
|
24
|
+
open: first.price,
|
|
25
|
+
high,
|
|
26
|
+
low,
|
|
27
|
+
close: last.price,
|
|
28
|
+
volume,
|
|
29
|
+
dollar,
|
|
30
|
+
vwap: volume > 0 ? dollar / volume : first.price,
|
|
31
|
+
ticks: trades.length,
|
|
32
|
+
buyVolume,
|
|
33
|
+
sellVolume,
|
|
34
|
+
};
|
|
35
|
+
if (first.ts !== undefined)
|
|
36
|
+
bar.start = first.ts;
|
|
37
|
+
if (last.ts !== undefined)
|
|
38
|
+
bar.end = last.ts;
|
|
39
|
+
return bar;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Emit a bar every `threshold` trades (tick bars).
|
|
43
|
+
*
|
|
44
|
+
* @param threshold number of trades per bar (integer ≥ 1)
|
|
45
|
+
*/
|
|
46
|
+
export function tickBars(trades, threshold) {
|
|
47
|
+
const step = Math.floor(threshold);
|
|
48
|
+
if (step < 1)
|
|
49
|
+
return [];
|
|
50
|
+
const bars = [];
|
|
51
|
+
for (let i = 0; i + step <= trades.length; i += step) {
|
|
52
|
+
bars.push(buildBar(trades.slice(i, i + step)));
|
|
53
|
+
}
|
|
54
|
+
return bars;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Emit a bar each time cumulative size reaches `threshold` (volume bars).
|
|
58
|
+
* The trade that crosses the threshold closes the bar and is included whole.
|
|
59
|
+
*
|
|
60
|
+
* @param threshold volume per bar (> 0)
|
|
61
|
+
*/
|
|
62
|
+
export function volumeBars(trades, threshold) {
|
|
63
|
+
return accumulate(trades, threshold, (t) => t.size);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Emit a bar each time cumulative traded value (Σ price·size) reaches
|
|
67
|
+
* `threshold` (dollar bars). Dollar bars are the most robust of the three to
|
|
68
|
+
* changes in price level and are usually preferred (López de Prado, 2018).
|
|
69
|
+
*
|
|
70
|
+
* @param threshold traded value per bar (> 0)
|
|
71
|
+
*/
|
|
72
|
+
export function dollarBars(trades, threshold) {
|
|
73
|
+
return accumulate(trades, threshold, (t) => t.price * t.size);
|
|
74
|
+
}
|
|
75
|
+
/** Shared accumulator for volume / dollar bars. */
|
|
76
|
+
function accumulate(trades, threshold, weight) {
|
|
77
|
+
if (!(threshold > 0))
|
|
78
|
+
return [];
|
|
79
|
+
const bars = [];
|
|
80
|
+
let start = 0;
|
|
81
|
+
let acc = 0;
|
|
82
|
+
for (let i = 0; i < trades.length; i++) {
|
|
83
|
+
acc += weight(trades[i]);
|
|
84
|
+
if (acc >= threshold) {
|
|
85
|
+
bars.push(buildBar(trades.slice(start, i + 1)));
|
|
86
|
+
start = i + 1;
|
|
87
|
+
acc = 0;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return bars;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=bars.js.map
|
package/dist/bars.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bars.js","sourceRoot":"","sources":["../src/bars.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trade-sign classification.
|
|
3
|
+
*
|
|
4
|
+
* Public trade prints usually don't tell you which side was the aggressor.
|
|
5
|
+
* These rules infer it, so downstream OFI / imbalance / VPIN inputs can be
|
|
6
|
+
* signed. Output is +1 (buyer-initiated), −1 (seller-initiated), 0 (unknown).
|
|
7
|
+
*/
|
|
8
|
+
export type Sign = 1 | -1 | 0;
|
|
9
|
+
/**
|
|
10
|
+
* Tick rule: classify by the change vs the previous trade price.
|
|
11
|
+
* An unchanged ("zero tick") price carries the last non-zero sign; the first
|
|
12
|
+
* trade is unclassifiable (0).
|
|
13
|
+
*/
|
|
14
|
+
export declare function tickRule(prices: readonly number[]): Sign[];
|
|
15
|
+
export interface PriceVsMid {
|
|
16
|
+
price: number;
|
|
17
|
+
mid: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Lee-Ready (1991): quote rule first — a print above the prevailing mid is
|
|
21
|
+
* buyer-initiated, below is seller-initiated — with the tick rule breaking
|
|
22
|
+
* at-the-mid ties.
|
|
23
|
+
*/
|
|
24
|
+
export declare function leeReady(obs: readonly PriceVsMid[]): Sign[];
|
|
25
|
+
//# sourceMappingURL=classify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../src/classify.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAE9B;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,EAAE,CAa1D;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,SAAS,UAAU,EAAE,GAAG,IAAI,EAAE,CAkB3D"}
|
package/dist/classify.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trade-sign classification.
|
|
3
|
+
*
|
|
4
|
+
* Public trade prints usually don't tell you which side was the aggressor.
|
|
5
|
+
* These rules infer it, so downstream OFI / imbalance / VPIN inputs can be
|
|
6
|
+
* signed. Output is +1 (buyer-initiated), −1 (seller-initiated), 0 (unknown).
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Tick rule: classify by the change vs the previous trade price.
|
|
10
|
+
* An unchanged ("zero tick") price carries the last non-zero sign; the first
|
|
11
|
+
* trade is unclassifiable (0).
|
|
12
|
+
*/
|
|
13
|
+
export function tickRule(prices) {
|
|
14
|
+
const out = [];
|
|
15
|
+
let last = 0;
|
|
16
|
+
for (let i = 0; i < prices.length; i++) {
|
|
17
|
+
if (i > 0) {
|
|
18
|
+
const d = prices[i] - prices[i - 1];
|
|
19
|
+
if (d > 0)
|
|
20
|
+
last = 1;
|
|
21
|
+
else if (d < 0)
|
|
22
|
+
last = -1;
|
|
23
|
+
// d === 0 -> keep last (zero-tick)
|
|
24
|
+
}
|
|
25
|
+
out.push(last);
|
|
26
|
+
}
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Lee-Ready (1991): quote rule first — a print above the prevailing mid is
|
|
31
|
+
* buyer-initiated, below is seller-initiated — with the tick rule breaking
|
|
32
|
+
* at-the-mid ties.
|
|
33
|
+
*/
|
|
34
|
+
export function leeReady(obs) {
|
|
35
|
+
const out = [];
|
|
36
|
+
let last = 0;
|
|
37
|
+
for (let i = 0; i < obs.length; i++) {
|
|
38
|
+
const { price, mid } = obs[i];
|
|
39
|
+
let sign;
|
|
40
|
+
if (price > mid)
|
|
41
|
+
sign = 1;
|
|
42
|
+
else if (price < mid)
|
|
43
|
+
sign = -1;
|
|
44
|
+
else if (i > 0) {
|
|
45
|
+
const d = price - obs[i - 1].price;
|
|
46
|
+
sign = d > 0 ? 1 : d < 0 ? -1 : last;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
sign = 0;
|
|
50
|
+
}
|
|
51
|
+
if (sign !== 0)
|
|
52
|
+
last = sign;
|
|
53
|
+
out.push(sign);
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=classify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../src/classify.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAyB;IAChD,MAAM,GAAG,GAAW,EAAE,CAAC;IACvB,IAAI,IAAI,GAAS,CAAC,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,GAAG,CAAC;gBAAE,IAAI,GAAG,CAAC,CAAC;iBACf,IAAI,CAAC,GAAG,CAAC;gBAAE,IAAI,GAAG,CAAC,CAAC,CAAC;YAC1B,mCAAmC;QACrC,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAOD;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,GAA0B;IACjD,MAAM,GAAG,GAAW,EAAE,CAAC;IACvB,IAAI,IAAI,GAAS,CAAC,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,IAAU,CAAC;QACf,IAAI,KAAK,GAAG,GAAG;YAAE,IAAI,GAAG,CAAC,CAAC;aACrB,IAAI,KAAK,GAAG,GAAG;YAAE,IAAI,GAAG,CAAC,CAAC,CAAC;aAC3B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;YACnC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,CAAC,CAAC;QACX,CAAC;QACD,IAAI,IAAI,KAAK,CAAC;YAAE,IAAI,GAAG,IAAI,CAAC;QAC5B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Realized covariance, correlation, and beta between two return series.
|
|
3
|
+
*
|
|
4
|
+
* Single-asset volatility says how much one instrument moved; trading and risk
|
|
5
|
+
* live in how instruments move *together*. Summing the products of contemporaneous
|
|
6
|
+
* returns gives the realized (co)variance — the model-free, high-frequency analogue
|
|
7
|
+
* of covariance:
|
|
8
|
+
*
|
|
9
|
+
* realized covariance = Σ xᵢ · yᵢ
|
|
10
|
+
* realized correlation = Σ xᵢyᵢ / ( √Σxᵢ² · √Σyᵢ² ) (in [−1, 1])
|
|
11
|
+
* realized beta = Σ aᵢ·mᵢ / Σ mᵢ² (asset a vs market m)
|
|
12
|
+
*
|
|
13
|
+
* The two series are paired element-wise over their common length, so they must
|
|
14
|
+
* be aligned to the same sampling grid (equal length, matching timestamps).
|
|
15
|
+
* Correlation is scale-free; beta is the covariance of an asset with a market,
|
|
16
|
+
* normalized by the market's variance — the sensitivity of the asset to it.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Realized covariance: Σ xᵢyᵢ over contemporaneous returns. Symmetric in its
|
|
20
|
+
* arguments; returns 0 for empty input. Series are paired over their common
|
|
21
|
+
* length, so align them to the same sampling grid first.
|
|
22
|
+
*/
|
|
23
|
+
export declare function realizedCovariance(x: readonly number[], y: readonly number[]): number;
|
|
24
|
+
/**
|
|
25
|
+
* Realized correlation: Σ xᵢyᵢ / (√Σxᵢ² · √Σyᵢ²), in [−1, 1]. Scale-free measure
|
|
26
|
+
* of co-movement. Returns 0 when either series has zero realized variance (or is
|
|
27
|
+
* empty).
|
|
28
|
+
*/
|
|
29
|
+
export declare function realizedCorrelation(x: readonly number[], y: readonly number[]): number;
|
|
30
|
+
/**
|
|
31
|
+
* Realized beta of an asset against a market/benchmark: Σ aᵢmᵢ / Σ mᵢ², i.e. the
|
|
32
|
+
* realized covariance of the two divided by the market's realized variance — the
|
|
33
|
+
* asset's sensitivity to the market. Returns 0 when the market has zero realized
|
|
34
|
+
* variance (or the input is empty).
|
|
35
|
+
*/
|
|
36
|
+
export declare function realizedBeta(asset: readonly number[], market: readonly number[]): number;
|
|
37
|
+
//# sourceMappingURL=covariance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"covariance.d.ts","sourceRoot":"","sources":["../src/covariance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAUH;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAErF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAatF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAUxF"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Realized covariance, correlation, and beta between two return series.
|
|
3
|
+
*
|
|
4
|
+
* Single-asset volatility says how much one instrument moved; trading and risk
|
|
5
|
+
* live in how instruments move *together*. Summing the products of contemporaneous
|
|
6
|
+
* returns gives the realized (co)variance — the model-free, high-frequency analogue
|
|
7
|
+
* of covariance:
|
|
8
|
+
*
|
|
9
|
+
* realized covariance = Σ xᵢ · yᵢ
|
|
10
|
+
* realized correlation = Σ xᵢyᵢ / ( √Σxᵢ² · √Σyᵢ² ) (in [−1, 1])
|
|
11
|
+
* realized beta = Σ aᵢ·mᵢ / Σ mᵢ² (asset a vs market m)
|
|
12
|
+
*
|
|
13
|
+
* The two series are paired element-wise over their common length, so they must
|
|
14
|
+
* be aligned to the same sampling grid (equal length, matching timestamps).
|
|
15
|
+
* Correlation is scale-free; beta is the covariance of an asset with a market,
|
|
16
|
+
* normalized by the market's variance — the sensitivity of the asset to it.
|
|
17
|
+
*/
|
|
18
|
+
/** Σ xᵢyᵢ over the two series' common length. Both empty → 0. */
|
|
19
|
+
function sumProduct(x, y) {
|
|
20
|
+
const n = Math.min(x.length, y.length);
|
|
21
|
+
let s = 0;
|
|
22
|
+
for (let i = 0; i < n; i++)
|
|
23
|
+
s += x[i] * y[i];
|
|
24
|
+
return s;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Realized covariance: Σ xᵢyᵢ over contemporaneous returns. Symmetric in its
|
|
28
|
+
* arguments; returns 0 for empty input. Series are paired over their common
|
|
29
|
+
* length, so align them to the same sampling grid first.
|
|
30
|
+
*/
|
|
31
|
+
export function realizedCovariance(x, y) {
|
|
32
|
+
return sumProduct(x, y);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Realized correlation: Σ xᵢyᵢ / (√Σxᵢ² · √Σyᵢ²), in [−1, 1]. Scale-free measure
|
|
36
|
+
* of co-movement. Returns 0 when either series has zero realized variance (or is
|
|
37
|
+
* empty).
|
|
38
|
+
*/
|
|
39
|
+
export function realizedCorrelation(x, y) {
|
|
40
|
+
const n = Math.min(x.length, y.length);
|
|
41
|
+
if (n === 0)
|
|
42
|
+
return 0;
|
|
43
|
+
let sxy = 0;
|
|
44
|
+
let sxx = 0;
|
|
45
|
+
let syy = 0;
|
|
46
|
+
for (let i = 0; i < n; i++) {
|
|
47
|
+
sxy += x[i] * y[i];
|
|
48
|
+
sxx += x[i] * x[i];
|
|
49
|
+
syy += y[i] * y[i];
|
|
50
|
+
}
|
|
51
|
+
const denom = Math.sqrt(sxx) * Math.sqrt(syy);
|
|
52
|
+
return denom > 0 ? sxy / denom : 0;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Realized beta of an asset against a market/benchmark: Σ aᵢmᵢ / Σ mᵢ², i.e. the
|
|
56
|
+
* realized covariance of the two divided by the market's realized variance — the
|
|
57
|
+
* asset's sensitivity to the market. Returns 0 when the market has zero realized
|
|
58
|
+
* variance (or the input is empty).
|
|
59
|
+
*/
|
|
60
|
+
export function realizedBeta(asset, market) {
|
|
61
|
+
const n = Math.min(asset.length, market.length);
|
|
62
|
+
if (n === 0)
|
|
63
|
+
return 0;
|
|
64
|
+
let cov = 0;
|
|
65
|
+
let varM = 0;
|
|
66
|
+
for (let i = 0; i < n; i++) {
|
|
67
|
+
cov += asset[i] * market[i];
|
|
68
|
+
varM += market[i] * market[i];
|
|
69
|
+
}
|
|
70
|
+
return varM > 0 ? cov / varM : 0;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=covariance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"covariance.js","sourceRoot":"","sources":["../src/covariance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,iEAAiE;AACjE,SAAS,UAAU,CAAC,CAAoB,EAAE,CAAoB;IAC5D,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,CAAoB,EAAE,CAAoB;IAC3E,OAAO,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,CAAoB,EAAE,CAAoB;IAC5E,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9C,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAAwB,EAAE,MAAyB;IAC9E,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Market-efficiency diagnostics on a return series.
|
|
3
|
+
*
|
|
4
|
+
* Autocorrelation and the Lo-MacKinlay variance ratio tell you whether a
|
|
5
|
+
* series behaves like a random walk, mean-reverts, or trends — the kind of
|
|
6
|
+
* structure execution and market-making models care about.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Lag-`lag` autocorrelation of a return series (biased estimator, denominator
|
|
10
|
+
* is the full-sample variance). Range roughly [-1, 1]. 0 for degenerate input.
|
|
11
|
+
*/
|
|
12
|
+
export declare function autocorrelation(returns: readonly number[], lag: number): number;
|
|
13
|
+
/**
|
|
14
|
+
* Variance ratio VR(q) = Var(q-period return) / (q · Var(1-period return))
|
|
15
|
+
* over overlapping q-period returns (Lo & MacKinlay, 1988).
|
|
16
|
+
*
|
|
17
|
+
* VR ≈ 1 random walk
|
|
18
|
+
* VR < 1 mean-reverting
|
|
19
|
+
* VR > 1 trending / positively autocorrelated
|
|
20
|
+
*
|
|
21
|
+
* Returns 1 for degenerate input (q ≥ length, or zero one-period variance).
|
|
22
|
+
*/
|
|
23
|
+
export declare function varianceRatio(returns: readonly number[], q: number): number;
|
|
24
|
+
//# sourceMappingURL=efficiency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"efficiency.d.ts","sourceRoot":"","sources":["../src/efficiency.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAc/E;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAyB3E"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Market-efficiency diagnostics on a return series.
|
|
3
|
+
*
|
|
4
|
+
* Autocorrelation and the Lo-MacKinlay variance ratio tell you whether a
|
|
5
|
+
* series behaves like a random walk, mean-reverts, or trends — the kind of
|
|
6
|
+
* structure execution and market-making models care about.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Lag-`lag` autocorrelation of a return series (biased estimator, denominator
|
|
10
|
+
* is the full-sample variance). Range roughly [-1, 1]. 0 for degenerate input.
|
|
11
|
+
*/
|
|
12
|
+
export function autocorrelation(returns, lag) {
|
|
13
|
+
const n = returns.length;
|
|
14
|
+
if (lag < 1 || n <= lag)
|
|
15
|
+
return 0;
|
|
16
|
+
const mean = returns.reduce((a, b) => a + b, 0) / n;
|
|
17
|
+
let den = 0;
|
|
18
|
+
for (const r of returns)
|
|
19
|
+
den += (r - mean) * (r - mean);
|
|
20
|
+
if (den === 0)
|
|
21
|
+
return 0;
|
|
22
|
+
let num = 0;
|
|
23
|
+
for (let t = lag; t < n; t++) {
|
|
24
|
+
num += (returns[t] - mean) * (returns[t - lag] - mean);
|
|
25
|
+
}
|
|
26
|
+
return num / den;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Variance ratio VR(q) = Var(q-period return) / (q · Var(1-period return))
|
|
30
|
+
* over overlapping q-period returns (Lo & MacKinlay, 1988).
|
|
31
|
+
*
|
|
32
|
+
* VR ≈ 1 random walk
|
|
33
|
+
* VR < 1 mean-reverting
|
|
34
|
+
* VR > 1 trending / positively autocorrelated
|
|
35
|
+
*
|
|
36
|
+
* Returns 1 for degenerate input (q ≥ length, or zero one-period variance).
|
|
37
|
+
*/
|
|
38
|
+
export function varianceRatio(returns, q) {
|
|
39
|
+
const n = returns.length;
|
|
40
|
+
// Need at least two overlapping q-period returns for a meaningful variance,
|
|
41
|
+
// i.e. n > q. At n <= q the estimate is degenerate — return 1 (random walk).
|
|
42
|
+
if (q < 1 || n <= q)
|
|
43
|
+
return 1;
|
|
44
|
+
const mean = returns.reduce((a, b) => a + b, 0) / n;
|
|
45
|
+
let var1 = 0;
|
|
46
|
+
for (const r of returns)
|
|
47
|
+
var1 += (r - mean) * (r - mean);
|
|
48
|
+
var1 /= n;
|
|
49
|
+
if (var1 === 0)
|
|
50
|
+
return 1;
|
|
51
|
+
const qSums = [];
|
|
52
|
+
for (let j = 0; j + q <= n; j++) {
|
|
53
|
+
let s = 0;
|
|
54
|
+
for (let i = j; i < j + q; i++)
|
|
55
|
+
s += returns[i];
|
|
56
|
+
qSums.push(s);
|
|
57
|
+
}
|
|
58
|
+
const meanQ = qSums.reduce((a, b) => a + b, 0) / qSums.length;
|
|
59
|
+
let varQ = 0;
|
|
60
|
+
for (const s of qSums)
|
|
61
|
+
varQ += (s - meanQ) * (s - meanQ);
|
|
62
|
+
varQ /= qSums.length;
|
|
63
|
+
return varQ / (q * var1);
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=efficiency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"efficiency.js","sourceRoot":"","sources":["../src/efficiency.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,OAA0B,EAAE,GAAW;IACrE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACzB,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG;QAAE,OAAO,CAAC,CAAC;IAElC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACpD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACxD,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAExB,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,GAAG,GAAG,GAAG,CAAC;AACnB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,OAA0B,EAAE,CAAS;IACjE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACzB,4EAA4E;IAC5E,6EAA6E;IAC7E,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAE9B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACpD,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACzD,IAAI,IAAI,CAAC,CAAC;IACV,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEzB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IAC9D,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,IAAI,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IACzD,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;IAErB,OAAO,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Order-flow entropy: how predictable is a stream of trades or returns?
|
|
3
|
+
*
|
|
4
|
+
* Shannon entropy measures the average surprise in a discrete distribution.
|
|
5
|
+
* Applied to microstructure, it quantifies the *balance* and *predictability*
|
|
6
|
+
* of order flow: a stream that is almost all buys (or a return series that only
|
|
7
|
+
* ticks one way) carries little surprise — low entropy — and is easier to
|
|
8
|
+
* anticipate, while a perfectly balanced, unpredictable stream is at maximum
|
|
9
|
+
* entropy. Persistently low flow entropy is a hallmark of directional,
|
|
10
|
+
* potentially informed activity.
|
|
11
|
+
*
|
|
12
|
+
* H = − Σᵢ pᵢ · log₂ pᵢ (in bits; pᵢ = countᵢ / Σ counts)
|
|
13
|
+
*
|
|
14
|
+
* Entropy is reported in bits (base-2), so two equally likely outcomes give
|
|
15
|
+
* exactly 1 bit and k equally likely outcomes give log₂ k bits.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Shannon entropy (in bits) of a discrete distribution given category counts
|
|
19
|
+
* (or probabilities — any non-negative weights). Zero and negative entries are
|
|
20
|
+
* ignored; the remaining weights are normalized to sum to 1. Returns 0 when
|
|
21
|
+
* fewer than two categories carry positive weight.
|
|
22
|
+
*/
|
|
23
|
+
export declare function shannonEntropy(counts: readonly number[]): number;
|
|
24
|
+
/**
|
|
25
|
+
* Normalized entropy: Shannon entropy divided by log₂(k), where k is the number
|
|
26
|
+
* of categories carrying positive weight. Maps entropy onto [0, 1] — 0 is fully
|
|
27
|
+
* concentrated (one-sided), 1 is perfectly uniform — so distributions with
|
|
28
|
+
* different numbers of categories are comparable. Returns 0 when fewer than two
|
|
29
|
+
* categories carry positive weight.
|
|
30
|
+
*/
|
|
31
|
+
export declare function normalizedEntropy(counts: readonly number[]): number;
|
|
32
|
+
/**
|
|
33
|
+
* Sign entropy: the Shannon entropy (in bits, in [0, 1]) of the up/down split
|
|
34
|
+
* of a return or signed-flow series. Zero entries are ignored. 1 bit means
|
|
35
|
+
* perfectly balanced two-sided flow; values near 0 mean the flow is heavily
|
|
36
|
+
* one-sided (and thus more predictable). Returns 0 for an empty or single-sided
|
|
37
|
+
* series.
|
|
38
|
+
*/
|
|
39
|
+
export declare function signEntropy(values: readonly number[]): number;
|
|
40
|
+
//# sourceMappingURL=entropy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entropy.d.ts","sourceRoot":"","sources":["../src/entropy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAYhE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAKnE;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAQ7D"}
|
package/dist/entropy.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Order-flow entropy: how predictable is a stream of trades or returns?
|
|
3
|
+
*
|
|
4
|
+
* Shannon entropy measures the average surprise in a discrete distribution.
|
|
5
|
+
* Applied to microstructure, it quantifies the *balance* and *predictability*
|
|
6
|
+
* of order flow: a stream that is almost all buys (or a return series that only
|
|
7
|
+
* ticks one way) carries little surprise — low entropy — and is easier to
|
|
8
|
+
* anticipate, while a perfectly balanced, unpredictable stream is at maximum
|
|
9
|
+
* entropy. Persistently low flow entropy is a hallmark of directional,
|
|
10
|
+
* potentially informed activity.
|
|
11
|
+
*
|
|
12
|
+
* H = − Σᵢ pᵢ · log₂ pᵢ (in bits; pᵢ = countᵢ / Σ counts)
|
|
13
|
+
*
|
|
14
|
+
* Entropy is reported in bits (base-2), so two equally likely outcomes give
|
|
15
|
+
* exactly 1 bit and k equally likely outcomes give log₂ k bits.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Shannon entropy (in bits) of a discrete distribution given category counts
|
|
19
|
+
* (or probabilities — any non-negative weights). Zero and negative entries are
|
|
20
|
+
* ignored; the remaining weights are normalized to sum to 1. Returns 0 when
|
|
21
|
+
* fewer than two categories carry positive weight.
|
|
22
|
+
*/
|
|
23
|
+
export function shannonEntropy(counts) {
|
|
24
|
+
let total = 0;
|
|
25
|
+
for (const c of counts)
|
|
26
|
+
if (c > 0)
|
|
27
|
+
total += c;
|
|
28
|
+
if (total <= 0)
|
|
29
|
+
return 0;
|
|
30
|
+
let h = 0;
|
|
31
|
+
for (const c of counts) {
|
|
32
|
+
if (c > 0) {
|
|
33
|
+
const p = c / total;
|
|
34
|
+
h -= p * Math.log2(p);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return h;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Normalized entropy: Shannon entropy divided by log₂(k), where k is the number
|
|
41
|
+
* of categories carrying positive weight. Maps entropy onto [0, 1] — 0 is fully
|
|
42
|
+
* concentrated (one-sided), 1 is perfectly uniform — so distributions with
|
|
43
|
+
* different numbers of categories are comparable. Returns 0 when fewer than two
|
|
44
|
+
* categories carry positive weight.
|
|
45
|
+
*/
|
|
46
|
+
export function normalizedEntropy(counts) {
|
|
47
|
+
let k = 0;
|
|
48
|
+
for (const c of counts)
|
|
49
|
+
if (c > 0)
|
|
50
|
+
k++;
|
|
51
|
+
if (k < 2)
|
|
52
|
+
return 0;
|
|
53
|
+
return shannonEntropy(counts) / Math.log2(k);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Sign entropy: the Shannon entropy (in bits, in [0, 1]) of the up/down split
|
|
57
|
+
* of a return or signed-flow series. Zero entries are ignored. 1 bit means
|
|
58
|
+
* perfectly balanced two-sided flow; values near 0 mean the flow is heavily
|
|
59
|
+
* one-sided (and thus more predictable). Returns 0 for an empty or single-sided
|
|
60
|
+
* series.
|
|
61
|
+
*/
|
|
62
|
+
export function signEntropy(values) {
|
|
63
|
+
let up = 0;
|
|
64
|
+
let down = 0;
|
|
65
|
+
for (const v of values) {
|
|
66
|
+
if (v > 0)
|
|
67
|
+
up++;
|
|
68
|
+
else if (v < 0)
|
|
69
|
+
down++;
|
|
70
|
+
}
|
|
71
|
+
return shannonEntropy([up, down]);
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=entropy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entropy.js","sourceRoot":"","sources":["../src/entropy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,MAAyB;IACtD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,IAAI,CAAC,GAAG,CAAC;YAAE,KAAK,IAAI,CAAC,CAAC;IAC9C,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACzB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACpB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAyB;IACzD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,IAAI,CAAC,GAAG,CAAC;YAAE,CAAC,EAAE,CAAC;IACvC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACpB,OAAO,cAAc,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,MAAyB;IACnD,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC;YAAE,EAAE,EAAE,CAAC;aACX,IAAI,CAAC,GAAG,CAAC;YAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IACD,OAAO,cAAc,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execution-cost and price-impact metrics.
|
|
3
|
+
*
|
|
4
|
+
* Standard transaction-cost analysis (TCA) building blocks:
|
|
5
|
+
* - effective spread — realized cost against the quote midpoint
|
|
6
|
+
* - realized spread — liquidity-provider revenue (post-trade reversion)
|
|
7
|
+
* - price impact — permanent component (effective − realized)
|
|
8
|
+
* - Kyle's lambda — price impact per unit of signed order flow
|
|
9
|
+
* - Roll's estimator — effective spread implied by price-change autocovariance
|
|
10
|
+
*
|
|
11
|
+
* Sign convention: buys are +1, sells are −1. All spread measures are in the
|
|
12
|
+
* same price units as the inputs.
|
|
13
|
+
*/
|
|
14
|
+
import type { Side } from "./types.ts";
|
|
15
|
+
/** Effective half-spread: d·(price − mid). */
|
|
16
|
+
export declare function effectiveHalfSpread(price: number, mid: number, side: Side): number;
|
|
17
|
+
/** Effective (full) spread: 2·d·(price − mid). */
|
|
18
|
+
export declare function effectiveSpread(price: number, mid: number, side: Side): number;
|
|
19
|
+
/** Realized (full) spread using the mid observed Δ later: 2·d·(price − midAfter). */
|
|
20
|
+
export declare function realizedSpread(price: number, midAfter: number, side: Side): number;
|
|
21
|
+
/** Permanent price impact: 2·d·(midAfter − mid) = effectiveSpread − realizedSpread. */
|
|
22
|
+
export declare function priceImpact(mid: number, midAfter: number, side: Side): number;
|
|
23
|
+
export interface FlowObservation {
|
|
24
|
+
/** mid-price change over the interval */
|
|
25
|
+
priceChange: number;
|
|
26
|
+
/** signed traded volume (positive = net buy) */
|
|
27
|
+
signedVolume: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Kyle's lambda — OLS slope of price change on signed order flow
|
|
31
|
+
* (ΔP = λ · signedVolume + ε). Returns 0 for degenerate input.
|
|
32
|
+
*/
|
|
33
|
+
export declare function kyleLambda(obs: FlowObservation[]): number;
|
|
34
|
+
/**
|
|
35
|
+
* Roll's (1984) implied effective spread from a series of trade prices:
|
|
36
|
+
* 2·√(−cov(ΔP_t, ΔP_{t-1})). Returns 0 when the autocovariance is
|
|
37
|
+
* non-negative (the estimator is undefined there).
|
|
38
|
+
*/
|
|
39
|
+
export declare function rollSpread(prices: number[]): number;
|
|
40
|
+
//# sourceMappingURL=execution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAMvC,8CAA8C;AAC9C,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,IAAI,GACT,MAAM,CAER;AAED,kDAAkD;AAClD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CAE9E;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,IAAI,GACT,MAAM,CAER;AAED,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CAE7E;AAED,MAAM,WAAW,eAAe;IAC9B,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,MAAM,CAqBzD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAanD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
function dir(side) {
|
|
2
|
+
return side === "buy" ? 1 : -1;
|
|
3
|
+
}
|
|
4
|
+
/** Effective half-spread: d·(price − mid). */
|
|
5
|
+
export function effectiveHalfSpread(price, mid, side) {
|
|
6
|
+
return dir(side) * (price - mid);
|
|
7
|
+
}
|
|
8
|
+
/** Effective (full) spread: 2·d·(price − mid). */
|
|
9
|
+
export function effectiveSpread(price, mid, side) {
|
|
10
|
+
return 2 * effectiveHalfSpread(price, mid, side);
|
|
11
|
+
}
|
|
12
|
+
/** Realized (full) spread using the mid observed Δ later: 2·d·(price − midAfter). */
|
|
13
|
+
export function realizedSpread(price, midAfter, side) {
|
|
14
|
+
return 2 * dir(side) * (price - midAfter);
|
|
15
|
+
}
|
|
16
|
+
/** Permanent price impact: 2·d·(midAfter − mid) = effectiveSpread − realizedSpread. */
|
|
17
|
+
export function priceImpact(mid, midAfter, side) {
|
|
18
|
+
return 2 * dir(side) * (midAfter - mid);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Kyle's lambda — OLS slope of price change on signed order flow
|
|
22
|
+
* (ΔP = λ · signedVolume + ε). Returns 0 for degenerate input.
|
|
23
|
+
*/
|
|
24
|
+
export function kyleLambda(obs) {
|
|
25
|
+
const n = obs.length;
|
|
26
|
+
if (n < 2)
|
|
27
|
+
return 0;
|
|
28
|
+
let mx = 0;
|
|
29
|
+
let my = 0;
|
|
30
|
+
for (const o of obs) {
|
|
31
|
+
mx += o.signedVolume;
|
|
32
|
+
my += o.priceChange;
|
|
33
|
+
}
|
|
34
|
+
mx /= n;
|
|
35
|
+
my /= n;
|
|
36
|
+
let cov = 0;
|
|
37
|
+
let varx = 0;
|
|
38
|
+
for (const o of obs) {
|
|
39
|
+
const dx = o.signedVolume - mx;
|
|
40
|
+
cov += dx * (o.priceChange - my);
|
|
41
|
+
varx += dx * dx;
|
|
42
|
+
}
|
|
43
|
+
return varx === 0 ? 0 : cov / varx;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Roll's (1984) implied effective spread from a series of trade prices:
|
|
47
|
+
* 2·√(−cov(ΔP_t, ΔP_{t-1})). Returns 0 when the autocovariance is
|
|
48
|
+
* non-negative (the estimator is undefined there).
|
|
49
|
+
*/
|
|
50
|
+
export function rollSpread(prices) {
|
|
51
|
+
if (prices.length < 3)
|
|
52
|
+
return 0;
|
|
53
|
+
const dp = [];
|
|
54
|
+
for (let i = 1; i < prices.length; i++)
|
|
55
|
+
dp.push(prices[i] - prices[i - 1]);
|
|
56
|
+
const n = dp.length;
|
|
57
|
+
const mean = dp.reduce((a, b) => a + b, 0) / n;
|
|
58
|
+
let cov = 0;
|
|
59
|
+
for (let i = 1; i < n; i++)
|
|
60
|
+
cov += (dp[i] - mean) * (dp[i - 1] - mean);
|
|
61
|
+
cov /= n - 1;
|
|
62
|
+
return cov < 0 ? 2 * Math.sqrt(-cov) : 0;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=execution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"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"}
|