Skip to content

lambda_hmm

Regime regime hmm lambda ecld ldhmm leptokurtic

Lambda-distribution (ecld) emission HMM for leptokurtic returns — ldhmm parity mode.

Visual Example

Lambda HMM — leptokurtic emission schematic

Lambda (ecld) emissions use β=2/λ generalized-normal tails; λ>1 improves fit on leptokurtic returns (hmm_lambda_2state.json).

Description

Lambda-distribution HMM mode for leptokurtic financial returns — the core differentiator of the ldhmm package (Lihn, SSRN 2979516). Each state emits from a symmetric exponential-power density with (μ, σ, λ); λ=1 reduces to Gaussian, nesting the gaussian_hmm mode.

Enable via fit_lambdas=True on fit_gaussian_hmm / .ta().hmm_fit(..., fit_lambdas=True). The M-step alternates profile likelihood updates for λ and σ per state while EM refits transitions and means. Use when return series show excess kurtosis that degrades Gaussian HMM fit quality.

Validated against hmm_lambda_2state.json (generic 2-state fixture). Pairs with hmm_forecast for mixture volatility forecasts used in ldhmm vol studies.

Formula / Specification

Implementation (quantwave-core/src/regimes/gaussian_hmm.rs):

See the Next<T> implementation and METADATA in the core module.

Gold-standard parity vectors: quantwave-core/tests/gold_standard/hmm_lambda_2state.json.

Parameters

Parameter Default Description
n_states 2 Number of latent states.
max_iter 100 Maximum EM iterations.
fit_lambdas true Estimate per-state λ in the M-step.

Usage Examples

Same API as gaussian_hmm with fit_lambdas=True (lambda / ecld emissions, ldhmm parity).

Polars

df = (
    df.lazy()
    .ta()
    .hmm_fit("returns", n_states=2, max_iter=100, fit_lambdas=True)
    .collect()
)

Python

import quantwave as qw

fit = qw.fit_gaussian_hmm(returns, n_states=2, max_iter=100, fit_lambdas=True)
print(fit.params.lambdas)  # per-state λ (≥ 1 for leptokurtic tails)

Edge Cases & Limitations

  • Warm-up: first 2 bars may return NaN or partial state per implementation.
  • Parameter sensitivity: smaller periods increase noise; larger periods increase lag.
  • Sudden gaps or bad ticks can distort rolling windows — consider pre-filtering.
  • Single-series indicators ignore volume unless otherwise documented.
  • Validated via proptests against gold-standard vectors where available.
  • No look-ahead bias; streaming and Polars batch paths are bit-identical.

Boundary Behavior

Condition Behavior
Warm-up Leading bars return NaN until warmup_bars is satisfied.
period > len When period exceeds series length, output is all NaN.
NaN inputs NaN in input propagates to output (NaN out).
Invalid params Non-positive period or missing required params raise ValueError.
Empty data Empty input returns an empty result series.

Sources & References

Primary Source: references/ldhmm/ssrn-2979516.pdf; references/ldhmm/ldhmm-cran-reference.pdf

Implementation: quantwave-core/src/indicators/gaussian_hmm.rs (LAMBDA_HMM / LAMBDA_HMM_METADATA). Parity: quantwave-core/tests/gold_standard/hmm_lambda_2state.json

Provenance: Standards bulk upgrade 2026-07-04 IST — see docs/DOCUMENTATION_STANDARDS.md.