@c9up/technical-indicators-napi
Version:
A Rust-based indicator and Charts library compiled to napi.
935 lines (932 loc) • 39.2 kB
TypeScript
/* tslint:disable */
/* eslint-disable */
/* auto-generated by NAPI-RS */
export interface RenkoBrick {
price: number
direction: string
}
export declare function renkoChart(prices: Array<number>, brickSize?: number): Array<RenkoBrick>
export interface KagiPoint {
price: number
direction: string
}
export declare function kagiChart(prices: Array<number>, reversalAmount?: number): Array<KagiPoint>
export declare function lowHighOpenCloseVolumeDateToArray(data: Array<MarketData>): MarketDataResult
export interface BollingerBandsResult {
middle: Array<number>
upper: Array<number>
lower: Array<number>
}
export interface MarketData {
low: number
high: number
open: number
close: number
volume: number
date: string
}
export interface MarketDataResult {
lows: Array<number>
highs: Array<number>
opens: Array<number>
closes: Array<number>
volumes: Array<number>
dates: Array<string>
}
export interface RegressionSegment {
/** Start index in the original data */
startIndex: number
/** End index in the original data */
endIndex: number
/** Slope (trend direction and strength) */
slope: number
/** Intercept */
intercept: number
/** Residual standard deviation */
stdDev: number
/** Fitted values for this segment */
fitted: Array<number>
/** Upper band (fitted + mult * std_dev) */
upperBand: Array<number>
/** Lower band (fitted - mult * std_dev) */
lowerBand: Array<number>
}
export interface AnchoredRegressionResult {
/** All regression segments */
segments: Array<RegressionSegment>
/** Full-length fitted line (NaN where no regression) */
fitted: Array<number>
/** Full-length upper band */
upperBand: Array<number>
/** Full-length lower band */
lowerBand: Array<number>
/** Full-length slope values (slope of the segment at each bar) */
slopes: Array<number>
}
/**
* Static Anchored Regression
*
* Divides the price series into fixed segments based on `anchor_period` bars.
* Each segment gets its own independent linear regression.
*
* Parameters:
* - prices: closing prices
* - anchor_period: number of bars per segment (e.g. 5 for weekly on daily data)
* - band_mult: multiplier for std dev bands (default: 1.0)
*/
export declare function anchoredRegressionStatic(prices: Array<number>, anchorPeriod: number, bandMult?: number | undefined | null): AnchoredRegressionResult
/**
* Rolling Anchored Regression
*
* Regression updates bar-by-bar from each anchor reset point.
* The anchor resets every `anchor_period` bars.
* At each bar, the regression is computed from the last anchor point to the current bar.
*
* Parameters:
* - prices: closing prices
* - anchor_period: bars between anchor resets (e.g. 5 for weekly on daily data)
* - band_mult: multiplier for std dev bands (default: 1.0)
*/
export declare function anchoredRegressionRolling(prices: Array<number>, anchorPeriod: number, bandMult?: number | undefined | null): AnchoredRegressionResult
export interface AwesomeOscillatorResult {
/** AO values (SMA5 - SMA34 of midpoints) */
ao: Array<number>
/** AO histogram color: 1 = green (rising), -1 = red (falling), 0 = neutral */
histogram: Array<number>
}
/**
* Awesome Oscillator (Bill Williams)
*
* AO = SMA(5, Midpoint) - SMA(34, Midpoint)
* where Midpoint = (High + Low) / 2
*
* Measures market momentum. Histogram bars are green when AO is rising,
* red when falling. Zero-line crossovers signal trend changes.
*
* Parameters:
* - data: OHLCV market data
* - fast_period: fast SMA period (default: 5)
* - slow_period: slow SMA period (default: 34)
*/
export declare function awesomeOscillator(data: Array<MarketData>, fastPeriod?: number | undefined | null, slowPeriod?: number | undefined | null): AwesomeOscillatorResult
export declare function bollingerBands(data: Array<number>, period?: number | undefined | null, multiplier?: number | undefined | null): BollingerBandsResult
export interface CandlestickPatterns {
/** Doji: +1 detected, 0 none */
doji: Array<number>
/** Bullish Engulfing: +1, Bearish Engulfing: -1 */
engulfing: Array<number>
/** Hammer: +1 (bullish reversal signal) */
hammer: Array<number>
/** Hanging Man: -1 (bearish reversal signal) */
hangingMan: Array<number>
/** Bullish Harami: +1, Bearish Harami: -1 */
harami: Array<number>
/** Morning Star: +1 (bullish three-bar reversal) */
morningStar: Array<number>
/** Evening Star: -1 (bearish three-bar reversal) */
eveningStar: Array<number>
/** Three White Soldiers: +1 (strong bullish) */
threeWhiteSoldiers: Array<number>
/** Three Black Crows: -1 (strong bearish) */
threeBlackCrows: Array<number>
/** Shooting Star: -1 (bearish reversal) */
shootingStar: Array<number>
/** Inverted Hammer: +1 (potential bullish reversal) */
invertedHammer: Array<number>
/** Spinning Top: +1 (indecision) */
spinningTop: Array<number>
/** Marubozu: +1 bullish (no shadows), -1 bearish */
marubozu: Array<number>
/** Composite signal: sum of all pattern signals at each bar */
composite: Array<number>
}
/**
* Detect common candlestick patterns from OHLC data.
*
* Returns +1 for bullish patterns, -1 for bearish, 0 for none.
* All 13 patterns are computed in a single pass for efficiency.
*
* Parameters:
* - data: OHLCV market data
* - body_threshold: max body/range ratio for doji (default: 0.05 = 5%)
*/
export declare function candlestickPatterns(data: Array<MarketData>, bodyThreshold?: number | undefined | null): CandlestickPatterns
export interface ChoppinessResult {
/** Choppiness Index values (0-100). NaN for warmup period. */
chop: Array<number>
/**
* Signals: 1 = trending (CHOP crosses below low_threshold),
* -1 = choppy/ranging (CHOP crosses above high_threshold), 0 = neutral
*/
signals: Array<number>
}
/**
* Choppiness Index (CI)
*
* CI = 100 * log10(Sum(TR, N) / (HighestHigh_N - LowestLow_N)) / log10(N)
*
* Measures whether the market is trending or range-bound:
* - Low values (< 38.2) indicate a strong trend
* - High values (> 61.8) indicate a choppy/sideways market
*
* Parameters:
* - data: OHLCV market data
* - period: lookback period (default: 14)
* - low_threshold: below this = trending (default: 38.2)
* - high_threshold: above this = choppy (default: 61.8)
*/
export declare function choppinessIndex(data: Array<MarketData>, period?: number | undefined | null, lowThreshold?: number | undefined | null, highThreshold?: number | undefined | null): ChoppinessResult
export interface ConditionalProbabilityResult {
/** Probability of a move >= +second_threshold after a first move >= first_threshold */
upProbability: number
/** Probability of a move <= -second_threshold after a first move >= first_threshold */
downProbability: number
/** Number of times the first move condition was met */
firstMoveCount: number
/** Number of times the second move was up after first move */
upCount: number
/** Number of times the second move was down after first move */
downCount: number
/** Indices where up moves occurred (in original data) */
upIndices: Array<number>
/** Indices where down moves occurred (in original data) */
downIndices: Array<number>
/** All second move percentage changes (when first condition was met) */
secondMoveReturns: Array<number>
}
/**
* Conditional Probability Analysis
*
* Calculates: P(second_move >= threshold | first_move >= threshold)
*
* Given a price series, finds all instances where the price moved by at least
* `first_threshold` over `first_move_days`, then measures what happened over
* the following `second_move_days`.
*
* The first move is triggered by absolute change >= first_threshold (both up and down).
* The second move probabilities are split into up (>= second_threshold) and down (<= -second_threshold).
*/
export declare function conditionalProbability(prices: Array<number>, firstMoveDays: number, secondMoveDays: number, firstThreshold: number, secondThreshold: number): ConditionalProbabilityResult
export interface ConditionalMatrixEntry {
firstThreshold: number
secondThreshold: number
upProbability: number
downProbability: number
sampleCount: number
}
/**
* Compute a matrix of conditional probabilities across multiple threshold combinations.
*
* Useful for heatmap visualization: for each (first_threshold, second_threshold) pair,
* returns the up and down probabilities.
*/
export declare function conditionalProbabilityMatrix(prices: Array<number>, firstMoveDays: number, secondMoveDays: number, firstThresholds: Array<number>, secondThresholds: Array<number>): Array<ConditionalMatrixEntry>
export interface CopulaSample {
u: Array<number>
v: Array<number>
}
export interface CopulaFitResult {
copulaType: string
parameter: number
logLikelihood: number
}
export interface ScenarioResult {
ticker: string
meanReturn: number
worstCase: number
bestCase: number
simulatedReturns: Array<number>
}
export declare function quantileTransform(data: Array<number>): Array<number>
export declare function gaussianCopulaSample(rho: number, nSamples: number, seed?: number | undefined | null): CopulaSample
export declare function gaussianConditionalSample(u1: number, rho: number, nSamples: number, seed?: number | undefined | null): CopulaSample
export declare function claytonCopulaSample(theta: number, nSamples: number, seed?: number | undefined | null): CopulaSample
export declare function gumbelCopulaSample(theta: number, nSamples: number, seed?: number | undefined | null): CopulaSample
export declare function frankCopulaSample(theta: number, nSamples: number, seed?: number | undefined | null): CopulaSample
export declare function fitCopula(u: Array<number>, v: Array<number>, copulaType: string): CopulaFitResult
export declare function portfolioScenario(returnsData: Array<Array<number>>, marketDrop: number, copulaType?: string | undefined | null, nSimulations?: number | undefined | null): Array<ScenarioResult>
export interface DmiResult {
plusDi: Array<number>
minusDi: Array<number>
adx: Array<number>
}
export declare function directionalMovementIndex(data: Array<MarketData>, period: number): DmiResult
/**
* Disparity Index
*
* Measures the percentage distance between the current price and a moving average.
* DI = 100 * (Close - MA(N)) / MA(N)
*
* Positive values: price is above the MA (bullish)
* Negative values: price is below the MA (bearish)
* Extreme values suggest overbought/oversold conditions
*/
export declare function disparityIndex(prices: Array<number>, period?: number | undefined | null): Array<number>
export interface Signal {
type: number
price: number
index: number
}
export declare function entryExitSignals(data: Array<MarketData>, smaPeriod: number, emaPeriod: number, atrPeriod: number, threshold: number): Array<Signal>
export declare function exponentialMovingAverage(data: Array<number>, period: number): Array<number>
export interface ImportantLevels {
highestResistance: number
lowestSupport: number
averagePivot: number
supports: Array<number>
resistances: Array<number>
}
export declare function extractImportantLevels(data: Array<number>): ImportantLevels
export interface FeatureRow {
/** Bar index */
index: number
/** 1-bar return (pct change) */
return1: number
/** 5-bar return */
return5: number
/** 10-bar return */
return10: number
/** 20-bar return */
return20: number
/** True Range */
trueRange: number
/** ATR (Wilder's, 14-period) */
atr14: number
/** Rolling std dev of 1-bar returns (20-period) */
volatility20: number
/** High-Low range as % of close */
rangePct: number
/** RSI (14-period, Wilder's) */
rsi14: number
/** Rate of Change (10-period) */
roc10: number
/** Momentum (close - close[10]) */
momentum10: number
/** SMA 5 */
sma5: number
/** SMA 20 */
sma20: number
/** SMA 50 */
sma50: number
/** EMA 12 */
ema12: number
/** EMA 26 */
ema26: number
/** MACD line (EMA12 - EMA26) */
macd: number
/** MACD signal (EMA9 of MACD) */
macdSignal: number
/** MACD histogram */
macdHistogram: number
/** Bollinger %B: (close - lower) / (upper - lower) */
bbPctB: number
/** Bollinger bandwidth: (upper - lower) / middle */
bbBandwidth: number
/** Close relative to SMA20: (close - sma20) / sma20 */
closeToSma20: number
/** Close relative to SMA50 */
closeToSma50: number
/** Distance from 20-bar high (%) */
distFromHigh20: number
/** Distance from 20-bar low (%) */
distFromLow20: number
/** Volume change (pct) */
volumeChange: number
/** Volume / SMA20 of volume */
volumeRatio: number
/** Body size: |close - open| / (high - low) */
bodyRatio: number
/** Upper shadow: (high - max(open,close)) / (high - low) */
upperShadow: number
/** Lower shadow: (min(open,close) - low) / (high - low) */
lowerShadow: number
/** Gap: (open - prev_close) / prev_close */
gap: number
/** SMA5 > SMA20 (1.0 or 0.0) */
trendSma520: number
/** SMA20 > SMA50 (1.0 or 0.0) */
trendSma2050: number
}
/**
* Generate a complete feature matrix from OHLCV data for ML pipelines.
*
* Computes ~35 features per bar covering returns, volatility, momentum,
* moving averages, MACD, Bollinger Bands, price position, volume,
* candle patterns, and trend signals.
*
* First ~50 bars are skipped (warmup period). Returns one FeatureRow per valid bar.
*/
export declare function featureEngine(data: Array<MarketData>): Array<FeatureRow>
export interface FramaResult {
/** FRAMA values (adaptive moving average) */
frama: Array<number>
/** Fractal dimension at each bar (1.0 = trending, 2.0 = choppy) */
fractalDimension: Array<number>
/** Alpha (smoothing factor) at each bar */
alpha: Array<number>
/** FRAMA slope (bar-to-bar change, for trend detection) */
slope: Array<number>
}
/**
* Fractal Adaptive Moving Average (FRAMA) — John Ehlers
*
* An EMA whose smoothing factor adapts based on the fractal dimension of prices.
* In trending markets (fractal dim ~1): FRAMA is fast and responsive.
* In choppy markets (fractal dim ~2): FRAMA is slow and smooth.
*
* Fractal dimension is estimated by comparing the price range over N bars
* to the ranges of two N/2 sub-periods (Ehlers' method).
*
* Parameters:
* - data: OHLCV market data
* - period: lookback for fractal calculation (default: 20, must be even)
* - fast_period: fast EMA equivalent period when trending (default: 4)
* - slow_period: slow EMA equivalent period when choppy (default: 200)
*/
export declare function frama(data: Array<MarketData>, period?: number | undefined | null, fastPeriod?: number | undefined | null, slowPeriod?: number | undefined | null): FramaResult
export interface GmmCluster {
/** Cluster index */
id: number
/** Mean of each feature dimension */
mean: Array<number>
/** Variance of each feature dimension (diagonal covariance) */
variance: Array<number>
/** Mixing weight (proportion of data in this cluster) */
weight: number
/** Number of points assigned to this cluster */
count: number
}
export interface GmmResult {
/** Cluster assignment for each data point */
labels: Array<number>
/**
* Posterior probabilities: labels.len() * n_components, row-major
* probabilities[i * n_components + k] = P(cluster k | point i)
*/
probabilities: Array<number>
/** Cluster details */
clusters: Array<GmmCluster>
/** BIC score (lower = better model fit vs complexity) */
bic: number
/** Log-likelihood of the fitted model */
logLikelihood: number
/** Number of EM iterations performed */
iterations: number
}
/**
* Gaussian Mixture Model (GMM) via Expectation-Maximization
*
* Clusters multi-dimensional data into n_components Gaussian distributions.
* Useful for market regime detection (e.g., calm/volatile/transition states).
*
* Input: a flat array of features, row-major, with `n_features` per row.
* Example: for returns + volume_change with 100 bars:
* data = [ret_0, vol_0, ret_1, vol_1, ...] with n_features = 2
*
* Parameters:
* - data: flat array of feature values (row-major)
* - n_features: number of features per observation
* - n_components: number of Gaussian clusters (default: 3)
* - max_iterations: max EM iterations (default: 100)
* - tolerance: convergence threshold on log-likelihood change (default: 1e-6)
* - normalize: if true, z-score normalize each feature before fitting (default: true)
* - seed: optional random seed for reproducibility
*/
export declare function gaussianMixture(data: Array<number>, nFeatures: number, nComponents?: number | undefined | null, maxIterations?: number | undefined | null, tolerance?: number | undefined | null, normalize?: boolean | undefined | null, seed?: number | undefined | null): GmmResult
export interface HarResult {
/** Predicted volatility at each bar (annualized) */
predictedVol: Array<number>
/** Daily volatility component (Yang-Zhang, 1-day) */
volDaily: Array<number>
/** Weekly volatility component (5-day average of daily vol) */
volWeekly: Array<number>
/** Monthly volatility component (22-day average of daily vol) */
volMonthly: Array<number>
/** Volatility regime: 0=low, 1=medium, 2=high, -1=warmup */
regime: Array<number>
/** Suggested exposure: 2.0 (low vol), 1.0 (medium), 0.0 (high) */
exposure: Array<number>
}
/**
* HAR-X Volatility Model (Heterogeneous Autoregressive with eXogenous variables)
*
* Combines volatility from multiple timeframes:
* - Daily (1-day Yang-Zhang volatility)
* - Weekly (5-day average)
* - Monthly (22-day average)
*
* Predicts future volatility using: vol_pred = a + b1*vol_d + b2*vol_w + b3*vol_m + b4*vix
* Coefficients estimated via rolling OLS regression.
*
* Regime classification based on rolling percentiles:
* - Low vol (< percentile_low): exposure = 2.0 (leveraged)
* - Medium vol: exposure = 1.0 (normal)
* - High vol (> percentile_high): exposure = 0.0 (cash)
*
* Parameters:
* - data: OHLCV market data
* - yz_window: Yang-Zhang window (default: 10)
* - har_lookback: OLS regression lookback (default: 252)
* - percentile_low: low vol threshold (default: 25)
* - percentile_high: high vol threshold (default: 75)
* - vix_data: optional VIX values (same length as data) for HAR-X extension
*/
export declare function harVolatility(data: Array<MarketData>, yzWindow?: number | undefined | null, harLookback?: number | undefined | null, percentileLow?: number | undefined | null, percentileHigh?: number | undefined | null, vixData?: Array<number> | undefined | null): HarResult
export interface IchimokuData {
tenkanSen: number
kijunSen: number
senkouSpanA: number
senkouSpanB: number
chikouSpan: number
}
export declare function ichimoku(data: Array<MarketData>, tenkanPeriod?: number, kijunPeriod?: number, senkouBPeriod?: number, chikouShift?: number): Array<IchimokuData>
export interface KReversalResult {
kValues: Array<number>
buySignals: Array<KReversalSignal>
sellSignals: Array<KReversalSignal>
}
export interface KReversalSignal {
index: number
price: number
kValue: number
}
/**
* K-Reversal Indicator
*
* K = 100 * (Close - Low_N) / (High_N - Low_N)
*
* K < buy_threshold (default 20) suggests potential uptrend (oversold)
* K > sell_threshold (default 80) suggests potential downtrend (overbought)
*/
export declare function kReversal(data: Array<MarketData>, period?: number | undefined | null, buyThreshold?: number | undefined | null, sellThreshold?: number | undefined | null): KReversalResult
export interface OptionContract {
/** Strike price */
strike: number
/** Open interest */
openInterest: number
/** Daily volume */
volume: number
/** Days to expiry */
dte: number
/** "call" or "put" */
side: string
/** Implied volatility (optional, 0 if unknown) */
impliedVolatility: number
}
export interface ScoredOption {
/** Original contract index */
index: number
strike: number
openInterest: number
volume: number
dte: number
side: string
impliedVolatility: number
/** OI/Volume ratio (capped) */
oiVolumeRatio: number
/** Z-score of open interest within its expiry group */
oiZScore: number
/** Z-score of OI/Volume ratio within its expiry group */
ovZScore: number
/** Percentile rank of OI z-score (0-1) */
oiPercentile: number
/** Percentile rank of OV z-score (0-1) */
ovPercentile: number
/** OTM distance factor */
otmFactor: number
/** DTE decay factor */
dteFactor: number
/** Final composite score (higher = more institutional interest) */
score: number
}
/**
* Big Money Options Flow Scoring
*
* Ranks option contracts by institutional interest using a composite score:
* Score = w_oi * OI_percentile * dte_factor + w_ov * OV_percentile * dte_factor + w_otm * otm_factor
*
* Parameters:
* - contracts: array of option contracts with strike, OI, volume, DTE, side
* - spot_price: current underlying price
* - top_n: number of top contracts to return (default: 50)
* - k_otm: OTM scaling factor (default: 2.0, higher = more penalty for far strikes)
* - min_volume: minimum volume filter (default: 10)
* - min_oi: minimum open interest filter (default: 100)
* - cap_oi_vol: cap for OI/Volume ratio (default: 100)
* - w_oi: weight on OI z-score percentile (default: 0.4)
* - w_ov: weight on OI/Volume z-score percentile (default: 0.4)
* - w_otm: weight on OTM distance (default: 0.2)
*/
export declare function optionsFlowScore(contracts: Array<OptionContract>, spotPrice: number, topN?: number | undefined | null, kOtm?: number | undefined | null, minVolume?: number | undefined | null, minOi?: number | undefined | null, capOiVol?: number | undefined | null, wOi?: number | undefined | null, wOv?: number | undefined | null, wOtm?: number | undefined | null): Array<ScoredOption>
export declare function parabolicSar(data: Array<MarketData>, start?: number | undefined | null, increment?: number | undefined | null, maxValue?: number | undefined | null): Array<number>
export interface PatternMemoryResult {
/**
* Directional signal at each bar: sum of labels from k-nearest neighbors.
* Positive = historically bullish, negative = historically bearish.
*/
signal: Array<number>
/** Normalized signal: signal / k (range -1 to +1) */
normalizedSignal: Array<number>
/** Number of bullish neighbors at each bar */
bullishCount: Array<number>
/** Number of bearish neighbors at each bar */
bearishCount: Array<number>
/** Average Lorentzian distance to the k-nearest neighbors */
avgDistance: Array<number>
}
/**
* Pattern Memory (Lorentzian Classification)
*
* Non-parametric, memory-based directional signal. For each bar:
* 1. Encode market state as a feature vector (5 indicators x window bars)
* 2. Compare to all past states within a lookback using Lorentzian distance
* 3. Find k-nearest neighbors and check what followed (+1 up, -1 down)
* 4. Sum the labels as a directional signal
*
* Features computed internally:
* - RSI(14), WaveTrend(10,11), CCI(20), ADX(14), RSI(9)
*
* Parameters:
* - data: OHLCV market data
* - k_neighbors: number of nearest neighbors (default: 100)
* - lookback: how many past bars to search (default: 200)
* - window: number of consecutive bars per feature vector (default: 5)
* - forward_bars: bars ahead to determine label (default: 4)
*/
export declare function patternMemory(data: Array<MarketData>, kNeighbors?: number | undefined | null, lookback?: number | undefined | null, window?: number | undefined | null, forwardBars?: number | undefined | null): PatternMemoryResult
export interface PerformanceMetrics {
/** Annualized Sharpe Ratio: (mean_return - risk_free) / std * sqrt(252) */
sharpeRatio: number
/** Annualized Sortino Ratio: (mean_return - risk_free) / downside_std * sqrt(252) */
sortinoRatio: number
/** Calmar Ratio: annualized_return / max_drawdown */
calmarRatio: number
/** Maximum Drawdown (as positive fraction, e.g. 0.25 = 25%) */
maxDrawdown: number
/** Maximum Drawdown duration in bars */
maxDrawdownDuration: number
/** Total cumulative return (e.g. 0.50 = 50%) */
totalReturn: number
/** Annualized return */
annualizedReturn: number
/** Annualized volatility (std of returns * sqrt(252)) */
annualizedVolatility: number
/** Win rate: fraction of positive returns */
winRate: number
/** Profit factor: sum of gains / sum of losses */
profitFactor: number
/** Average win / average loss ratio */
payoffRatio: number
/** Number of trading periods */
numPeriods: number
/** Skewness of returns */
skewness: number
/** Excess kurtosis of returns */
kurtosis: number
/** Value at Risk (5th percentile of returns) */
var95: number
/** Conditional VaR / Expected Shortfall (mean of returns below VaR) */
cvar95: number
}
/**
* Compute comprehensive performance metrics from a returns series.
*
* Input: array of period returns (e.g. daily returns as decimals: 0.01 = 1%)
*
* Parameters:
* - returns: array of period returns
* - risk_free_rate: annualized risk-free rate (default: 0.02 = 2%)
* - periods_per_year: trading periods per year (default: 252 for daily)
*/
export declare function performanceMetrics(returns: Array<number>, riskFreeRate?: number | undefined | null, periodsPerYear?: number | undefined | null): PerformanceMetrics
/** Quick Sharpe Ratio calculation from returns. */
export declare function sharpeRatio(returns: Array<number>, riskFreeRate?: number | undefined | null, periodsPerYear?: number | undefined | null): number
/** Quick Sortino Ratio calculation from returns. */
export declare function sortinoRatio(returns: Array<number>, riskFreeRate?: number | undefined | null, periodsPerYear?: number | undefined | null): number
/** Quick Max Drawdown calculation from returns. */
export declare function maxDrawdown(returns: Array<number>): number
export interface PortfolioStats {
/** Expected daily return of the portfolio */
expectedReturnDaily: number
/** Expected annualized return */
expectedReturnAnnual: number
/** Daily portfolio volatility (std dev) */
volatilityDaily: number
/** Annualized portfolio volatility */
volatilityAnnual: number
/** Daily portfolio variance */
varianceDaily: number
/** Sharpe ratio (annualized) */
sharpeRatio: number
}
export interface CovarianceResult {
/** Covariance matrix (flat, row-major, n_assets x n_assets) */
covariance: Array<number>
/** Correlation matrix (flat, row-major, n_assets x n_assets) */
correlation: Array<number>
/** Mean daily return per asset */
meanReturns: Array<number>
/** Annualized volatility per asset */
volatilities: Array<number>
/** Number of assets */
nAssets: number
}
export interface EfficientFrontierPoint {
/** Target return (annualized) */
targetReturn: number
/** Portfolio volatility at this point (annualized) */
volatility: number
/** Optimal weights for this point */
weights: Array<number>
/** Sharpe ratio at this point */
sharpeRatio: number
}
export interface EfficientFrontierResult {
/** Points along the efficient frontier */
frontier: Array<EfficientFrontierPoint>
/** Global Minimum Variance Portfolio */
gmvp: EfficientFrontierPoint
/** Maximum Sharpe Ratio (tangency) portfolio */
maxSharpe: EfficientFrontierPoint
}
/**
* Compute covariance matrix, correlation matrix, and per-asset stats
* from multiple return series.
*
* Input: flat array of returns, row-major, with n_assets per row.
* Each row = one time period, columns = assets.
* Example: [ret_a_0, ret_b_0, ret_c_0, ret_a_1, ret_b_1, ret_c_1, ...]
*/
export declare function covarianceMatrix(returnsFlat: Array<number>, nAssets: number): CovarianceResult
/**
* Compute portfolio return and risk for given weights.
*
* - returns_flat: flat return series (row-major, n_assets per row)
* - n_assets: number of assets
* - weights: portfolio weights (must sum to ~1)
* - risk_free_rate: annualized (default: 0.02)
*/
export declare function portfolioStats(returnsFlat: Array<number>, nAssets: number, weights: Array<number>, riskFreeRate?: number | undefined | null): PortfolioStats
/**
* Compute the efficient frontier using the analytical Markowitz solution.
*
* - returns_flat: flat return series (row-major, n_assets per row)
* - n_assets: number of assets
* - n_points: number of points on the frontier (default: 50)
* - risk_free_rate: annualized (default: 0.02)
*/
export declare function efficientFrontier(returnsFlat: Array<number>, nAssets: number, nPoints?: number | undefined | null, riskFreeRate?: number | undefined | null): EfficientFrontierResult
export declare function pivotPoints(data: Array<MarketData>): Array<number>
export interface RegimeLeverageResult {
/** Hybrid oscillator values (smoothed) */
oscillator: Array<number>
/** Yang-Zhang volatility (annualized) */
yzVolatility: Array<number>
/** Volatility percentile (0-1, rolling 252-bar) */
volPercentile: Array<number>
/** Regime label: 0=Defensive, 1=Moderate, 2=Bullish, 3=Aggressive */
regime: Array<number>
/** Leverage factor: 0.0, 1.0, 2.0, or 3.0 */
leverage: Array<number>
/** VIX ratio (vix/vix3m) if VIX data provided, else NaN */
vixRatio: Array<number>
}
/**
* Market Regime Adaptive Leverage System (MRALS)
*
* Classifies market into 4 regimes and assigns leverage:
* - Aggressive (3x): low vol + bullish trend + normal VIX structure
* - Bullish (2x): positive trend, moderate volatility
* - Moderate (1x): neutral conditions
* - Defensive (0x): high volatility or bearish signals
*
* Uses a hybrid oscillator combining:
* - Price momentum (EMA fast/slow differential)
* - Relative strength (21-bar return vs rolling mean, z-scored)
* - Volatility component (VIX ratio deviation, z-scored if available)
*
* Parameters:
* - data: OHLCV market data
* - vix_values: optional VIX index values (same length)
* - vix3m_values: optional VIX3M index values (same length)
* - yz_window: Yang-Zhang vol window (default: 21)
* - ema_fast: fast EMA for oscillator (default: 8)
* - ema_slow: slow EMA for oscillator (default: 21)
* - oscillator_smooth: EMA smoothing for oscillator (default: 5)
* - vol_lookback: rolling window for vol percentile (default: 252)
* - trend_period: SMA period for price trend (default: 50)
*/
export declare function regimeLeverage(data: Array<MarketData>, vixValues?: Array<number> | undefined | null, vix3MValues?: Array<number> | undefined | null, yzWindow?: number | undefined | null, emaFast?: number | undefined | null, emaSlow?: number | undefined | null, oscillatorSmooth?: number | undefined | null, volLookback?: number | undefined | null, trendPeriod?: number | undefined | null): RegimeLeverageResult
export declare function relativeStrengthIndex(prices: Array<number>, period: number): Array<number>
export interface RviResult {
/** RVI line values */
rvi: Array<number>
/** Signal line (4-period weighted moving average of RVI) */
signal: Array<number>
}
/**
* Relative Vigor Index (RVI)
*
* Measures the conviction of a price move by comparing the close-open range
* to the high-low range. The idea: in uptrends, closes tend to be above opens,
* and the opposite in downtrends.
*
* RVI = SMA(N, numerator) / SMA(N, denominator)
* where:
* numerator = (Close - Open) + 2*(Close[-1] - Open[-1]) + 2*(Close[-2] - Open[-2]) + (Close[-3] - Open[-3]) / 6
* denominator = (High - Low) + 2*(High[-1] - Low[-1]) + 2*(High[-2] - Low[-2]) + (High[-3] - Low[-3]) / 6
*
* Signal = (RVI + 2*RVI[-1] + 2*RVI[-2] + RVI[-3]) / 6
*
* Parameters:
* - data: OHLCV market data
* - period: SMA smoothing period (default: 10)
*/
export declare function relativeVigorIndex(data: Array<MarketData>, period?: number | undefined | null): RviResult
export declare function simpleMovingAverage(data: Array<number>, period: number): Array<number>
export interface SpreadEstimatorResult {
/** Rolling bid-ask spread estimates (0.01 = 1% spread) */
spreads: Array<number>
/** Rolling bid-ask spread with sign preserved */
signedSpreads: Array<number>
}
/**
* Rolling Bid-Ask Spread Estimator (Ardia, Guidotti & Kroencke, 2024)
*
* Estimates bid-ask spread from OHLC prices using moment conditions
* and a rolling window. More accurate than Roll (1984), Corwin-Schultz (2012),
* and Abdi-Ranaldo (2017) estimators, especially in low-liquidity markets.
*
* A returned value of 0.01 means a 1% spread.
*/
export declare function spreadEstimator(data: Array<MarketData>, window: number): SpreadEstimatorResult
/**
* Classic Roll (1984) spread estimator for comparison.
* spread = 2 * sqrt(-Cov(ΔP_t, ΔP_{t-1})) if covariance is negative, else 0.
*/
export declare function rollSpreadEstimator(prices: Array<number>, window: number): Array<number>
/**
* Corwin-Schultz (2012) High-Low spread estimator.
* Uses high and low prices over two consecutive periods.
*/
export declare function corwinSchultzSpreadEstimator(data: Array<MarketData>, window: number): Array<number>
export declare function stochasticMomentumIndex(data: Array<MarketData>, lookbackPeriod?: number | undefined | null, firstSmoothing?: number | undefined | null, secondSmoothing?: number | undefined | null): Array<number>
export declare function stochasticOscillator(data: Array<MarketData>, period: number): Array<number>
export interface ThreeWayResult {
/** Combined score at each bar (-3 to +3) */
score: Array<number>
/** Trend component: +1 (SMA fast > slow), -1 (opposite), 0 (warmup) */
trend: Array<number>
/** Momentum component: +1 (RSI > 50), -1 (RSI < 50), 0 (neutral/warmup) */
momentum: Array<number>
/** Volatility component: +1 (expanding, ATR rising), -1 (contracting), 0 (warmup) */
volatility: Array<number>
/** Signal: 1 = strong buy (score >= 2), -1 = strong sell (score <= -2), 0 = neutral */
signals: Array<number>
}
/**
* Three Way Indicator
*
* Combines three independent market dimensions into a single composite score:
* 1. Trend: SMA crossover (fast vs slow)
* 2. Momentum: RSI position relative to 50
* 3. Volatility: ATR direction (expanding or contracting)
*
* Score ranges from -3 (all bearish) to +3 (all bullish).
* Signals fire when score >= buy_threshold or <= -sell_threshold.
*
* Parameters:
* - data: OHLCV market data
* - fast_sma: fast SMA period (default: 10)
* - slow_sma: slow SMA period (default: 30)
* - rsi_period: RSI period (default: 14)
* - atr_period: ATR period (default: 14)
* - atr_lookback: bars to compare ATR direction (default: 5)
* - signal_threshold: absolute score threshold for signals (default: 2)
*/
export declare function threeWayIndicator(data: Array<MarketData>, fastSma?: number | undefined | null, slowSma?: number | undefined | null, rsiPeriod?: number | undefined | null, atrPeriod?: number | undefined | null, atrLookback?: number | undefined | null, signalThreshold?: number | undefined | null): ThreeWayResult
export declare function trendsMeter(data: Array<MarketData>, period?: number | undefined | null): Array<number>
export interface VolatilityBucket {
/** "low", "medium", or "high" */
regime: string
/** ATR multiplier for this regime */
atrMultiplier: number
/** Current ATR value */
atr: number
/** Current volatility (rolling std of returns) */
volatility: number
/** Stop-loss distance = ATR * multiplier */
stopDistance: number
/** Low volatility threshold (percentile) */
lowThreshold: number
/** High volatility threshold (percentile) */
highThreshold: number
}
export interface VolatilityEngineResult {
/** ATR values (full length, NaN for warmup) */
atr: Array<number>
/** Rolling volatility (std dev of returns, full length, NaN for warmup) */
volatility: Array<number>
/** Volatility regime at each bar: 0=low, 1=medium, 2=high, -1=warmup */
regimes: Array<number>
/** ATR multiplier selected at each bar */
atrMultipliers: Array<number>
/** Stop-loss distance at each bar (ATR * multiplier) */
stopDistances: Array<number>
/** Percentile-based low threshold at each bar */
lowThresholds: Array<number>
/** Percentile-based high threshold at each bar */
highThresholds: Array<number>
}
/**
* Volatility-Adaptive Engine
*
* Computes ATR + rolling volatility (std dev of returns), then classifies
* each bar into a volatility regime (low/medium/high) using rolling percentiles.
* Each regime maps to a different ATR multiplier for dynamic stop-loss sizing.
*
* Parameters:
* - data: OHLCV market data
* - atr_period: ATR lookback (default: 14)
* - vol_period: rolling std dev period for returns (default: 20)
* - vol_history_len: number of bars for percentile calculation (default: 200)
* - vol_warmup: minimum history before assigning regimes (default: 50)
* - percentile_low: low vol threshold percentile (default: 20)
* - percentile_high: high vol threshold percentile (default: 80)
* - low_vol_mult: ATR multiplier for low volatility (default: 1.5)
* - med_vol_mult: ATR multiplier for medium volatility (default: 2.5)
* - high_vol_mult: ATR multiplier for high volatility (default: 4.0)
*/
export declare function volatilityEngine(data: Array<MarketData>, atrPeriod?: number | undefined | null, volPeriod?: number | undefined | null, volHistoryLen?: number | undefined | null, volWarmup?: number | undefined | null, percentileLow?: number | undefined | null, percentileHigh?: number | undefined | null, lowVolMult?: number | undefined | null, medVolMult?: number | undefined | null, highVolMult?: number | undefined | null): VolatilityEngineResult
/** Get a single volatility bucket classification for the current bar */
export declare function volatilityBucket(currentAtr: number, currentVolatility: number, volatilityHistory: Array<number>, percentileLow?: number | undefined | null, percentileHigh?: number | undefined | null, lowVolMult?: number | undefined | null, medVolMult?: number | undefined | null, highVolMult?: number | undefined | null): VolatilityBucket
export interface YangZhangResult {
/** Yang-Zhang volatility (annualized) */
volatility: Array<number>
/** Overnight component (close-to-open) */
overnightVol: Array<number>
/** Intraday component (open-to-close) */
intradayVol: Array<number>
/** Rogers-Satchell component */
rogersSatchell: Array<number>
}
/**
* Yang-Zhang Volatility Estimator
*
* Combines three volatility components for more accurate estimation than
* simple standard deviation:
* - Overnight volatility: log(Open / prev_Close)²
* - Intraday volatility: log(Close / Open)²
* - Rogers-Satchell: log(H/O)*log(H/C) + log(L/O)*log(L/C)
*
* YZ = sqrt(overnight + k * intraday + (1-k) * RS)
* where k = 0.34 / (1.34 + (n+1)/(n-1))
*
* Output is annualized (multiplied by sqrt(252)).
*
* Parameters:
* - data: OHLCV market data
* - window: rolling window (default: 10)
*/
export declare function yangZhangVolatility(data: Array<MarketData>, window?: number | undefined | null): YangZhangResult
export declare function sum(a: number, b: number): number