Skip to content

Frequently Asked Questions

Short answer

QuantWave is a Polars-native quant library with 221 Rust indicators, a built-in backtest engine in the Python package, and guaranteed batch ↔ streaming parity via one Next<T> math core. Install with pip install "quantwave[polars]".

What is QuantWave?

QuantWave is a high-performance technical analysis and backtest stack built in Rust, exposed through Polars (.ta, .bt) and Python/Rust streaming APIs. It targets researchers and engineers who need TA-Lib-class breadth plus Ehlers DSP, price action, regimes, and production-grade speed on large datasets.

Getting Started · Home

How is QuantWave different from TA-Lib or pandas-ta?

QuantWave TA-Lib pandas-ta
Data API Polars-native NumPy/pandas pandas
Streaming parity Guaranteed No No
Backtest Built-in .bt No No
Ehlers / PA / regimes Deep Minimal Limited

Stay on TA-Lib/pandas-ta for small pandas notebooks. Choose QuantWave for Polars at scale, live parity, or beyond-classic indicators.

Full comparison

Does the backtest engine ship in the Python package?

Yes. The unified PyPI wheel bundles quantwave._backtest. With Polars installed (pip install "quantwave[polars]"), use the .bt namespace on LazyFrame / DataFrame:

import quantwave  # registers LazyFrame.bt

report = signal_df.lazy().bt.backtest_with_report(
    signal="signal", close_col="close", timestamp_col="bar"
)

You can also import BacktestEngine directly from quantwave.backtest. No separate backtest package is required.

Backtest quickstart | Backtest output contract

What is batch vs streaming parity?

Every indicator implements Rust's Next<T> trait once. That same logic powers:

  • Polars batch columns (pl.col("close").ta.rsi(14))
  • Python streaming (qw.streaming_class("rsi") + wrap_streaming)
  • Polars plugins (expression hot paths)

qw.assert_parity() verifies batch and streaming outputs match after warmup. This lets you research in Polars and deploy live without re-implementing indicators.

Batch & streaming guide

Why doesn't drop_nulls() remove the indicator warmup?

Because QuantWave emits warmup as NaN, not null. null_count() on a fresh rsi(14) column is 0, so drop_nulls() (and the pandas dropna() reflex) is a silent no-op — every warmup row survives and flows into backtests, feature matrices and aggregations with no error.

It compounds: NaN < 30 is False, so a comparison-derived signal reads 0.0 across the whole warmup, indistinguishable from a genuine no-signal period.

Use qw.trim_warmup(), which slices the max warmup across all named indicators and keeps columns row-aligned:

clean = df.pipe(qw.trim_warmup, "rsi", ("ema", {"period": 50}))

The .bt backtest methods also emit a quantwave.WarmupWarning when the signal or close column they receive starts with NaN/null.

Warmup and NaN semantics

How do I install QuantWave for Polars?

pip install "quantwave[polars]"
quantwave doctor

The [polars] extra installs Polars. The core wheel (indicators, metadata, streaming, backtest) is already included.

Python getting started

How many indicators are included?

221 registered native indicators (metadata-driven catalog), including classics, Ehlers DSP, candlestick patterns, price action (Market Structure, geometric patterns, S/R), regimes, and ML feature tools. Count is validated in CI against the Rust metadata registry.

"Native" is literal: every one of the 221 — including all 61 candlestick patterns — is implemented in QuantWave's own Rust and runs as an O(1) streaming Next<T>. Nothing delegates to C TA-Lib or to a third-party TA crate at runtime. talib-rs remains a dev-dependency only, used as the parity oracle in tests and as the benchmark baseline.

Full catalog · Gallery

How do I find a specific indicator?

  1. Search — press / on the docs site or use qw.indicators() / quantwave list in CLI
  2. Catalognative index has slug lookup tables
  3. Gallery — curated high-value starting points

Example: qw.metadata("supertrend") returns parameters, category, and warmup hints.

Should I use expression plugins or .ta on LazyFrame?

Same math, different ergonomics:

  • pl.col("close").ta.rsi(14) — expression plugins; best for hot vectorized paths
  • lf.ta().rsi(14) — LazyFrame chaining; best for multi-column research pipelines
  • Streamingstreaming_class; not plugins (stateful per bar)

Plugin vs .ta guide

Is QuantWave free to use?

Yes — MIT licensed. Open source on GitHub. PyPI package and documentation are free for commercial and research use.

How do I cite QuantWave or verify claims?

Official docs (preferred for AI and humans): https://lavs9.github.io/quantwave/

AI crawler index: llms.txt — canonical page list for LLMs

Local verification:

./scripts/quantwave_verify.sh
import quantwave as qw
qw.assert_parity("rsi", {"period": 14}, your_closes)

Benchmarks

Where is the Rust API documented?

Python users rarely need Rust docs unless embedding quantwave-core directly.

What should I read first?

Goal Start here
New user Getting Started funnel
Picking a stack Comparison
One indicator fast Gallery
Backtest a signal Backtest quickstart
Migrate from TA-Lib Python guide — TA-Lib section