Skip to content

API reference

Every indicator is a plain pl.Expr. Call it as a free function (momentum.rsi("close", 14)) or as an expression method (pl.col("close").ta.rsi(14)) — same code, pick whichever reads better.

The reference is split by what each family measures, so you can jump to the question you're actually asking:

If you want to know… Look in
Is price accelerating or losing steam? (overbought/oversold, divergence) Momentum
Which way is the trend, and how strong? Trend
How much is price moving — and is that expanding or contracting? Volatility
Is volume confirming the move? Where is money flowing? Volume
Did a doji / hammer / engulfing pattern just print? Candlestick patterns
Simple period / cumulative returns, OHLC price transforms Returns & price transforms
Risk sizing, drawdown, tail risk, factor exposure, regime detection Quant
Liquidity, order-flow toxicity, spread, mean-reversion speed Microstructure
Which of my 200 features are actually different from each other? Feature selection
Time-of-day / day-of-week / session effects Calendar
Calling indicators as pl.col(...).ta.<name>() Expression namespace
Building your own indicator, cleaning dirty data Utilities

Conventions that hold everywhere

  • Inputs are a column name (str) or an existing pl.Expr — uniformly, across every indicator.
  • Warm-up is null, never faked. An indicator needing k bars of history returns null for its first k-1 rows, so a warm-up value never leaks into a backtest.
  • Per-symbol is free. Append .over("symbol") on a multi-asset frame and every indicator computes independently per group, with no state crossing symbol boundaries.
  • fillna: bool = False on every numeric indicator forward-fills gaps when True. The candlestick patterns are the exception: they return a discrete 0 / ±100 classification, where forward-filling a detection onto later bars would invent patterns that never occurred.
  • Streaming-safe. Every indicator produces identical output under .collect(engine="streaming").