@fullstackcraftllc/floe 0.0.17 → 0.0.18
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 +2 -0
- package/dist/index.js +5 -0
- package/dist/volresponse/index.d.ts +42 -0
- package/dist/volresponse/index.js +251 -0
- package/dist/volresponse/types.d.ts +75 -0
- package/dist/volresponse/types.js +2 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -26,3 +26,5 @@ export { computeVarianceSwapIV, computeImpliedVolatility, } from './iv';
|
|
|
26
26
|
export type { VarianceSwapResult, ImpliedVolatilityResult, } from './iv';
|
|
27
27
|
export { computeRealizedVolatility, } from './rv';
|
|
28
28
|
export type { PriceObservation, RealizedVolatilityResult, } from './rv';
|
|
29
|
+
export { computeVolResponseZScore, buildVolResponseObservation, } from './volresponse';
|
|
30
|
+
export type { VolResponseObservation, VolResponseCoefficients, VolResponseConfig, VolResponseResult, } from './volresponse';
|
package/dist/index.js
CHANGED
|
@@ -21,6 +21,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
21
21
|
};
|
|
22
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
23
|
exports.computeRealizedVolatility = exports.computeImpliedVolatility = exports.computeVarianceSwapIV = exports.createOptionChain = exports.getAdapter = exports.brokerAdapters = exports.tdaAdapter = exports.ibkrAdapter = exports.schwabAdapter = exports.genericAdapter = exports.TradeStationClient = exports.TastyTradeClient = exports.TradierClient = exports.Broker = exports.FloeClient = exports.analyzeHedgeFlow = exports.computePressureCloud = exports.computeCharmIntegral = exports.computeHedgeImpulseCurve = exports.interpolateIVAtStrike = exports.deriveRegimeParams = exports.OPEX_CONFIG = exports.CRISIS_CONFIG = exports.LOW_VOL_CONFIG = exports.DEFAULT_ADJUSTMENT_CONFIG = exports.getSignificantAdjustmentLevels = exports.getEdgeAtPrice = exports.estimateExposureAdjustedPDF = exports.getQuantile = exports.getCumulativeProbability = exports.getProbabilityInRange = exports.estimateImpliedProbabilityDistributions = exports.estimateImpliedProbabilityDistribution = exports.generateOCCSymbolsAroundSpot = exports.generateOCCSymbolsForStrikes = exports.generateStrikesAroundSpot = exports.parseOCCSymbol = exports.buildOCCSymbol = exports.normalPDF = exports.cumulativeNormalDistribution = exports.calculateSharesNeededToCover = exports.calculateGammaVannaCharmExposures = exports.smoothTotalVarianceSmile = exports.getIVForStrike = exports.getIVSurfaces = exports.getTimeToExpirationInYears = exports.getMillisecondsToExpiration = exports.calculateImpliedVolatility = exports.calculateGreeks = exports.blackScholes = void 0;
|
|
24
|
+
exports.buildVolResponseObservation = exports.computeVolResponseZScore = void 0;
|
|
24
25
|
// Core types
|
|
25
26
|
__exportStar(require("./types"), exports);
|
|
26
27
|
// Black-Scholes pricing and Greeks
|
|
@@ -106,3 +107,7 @@ Object.defineProperty(exports, "computeImpliedVolatility", { enumerable: true, g
|
|
|
106
107
|
// Realized volatility (tick-based quadratic variation)
|
|
107
108
|
var rv_1 = require("./rv");
|
|
108
109
|
Object.defineProperty(exports, "computeRealizedVolatility", { enumerable: true, get: function () { return rv_1.computeRealizedVolatility; } });
|
|
110
|
+
// Vol response model (IV response residual / vol bid-offered z-score)
|
|
111
|
+
var volresponse_1 = require("./volresponse");
|
|
112
|
+
Object.defineProperty(exports, "computeVolResponseZScore", { enumerable: true, get: function () { return volresponse_1.computeVolResponseZScore; } });
|
|
113
|
+
Object.defineProperty(exports, "buildVolResponseObservation", { enumerable: true, get: function () { return volresponse_1.buildVolResponseObservation; } });
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { VolResponseObservation, VolResponseConfig, VolResponseResult } from './types';
|
|
2
|
+
export type { VolResponseObservation, VolResponseCoefficients, VolResponseConfig, VolResponseResult, } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Build a VolResponseObservation from consecutive IV/RV/spot readings.
|
|
5
|
+
*
|
|
6
|
+
* The consumer calls this on each tick after the first, passing the
|
|
7
|
+
* current and previous IV/spot values. The resulting observation can
|
|
8
|
+
* then be accumulated and passed to computeVolResponseZScore.
|
|
9
|
+
*
|
|
10
|
+
* @param current - Current tick values
|
|
11
|
+
* @param previous - Previous tick values (IV and spot only)
|
|
12
|
+
* @returns A VolResponseObservation ready for the regression
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildVolResponseObservation(current: {
|
|
15
|
+
iv: number;
|
|
16
|
+
rv: number;
|
|
17
|
+
spot: number;
|
|
18
|
+
timestamp: number;
|
|
19
|
+
}, previous: {
|
|
20
|
+
iv: number;
|
|
21
|
+
spot: number;
|
|
22
|
+
}): VolResponseObservation;
|
|
23
|
+
/**
|
|
24
|
+
* Compute the vol response z-score from accumulated observations.
|
|
25
|
+
*
|
|
26
|
+
* Fits an expanding-window OLS regression:
|
|
27
|
+
*
|
|
28
|
+
* deltaIV(t) ~ a + b1*return + b2*|return| + b3*RV + b4*IV_level
|
|
29
|
+
*
|
|
30
|
+
* Then computes the residual of the most recent observation and
|
|
31
|
+
* normalizes it by the residual standard deviation to produce a z-score.
|
|
32
|
+
*
|
|
33
|
+
* Interpretation:
|
|
34
|
+
* - z >> 0: vol is bid relative to baseline (stress / demand)
|
|
35
|
+
* - z << 0: vol is offered relative to baseline (supply / crush)
|
|
36
|
+
* - z ~ 0: normal vol response given the price path
|
|
37
|
+
*
|
|
38
|
+
* @param observations - All accumulated VolResponseObservation for the session
|
|
39
|
+
* @param config - Optional configuration overrides
|
|
40
|
+
* @returns VolResponseResult with z-score and signal classification
|
|
41
|
+
*/
|
|
42
|
+
export declare function computeVolResponseZScore(observations: VolResponseObservation[], config?: VolResponseConfig): VolResponseResult;
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildVolResponseObservation = buildVolResponseObservation;
|
|
4
|
+
exports.computeVolResponseZScore = computeVolResponseZScore;
|
|
5
|
+
// Number of features in the regression (intercept + 4 regressors)
|
|
6
|
+
const NUM_FEATURES = 5;
|
|
7
|
+
// Small ridge penalty for numerical stability of the normal equations
|
|
8
|
+
const RIDGE_LAMBDA = 1e-8;
|
|
9
|
+
/**
|
|
10
|
+
* Build a VolResponseObservation from consecutive IV/RV/spot readings.
|
|
11
|
+
*
|
|
12
|
+
* The consumer calls this on each tick after the first, passing the
|
|
13
|
+
* current and previous IV/spot values. The resulting observation can
|
|
14
|
+
* then be accumulated and passed to computeVolResponseZScore.
|
|
15
|
+
*
|
|
16
|
+
* @param current - Current tick values
|
|
17
|
+
* @param previous - Previous tick values (IV and spot only)
|
|
18
|
+
* @returns A VolResponseObservation ready for the regression
|
|
19
|
+
*/
|
|
20
|
+
function buildVolResponseObservation(current, previous) {
|
|
21
|
+
const deltaIV = current.iv - previous.iv;
|
|
22
|
+
const spotReturn = Math.log(current.spot / previous.spot);
|
|
23
|
+
return {
|
|
24
|
+
timestamp: current.timestamp,
|
|
25
|
+
deltaIV,
|
|
26
|
+
spotReturn,
|
|
27
|
+
absSpotReturn: Math.abs(spotReturn),
|
|
28
|
+
rvLevel: current.rv,
|
|
29
|
+
ivLevel: current.iv,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Compute the vol response z-score from accumulated observations.
|
|
34
|
+
*
|
|
35
|
+
* Fits an expanding-window OLS regression:
|
|
36
|
+
*
|
|
37
|
+
* deltaIV(t) ~ a + b1*return + b2*|return| + b3*RV + b4*IV_level
|
|
38
|
+
*
|
|
39
|
+
* Then computes the residual of the most recent observation and
|
|
40
|
+
* normalizes it by the residual standard deviation to produce a z-score.
|
|
41
|
+
*
|
|
42
|
+
* Interpretation:
|
|
43
|
+
* - z >> 0: vol is bid relative to baseline (stress / demand)
|
|
44
|
+
* - z << 0: vol is offered relative to baseline (supply / crush)
|
|
45
|
+
* - z ~ 0: normal vol response given the price path
|
|
46
|
+
*
|
|
47
|
+
* @param observations - All accumulated VolResponseObservation for the session
|
|
48
|
+
* @param config - Optional configuration overrides
|
|
49
|
+
* @returns VolResponseResult with z-score and signal classification
|
|
50
|
+
*/
|
|
51
|
+
function computeVolResponseZScore(observations, config = {}) {
|
|
52
|
+
const { minObservations = 30, volBidThreshold = 1.5, volOfferedThreshold = -1.5, } = config;
|
|
53
|
+
const emptyCoefficients = {
|
|
54
|
+
intercept: 0,
|
|
55
|
+
betaReturn: 0,
|
|
56
|
+
betaAbsReturn: 0,
|
|
57
|
+
betaRV: 0,
|
|
58
|
+
betaIVLevel: 0,
|
|
59
|
+
};
|
|
60
|
+
if (observations.length < minObservations) {
|
|
61
|
+
return {
|
|
62
|
+
isValid: false,
|
|
63
|
+
minObservations,
|
|
64
|
+
numObservations: observations.length,
|
|
65
|
+
coefficients: emptyCoefficients,
|
|
66
|
+
rSquared: 0,
|
|
67
|
+
residualStdDev: 0,
|
|
68
|
+
expectedDeltaIV: 0,
|
|
69
|
+
observedDeltaIV: observations.length > 0 ? observations[observations.length - 1].deltaIV : 0,
|
|
70
|
+
residual: 0,
|
|
71
|
+
zScore: 0,
|
|
72
|
+
signal: 'insufficient_data',
|
|
73
|
+
timestamp: observations.length > 0 ? observations[observations.length - 1].timestamp : 0,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
// Build design matrix X and response vector y
|
|
77
|
+
const n = observations.length;
|
|
78
|
+
const X = new Array(n);
|
|
79
|
+
const y = new Array(n);
|
|
80
|
+
for (let i = 0; i < n; i++) {
|
|
81
|
+
const obs = observations[i];
|
|
82
|
+
X[i] = [1, obs.spotReturn, obs.absSpotReturn, obs.rvLevel, obs.ivLevel];
|
|
83
|
+
y[i] = obs.deltaIV;
|
|
84
|
+
}
|
|
85
|
+
// Solve OLS via normal equations with ridge regularization
|
|
86
|
+
const ols = solveOLS(X, y);
|
|
87
|
+
if (!ols) {
|
|
88
|
+
return {
|
|
89
|
+
isValid: false,
|
|
90
|
+
minObservations,
|
|
91
|
+
numObservations: n,
|
|
92
|
+
coefficients: emptyCoefficients,
|
|
93
|
+
rSquared: 0,
|
|
94
|
+
residualStdDev: 0,
|
|
95
|
+
expectedDeltaIV: 0,
|
|
96
|
+
observedDeltaIV: observations[n - 1].deltaIV,
|
|
97
|
+
residual: 0,
|
|
98
|
+
zScore: 0,
|
|
99
|
+
signal: 'insufficient_data',
|
|
100
|
+
timestamp: observations[n - 1].timestamp,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const { beta, residuals, rSquared, residualStdDev } = ols;
|
|
104
|
+
const lastObs = observations[n - 1];
|
|
105
|
+
const lastX = X[n - 1];
|
|
106
|
+
// Predicted deltaIV for the most recent observation
|
|
107
|
+
let expectedDeltaIV = 0;
|
|
108
|
+
for (let j = 0; j < NUM_FEATURES; j++) {
|
|
109
|
+
expectedDeltaIV += beta[j] * lastX[j];
|
|
110
|
+
}
|
|
111
|
+
const residual = lastObs.deltaIV - expectedDeltaIV;
|
|
112
|
+
const zScore = residualStdDev > 0 ? residual / residualStdDev : 0;
|
|
113
|
+
let signal = 'neutral';
|
|
114
|
+
if (zScore > volBidThreshold) {
|
|
115
|
+
signal = 'vol_bid';
|
|
116
|
+
}
|
|
117
|
+
else if (zScore < volOfferedThreshold) {
|
|
118
|
+
signal = 'vol_offered';
|
|
119
|
+
}
|
|
120
|
+
const coefficients = {
|
|
121
|
+
intercept: beta[0],
|
|
122
|
+
betaReturn: beta[1],
|
|
123
|
+
betaAbsReturn: beta[2],
|
|
124
|
+
betaRV: beta[3],
|
|
125
|
+
betaIVLevel: beta[4],
|
|
126
|
+
};
|
|
127
|
+
return {
|
|
128
|
+
isValid: true,
|
|
129
|
+
minObservations,
|
|
130
|
+
numObservations: n,
|
|
131
|
+
coefficients,
|
|
132
|
+
rSquared,
|
|
133
|
+
residualStdDev,
|
|
134
|
+
expectedDeltaIV,
|
|
135
|
+
observedDeltaIV: lastObs.deltaIV,
|
|
136
|
+
residual,
|
|
137
|
+
zScore,
|
|
138
|
+
signal,
|
|
139
|
+
timestamp: lastObs.timestamp,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Solve ordinary least squares: beta = (X'X + lambda*I)^{-1} X'y
|
|
144
|
+
*
|
|
145
|
+
* For a small system (5 features), direct inversion via Gauss-Jordan
|
|
146
|
+
* elimination is efficient and avoids external dependencies.
|
|
147
|
+
*/
|
|
148
|
+
function solveOLS(X, y) {
|
|
149
|
+
const n = X.length;
|
|
150
|
+
const p = NUM_FEATURES;
|
|
151
|
+
// Compute X'X (p x p)
|
|
152
|
+
const XtX = new Array(p);
|
|
153
|
+
for (let i = 0; i < p; i++) {
|
|
154
|
+
XtX[i] = new Array(p).fill(0);
|
|
155
|
+
for (let j = 0; j < p; j++) {
|
|
156
|
+
let sum = 0;
|
|
157
|
+
for (let k = 0; k < n; k++) {
|
|
158
|
+
sum += X[k][i] * X[k][j];
|
|
159
|
+
}
|
|
160
|
+
XtX[i][j] = sum;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Add ridge penalty to diagonal (skip intercept at index 0)
|
|
164
|
+
for (let i = 1; i < p; i++) {
|
|
165
|
+
XtX[i][i] += RIDGE_LAMBDA;
|
|
166
|
+
}
|
|
167
|
+
// Compute X'y (p x 1)
|
|
168
|
+
const Xty = new Array(p).fill(0);
|
|
169
|
+
for (let i = 0; i < p; i++) {
|
|
170
|
+
let sum = 0;
|
|
171
|
+
for (let k = 0; k < n; k++) {
|
|
172
|
+
sum += X[k][i] * y[k];
|
|
173
|
+
}
|
|
174
|
+
Xty[i] = sum;
|
|
175
|
+
}
|
|
176
|
+
// Solve (X'X + lambda*I) * beta = X'y via Gauss-Jordan elimination
|
|
177
|
+
// Augment [XtX | Xty] into a (p x p+1) matrix
|
|
178
|
+
const aug = new Array(p);
|
|
179
|
+
for (let i = 0; i < p; i++) {
|
|
180
|
+
aug[i] = new Array(p + 1);
|
|
181
|
+
for (let j = 0; j < p; j++) {
|
|
182
|
+
aug[i][j] = XtX[i][j];
|
|
183
|
+
}
|
|
184
|
+
aug[i][p] = Xty[i];
|
|
185
|
+
}
|
|
186
|
+
// Forward elimination with partial pivoting
|
|
187
|
+
for (let col = 0; col < p; col++) {
|
|
188
|
+
// Find pivot
|
|
189
|
+
let maxVal = Math.abs(aug[col][col]);
|
|
190
|
+
let maxRow = col;
|
|
191
|
+
for (let row = col + 1; row < p; row++) {
|
|
192
|
+
const val = Math.abs(aug[row][col]);
|
|
193
|
+
if (val > maxVal) {
|
|
194
|
+
maxVal = val;
|
|
195
|
+
maxRow = row;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (maxVal < 1e-14) {
|
|
199
|
+
return null; // Singular matrix
|
|
200
|
+
}
|
|
201
|
+
// Swap rows
|
|
202
|
+
if (maxRow !== col) {
|
|
203
|
+
const temp = aug[col];
|
|
204
|
+
aug[col] = aug[maxRow];
|
|
205
|
+
aug[maxRow] = temp;
|
|
206
|
+
}
|
|
207
|
+
// Eliminate below and above
|
|
208
|
+
const pivot = aug[col][col];
|
|
209
|
+
for (let j = col; j <= p; j++) {
|
|
210
|
+
aug[col][j] /= pivot;
|
|
211
|
+
}
|
|
212
|
+
for (let row = 0; row < p; row++) {
|
|
213
|
+
if (row === col)
|
|
214
|
+
continue;
|
|
215
|
+
const factor = aug[row][col];
|
|
216
|
+
for (let j = col; j <= p; j++) {
|
|
217
|
+
aug[row][j] -= factor * aug[col][j];
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// Extract beta
|
|
222
|
+
const beta = new Array(p);
|
|
223
|
+
for (let i = 0; i < p; i++) {
|
|
224
|
+
beta[i] = aug[i][p];
|
|
225
|
+
if (!isFinite(beta[i]))
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
// Compute residuals and statistics
|
|
229
|
+
const residuals = new Array(n);
|
|
230
|
+
let ssRes = 0;
|
|
231
|
+
let yMean = 0;
|
|
232
|
+
for (let i = 0; i < n; i++) {
|
|
233
|
+
yMean += y[i];
|
|
234
|
+
}
|
|
235
|
+
yMean /= n;
|
|
236
|
+
let ssTot = 0;
|
|
237
|
+
for (let i = 0; i < n; i++) {
|
|
238
|
+
let predicted = 0;
|
|
239
|
+
for (let j = 0; j < p; j++) {
|
|
240
|
+
predicted += beta[j] * X[i][j];
|
|
241
|
+
}
|
|
242
|
+
residuals[i] = y[i] - predicted;
|
|
243
|
+
ssRes += residuals[i] * residuals[i];
|
|
244
|
+
ssTot += (y[i] - yMean) * (y[i] - yMean);
|
|
245
|
+
}
|
|
246
|
+
const rSquared = ssTot > 0 ? Math.max(0, 1 - ssRes / ssTot) : 0;
|
|
247
|
+
// Residual standard deviation (using n - p degrees of freedom)
|
|
248
|
+
const dof = Math.max(n - p, 1);
|
|
249
|
+
const residualStdDev = Math.sqrt(ssRes / dof);
|
|
250
|
+
return { beta, residuals, rSquared, residualStdDev };
|
|
251
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A single observation for the vol response regression model.
|
|
3
|
+
* The consumer accumulates these as the 0DTE session progresses.
|
|
4
|
+
*/
|
|
5
|
+
export interface VolResponseObservation {
|
|
6
|
+
/** Timestamp in milliseconds */
|
|
7
|
+
timestamp: number;
|
|
8
|
+
/** Change in IV from previous observation: IV(t) - IV(t-1), as decimal */
|
|
9
|
+
deltaIV: number;
|
|
10
|
+
/** Log return of spot: ln(S(t) / S(t-1)) */
|
|
11
|
+
spotReturn: number;
|
|
12
|
+
/** Absolute value of the log return */
|
|
13
|
+
absSpotReturn: number;
|
|
14
|
+
/** Current realized volatility level (annualized, decimal) */
|
|
15
|
+
rvLevel: number;
|
|
16
|
+
/** Current IV level (annualized, decimal) */
|
|
17
|
+
ivLevel: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Regression coefficients from the IV response model.
|
|
21
|
+
*
|
|
22
|
+
* deltaIV(t) ~ intercept + b1*return + b2*|return| + b3*RV + b4*IV_level
|
|
23
|
+
*/
|
|
24
|
+
export interface VolResponseCoefficients {
|
|
25
|
+
/** Intercept */
|
|
26
|
+
intercept: number;
|
|
27
|
+
/** Coefficient on signed spot return (captures spot-vol correlation) */
|
|
28
|
+
betaReturn: number;
|
|
29
|
+
/** Coefficient on |return| (captures vol-of-vol / convexity response) */
|
|
30
|
+
betaAbsReturn: number;
|
|
31
|
+
/** Coefficient on RV level (captures RV mean-reversion effect) */
|
|
32
|
+
betaRV: number;
|
|
33
|
+
/** Coefficient on IV level (captures IV mean-reversion effect) */
|
|
34
|
+
betaIVLevel: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Configuration for the vol response model.
|
|
38
|
+
*/
|
|
39
|
+
export interface VolResponseConfig {
|
|
40
|
+
/** Minimum observations before the model is considered valid. Default: 30 */
|
|
41
|
+
minObservations?: number;
|
|
42
|
+
/** Z-score threshold for vol_bid signal. Default: 1.5 */
|
|
43
|
+
volBidThreshold?: number;
|
|
44
|
+
/** Z-score threshold for vol_offered signal. Default: -1.5 */
|
|
45
|
+
volOfferedThreshold?: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Full result of the vol response residual model.
|
|
49
|
+
*/
|
|
50
|
+
export interface VolResponseResult {
|
|
51
|
+
/** Whether the model has enough data to be meaningful */
|
|
52
|
+
isValid: boolean;
|
|
53
|
+
/** Minimum number of observations required (for reference) */
|
|
54
|
+
minObservations: number;
|
|
55
|
+
/** Number of observations used in the regression */
|
|
56
|
+
numObservations: number;
|
|
57
|
+
/** Fitted regression coefficients */
|
|
58
|
+
coefficients: VolResponseCoefficients;
|
|
59
|
+
/** R-squared of the regression */
|
|
60
|
+
rSquared: number;
|
|
61
|
+
/** Standard deviation of the residuals */
|
|
62
|
+
residualStdDev: number;
|
|
63
|
+
/** The most recent predicted (expected) deltaIV */
|
|
64
|
+
expectedDeltaIV: number;
|
|
65
|
+
/** The most recent observed deltaIV */
|
|
66
|
+
observedDeltaIV: number;
|
|
67
|
+
/** The residual: observed - expected */
|
|
68
|
+
residual: number;
|
|
69
|
+
/** The z-score: residual / residualStdDev */
|
|
70
|
+
zScore: number;
|
|
71
|
+
/** Discrete signal classification */
|
|
72
|
+
signal: 'vol_bid' | 'vol_offered' | 'neutral' | 'insufficient_data';
|
|
73
|
+
/** Timestamp of the most recent observation */
|
|
74
|
+
timestamp: number;
|
|
75
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fullstackcraftllc/floe",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.18",
|
|
4
4
|
"description": "Production-ready options analytics toolkit. Normalize broker data structures and calculate Black-Scholes, Greeks, and exposures with a clean, type-safe API. Built for trading platforms and fintech applications.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|