Indicators Reference
Pandas TA Classic includes 224 indicators in the Category system plus 62 CDL patterns accessible via cdl_pattern() (284 unique total — cdl_doji and cdl_inside are counted in both) organized into the following categories:
Candles (5 wrappers + 62 native CDL patterns) - Category count includes wrapper/accessor indicators (
cdl_pattern,cdl_doji,cdl_inside,cdl_z,ha). The 62 pattern names are exposed throughcdl_pattern().Cycles (8) - Cycle-based and Hilbert Transform indicators
Momentum (53) - Momentum and oscillator indicators
Overlap (46) - Moving averages and trend-following indicators
Performance (3) - Performance and return metrics
Statistics (14) - Statistical analysis functions
Trend (26) - Trend identification and direction indicators
Volatility (18) - Volatility and range-based indicators
Volume (20) - Volume analysis indicators
Math (31) - Element-wise math operators and transforms
Note
The category system now uses dynamic discovery - indicators are automatically detected from the package structure, ensuring the list is always up-to-date with available indicators.
Input Shorter Than the Window
An indicator handed fewer rows than its window returns an all-NaN result, the
same way close.rolling(50).mean() does on 10 rows. The result keeps the
input’s index and the usual name and columns, so
df.ta.sma(length=50, append=True) on a short frame adds an all-NaN
SMA_50 column instead of nothing. Before 0.9.0 these calls returned
None; test for short data with result.isna().all(). Empty input
is the zero-row case of the same rule.
Inputs of different lengths are aligned on the index labels they share, so a
benchmark with a longer history or a volume series that starts later works as
expected. Inputs with no label in common (a RangeIndex next to a
DatetimeIndex, a tz-aware next to a naive index, two date ranges that never
overlap) raise ValueError: they could only produce an all-NaN result on the
union of both indexes.
Missing Values
A leading NaN run is not data. Chained input (one indicator’s output fed
into another) starts with a NaN warm-up run. Every indicator returns the same
values on the real bars as it would on the series without that run, and NaN on
the run itself. tests/test_leading_nan_contract.py checks every registered
indicator.
A missing bar inside the series (a NaN in any input) is handled in one of
three ways, pinned per indicator by tests/test_interior_nan_contract.py:
Recovers (every indicator not listed below): the result is NaN near the gap and, once the gap has left every window and recursion, equals the result on the complete series. Window indicators such as
sma(length=20)are NaN for 20 bars. Recursive indicators (macd,kama,jma,mama,rsx, theht_*family,ha, …) skip the missing bar: it reads NaN and the recursion continues as if the bar did not exist. TA-Lib instead reports NaN from the gap to the end of the series. A bar whose every input is missing reads NaN;ema,rma, Wilder’s smoothing and the state machines (psar,supertrend, …) keep their state across it. Candle patterns are the exception: they read 0 there, as TA-Lib’s do.Cumulative (
ad,aobv,nvi,obv,pvi,pvt,wad): a running total cannot know the missing bar’s contribution, so later values differ from the complete series by a persistent amount. Their bar-to-bar changes are unaffected.Whole series (
tos_stdevall): one fit over the entire series changes everywhere, slightly, when a bar is missing.
No indicator publishes a value it could not compute: a result is either
computed from the available bars or NaN. This also holds on the warm-up bars at
the start of the series, and for the direction and flag columns that describe
them — tests/test_warmup_contract.py checks both for every registered
indicator and every column it returns, CPR_POSITION and CPR_WIDTH_CLASS
included (float64, NaN before the first completed period).
tests/test_data_gaps_contract.py extends the missing-bar contract to a
whole missing bar, a five-bar outage, a bar missing only its volume or only its
high and low, a missing newest bar, and a calendar with missing days: an
indicator that counts bars gives the same numbers whatever the timestamps.
Nullable input (Float64, Int64 and the other pandas extension
numeric dtypes, as read_csv(dtype_backend="numpy_nullable") returns, and
pyarrow numeric dtypes such as double[pyarrow] and int64[pyarrow]) is
computed as float64, with pd.NA read as a missing bar (NaN). Results are
the same as for the data in float64, dtype included: float64, not Float64.
As with any float64 data, Int64 values beyond 2**53 lose precision.
float32 input (and float16) is computed as float64 too, so the result is
the float64 one, dtype included; it used to stay float32 and lose digits.
numpy integer input is computed as numpy computes it, so integer-valued
results (ceil, npround, …) keep int64.
tests/test_nullable_input_contract.py checks every registered indicator.
Zero Volume
A session with no volume – a halt, an illiquid instrument, a feed that writes
0 for “unknown” – leaves the volume dividers without a value to divide by.
What each one does, pinned in tests/test_degenerate_input.py so that any
change is noticed:
emvandeomdivide the bar’s movement by its volume. A bar that moved on no volume reads+-infinemv, andeom(a 14-bar average of the same ratio) reads NaN for every window that contains it. A bar with no range reads 0.0; a bar with a range whose midpoint did not change reads NaN (0/0).marketfidivides the bar’s range by its volume and readsinffor a bar with a range and no volume.cmfandvoscread NaN over a window with no volume at all (0/0):cmfis a volume-weighted money flow andvosca percent change from the volume average, and neither has a value where nothing traded. Reading 0.0 would report a balanced flow or an unchanged volume instead.vwma,vwapandvwmacdread NaN over a window with no volume: a volume-weighted price is undefined where nothing traded.
Drop or fill zero-volume bars before computing these if a value is needed.
Lookahead Bias and Causality
An indicator is causal when the value it reports at bar t is computed from
bars t and earlier only. Causal indicators give the same value for a bar
whether you compute them over a 200-bar history or over the full series, so a
backtest reproduces what you could actually have seen in real time.
Almost every indicator in this library is causal. The exceptions below look forward on purpose — they are plotting and analysis tools, not signal generators. Using one to drive entries or exits will inflate backtest results.
Call |
Why it looks forward |
Causal alternative |
|---|---|---|
|
|
|
|
The Chikou Span is |
|
|
A CPR counts as virgin only if price has not tested it within the next
|
|
|
Fits a single linear regression over the entire series, so every point depends on all the others. |
none; use a rolling |
|
Aggregates the whole series into price bins. The result is a profile, not a time series. |
none |
Note
lookahead=False is the library-wide opt-out keyword: pass it and the
indicator drops whatever part of its output depends on later bars. It is
honoured by dpo(), ichimoku() and cpr() — for cpr() it forces
virgin_cpr off, so the CPR_VIRGIN column is not produced.
tos_stdevall() and vp() have no causal mode to switch to, so they
decline: they emit a UserWarning and return None rather than hand back
forward-looking values under a keyword that promises the opposite. That means
df.ta.strategy("all", lookahead=False) produces a set of columns you can
actually backtest — the non-causal ones are simply absent.
This list is enforced, not just documented. tests/test_lookahead.py evaluates
every registered indicator over the full series and over two shorter prefixes and
requires the shared bars to match exactly. The calls above are marked
xfail(strict=True), so the list cannot drift: an unlisted indicator that
starts looking forward fails the suite, and a listed one that becomes causal
fails as an unexpected pass.
Two indicators used to belong on this list and no longer do. mavp() derived
its default periods from len(close), which made every bar’s window length
depend on how much data you passed in; periods is now required. And
cdl_z(full=True) standardised against the whole series and back-filled, which
copied the final bar’s Z Score onto every earlier row; it now uses an anchored
(expanding) window.
Candles (5 Wrappers + 62 Native Patterns)
Candlestick patterns for identifying market sentiment and potential reversals.
The category count is 5 because dynamic discovery tracks callable indicator entries,
while the 62 native CDL patterns are selectable names handled by cdl_pattern().
All 62 CDL patterns have native Python implementations. The dispatch order inside cdl_pattern() is: native first → TA-Lib → ``ImportError`` (an unknown name raises ValueError). Because every pattern in ALL_PATTERNS has a native implementation, the TA-Lib branch is never reached in practice. Patterns are accessible via df.ta.cdl_pattern(name=...), or for doji and inside specifically via their dedicated accessor methods.
# All 62 patterns at once (native only, no TA-Lib needed)
df = df.ta.cdl_pattern(name="all")
# Single pattern
df = df.ta.cdl_pattern(name="engulfing")
# Multiple patterns
df = df.ta.cdl_pattern(name=["hammer", "morningstar", "engulfing"])
# Dedicated accessor methods (only these two have them)
result = df.ta.cdl_doji()
result = df.ta.cdl_inside()
Note
Native implementations take priority in cdl_pattern()’s dispatch chain. TA-Lib is only used as a fallback for any pattern that lacks a native implementation — which is none of the 62 patterns in ALL_PATTERNS.
Available patterns:
2crows, 3blackcrows, 3inside, 3linestrike, 3outside, 3starsinsouth, 3whitesoldiers
abandonedbaby, advanceblock, belthold, breakaway, closingmarubozu, concealbabyswall, counterattack
darkcloudcover, doji, dojistar, dragonflydoji, engulfing, eveningdojistar, eveningstar
gapsidesidewhite, gravestonedoji, hammer, hangingman, harami, haramicross, highwave
hikkake, hikkakemod, homingpigeon, identical3crows, inside, inneck, invertedhammer
kicking, kickingbylength, ladderbottom, longleggeddoji, longline, marubozu, matchinglow
mathold, morningdojistar, morningstar, onneck, piercing, rickshawman, risefall3methods
separatinglines, shootingstar, shortline, spinningtop, stalledpattern, sticksandwich
takuri, tasukigap, thrusting, tristar, unique3river, upsidegap2crows, xsidegap3methods
Note
cdl_doji() and cdl_inside() have dedicated implementations accessible as df.ta.cdl_doji() and df.ta.cdl_inside().
Other candle indicators:
CDL Pattern Dispatcher: cdl_pattern — unified candlestick pattern accessor (supports 62 pattern names)
CDL Doji (Dedicated Accessor): cdl_doji — convenience wrapper for
dojipatternCDL Inside (Dedicated Accessor): cdl_inside — convenience wrapper for
insidepatternHeikin-Ashi: ha —
df.ta.ha()— not a CDL pattern, not valid ascdl_pattern(name=...)Z Score: cdl_z —
df.ta.cdl_z()— Z-score normalisation of candle bodies, not a CDL pattern.full=Trueswitches the rolling window for an anchored (expanding) one
Note
TA-Lib and core indicators: For 59 non-candle indicators (ema, sma, rsi, macd, obv, atr, and others), the native implementation is used by default. TA-Lib is opt-in. Pass talib=True to use TA-Lib’s implementation:
# Uses native EMA (default behaviour)
ema = df.ta.ema(length=20)
# Use TA-Lib implementation if installed
ema = df.ta.ema(length=20, talib=True)
# Indicators with TA-Lib passthrough:
# ad, adosc, apo, aroon, atr, bbands, bop, cci, cmo, dema, dm,
# ema, hlc3, macd, mfi, midpoint, midprice, mom, natr, obv, ppo,
# roc, rsi, sma, stdev, t3, tema, trima, true_range, uo,
# variance, wcp, willr, wma
Signal columns
er, macd, macdfix, rsi and rsx accept signal_indicators=True.
It appends threshold and comparison columns to the indicator and returns a
DataFrame instead of a Series:
xa/xb— upper and lower thresholds (80 / 20;er, a ratio in [0, 1], uses 0.8 / 0.2;macduses 0 /None).Nonedrops that side’s column.cross_values—Truemarks the bars that cross a threshold,Falseflags every bar on one side of it. DefaultFalse;macddefaults to crossings for the histogram and levels for the MACD line.xserie— comparison series, used for both directions unlessxserie_a(above) orxserie_b(below) is given. DefaultNone.cross_series—True(the default) marks crossings of those series,Falseflags every bar on one side of them.
df.ta.rsi(length=14, signal_indicators=True, xa=70, xb=30)
# RSI_14, RSI_14_A_70, RSI_14_B_30
macdfix forwards all of these to macd. Because TA-Lib’s MACDFIX
returns the three lines only, talib=True is ignored while
signal_indicators or asmode is set.
Degenerate windows
A window with no range, no movement and no variance – every bar at the same
price – makes every range-normalised indicator divide 0 / 0. It happens on
illiquid instruments, halted sessions, forward-filled gaps and synthetic test
data.
Such a window reads 0.0, the convention TA-Lib applies. It is a marker for
“this window was degenerate”, not a reading on the indicator’s scale: on a flat
series willr reads 0.0, the top of its -100..0 range, while
stoch reads 0.0, the bottom of its 0..100 one.
flat = pd.Series([100.0] * 120)
ta.rsi(flat) # 14 NaN of warmup, then 0.0
ta.willr(flat, flat, flat) # 13 NaN of warmup, then 0.0
Two indicators are deliberately left out, because their NaN means nothing
happened rather than that a division failed:
hilo– the Gann activator has no state until the first breakout.td_seq– a TD setup needs four bars of movement before it counts.
The same applies to the sparse signal columns of psar, qqe and
supertrend, which mark the bars where a signal fired and are NaN
everywhere else by design.
A band with no width is degenerate in the same way, and reads 0.0 too. A
flat close run of length bars gives bbands a standard deviation of
exactly zero, so BBU == BBM == BBL; both derived columns mark it:
close = pd.Series([90.0] * 30 + [100.0] * 30)
bb = ta.bbands(close, length=5, mamode="ema")
bb["BBB_5_2.0"] # 0.0 while the band has no width
bb["BBP_5_2.0"] # 0.0 as well, not 1.0 and not 1e14
Inconsistent OHLC
Nothing validates that a bar satisfies low <= open, close <= high. A bar
that does not – high == low with open != close, for instance – is
impossible in real OHLC but is accepted, and it reaches the degenerate branch
with a numerator that is not zero. Such a bar reads 0.0 rather than
dividing by an epsilon: ad(open_=...) answered 4.5e15 per malformed bar
and, because it accumulates, carried that to the end of the series.
The library does not raise here. If your feed can emit such bars, check them before passing them in.
Cycles (8)
Detrended Synthetic Price: dsp
Even Better Sinewave: ebsw
Hilbert Transform — Dominant Cycle Period: ht_dcperiod
Hilbert Transform — Dominant Cycle Phase: ht_dcphase
Hilbert Transform — Phasor Components: ht_phasor (returns InPhase + Quadrature)
Hilbert Transform — SineWave: ht_sine (returns Sine + LeadSine)
Hilbert Transform — Trend vs Cycle Mode: ht_trendmode
Mesa Sine Wave: msw (returns MSW_SINE + MSW_LEAD; period-based DFT cycle detector)
Momentum (53)
Momentum and oscillator indicators for measuring the speed of price changes:
Awesome Oscillator: ao
Absolute Price Oscillator: apo
Bias: bias
Balance of Power: bop
BRAR: brar
Commodity Channel Index: cci
Chande Forecast Oscillator: cfo
Center of Gravity: cg
Chande Momentum Oscillator: cmo (Chande’s sums of up and down moves; TA-Lib’s
CMO, used withtalib=True, smooths them with Wilder’s method instead)Coppock Curve: coppock
Correlation Trend Indicator: cti (wrapper for
ta.linreg(series, r=True))Directional Movement: dm (Wilder-smoothed +DM/−DM as
PLUS_DM_<length>/MINUS_DM_<length>; equals TA-LibPLUS_DM/MINUS_DM)Efficiency Ratio: er
Elder Ray Index: eri
Fisher Transform: fisher
Forecast Oscillator: fosc
Inertia: inertia
KDJ: kdj
KST Oscillator: kst
Linear Regression RSI: lrsi
Moving Average Convergence Divergence: macd
MACD Extended: macdext (MACD with controllable MA type per line; MA types: 0=SMA, 1=EMA, 2=WMA, 3=DEMA, 4=TEMA, 5=TRIMA, 6=KAMA, 7=MAMA, 8=T3; 6 and 7 need TA-Lib,
talib=True)MACD Fixed: macdfix (MACD with fixed 12/26 periods; only signal period is configurable; uses TA-Lib
MACDFIXwhen available)Momentum: mom
Pretty Good Oscillator: pgo
Projection Oscillator: po
Percentage Price Oscillator: ppo
Psychological Line: psl
Percentage Volume Oscillator: pvo
Quantitative Qualitative Estimation: qqe (returns QQE, QQEs, QQEl, QQEb_l, QQEb_s, QQEd)
Rate of Change: roc
Rate of Change Percentage: rocp
Rate of Change Ratio: rocr
Rate of Change Ratio * 100: rocr100
Relative Strength Index: rsi
Relative Strength Xtra: rsx
Relative Vigor Index: rvgi
Schaff Trend Cycle: stc
Slope: slope
Smart Money Concept Liquidity Sweep: smc_sweep (returns +1 bullish sweep, -1 bearish sweep, 0 none; length=15, wick_mult=1.5)
SMI Ergodic: smi
Squeeze: squeeze (Default is John Carter’s. Enable Lazybear’s with
lazybear=True)Squeeze Pro: squeeze_pro
Stochastic Oscillator: stoch
Stochastic Fast: stochf
Stochastic RSI: stochrsi
TD Sequential: td_seq (Excluded from
df.ta.strategy())Trix: trix
TRIX Histogram: trixh
True strength index: tsi
Ultimate Oscillator: uo
Volume Weighted MACD: vwmacd
Williams %R: willr
Overlap (46)
Moving averages and trend-following indicators:
Arnaud Legoux Moving Average: alma
Average Price (OHLC/4): avgprice (arithmetic mean of open, high, low, close; equivalent to TA-Lib
AVGPRICEand tulipyavgprice)Double Exponential Moving Average: dema
Exponential Moving Average: ema
Fibonacci’s Weighted Moving Average: fwma
Gann High-Low Activator: hilo
High-Low Average: hl2
High-Low-Close Average: hlc3 (Commonly known as ‘Typical Price’)
Hull Exponential Moving Average: hma
Hilbert Transform Instantaneous Trendline: ht_trendline
Holt-Winter Moving Average: hwma
Ichimoku Kinkō Hyō: ichimoku (
ta.ichimoku()returns a single DataFrame of the known-period columns;append_span=Trueappends the forward-looking Span rows. The legacy(visible, span)tuple and theas_dataframeparameter were removed in 0.9.0; passingas_dataframeraisesTypeError. The DataFrame Extension Methoddf.ta.ichimoku()returns the same single DataFrame.lookahead=Falsedrops the Chikou Span Column)Jurik Moving Average: jma
Kaufman’s Adaptive Moving Average: kama
Linear Regression: linreg
Linear Regression Angle: linregangle (angle in degrees of the linear regression slope)
Linear Regression Intercept: linregintercept (y-intercept of the linear regression line)
Linear Regression Slope: linregslope (slope of the linear regression line)
Moving Average: ma (Generic moving average selector)
MESA Adaptive Moving Average: mama (returns MAMA + FAMA)
Moving Average with Variable Period: mavp (
periods, a per-bar window schedule, is a required input;mamodeother than 0 (SMA) needs TA-Lib,talib=True)Madrid Moving Average Ribbon: mmar
Median Price (H+L)/2: medprice (arithmetic mean of high and low; equivalent to TA-Lib
MEDPRICEand tulipymedprice)McGinley Dynamic: mcgd
Midpoint: midpoint
Midprice: midprice
Open-High-Low-Close Average: ohlc4
Pascal’s Weighted Moving Average: pwma
Rainbow Moving Average: rainbow
WildeR’s Moving Average: rma
Sine Weighted Moving Average: sinwma
Simple Moving Average: sma
Ehlers’ Super Smoother Filter: ssf
Supertrend: supertrend
Symmetric Weighted Moving Average: swma
T3 Moving Average: t3
Triple Exponential Moving Average: tema
Time Series Forecast: tsf
Triangular Moving Average: trima
Typical Price (H+L+C)/3: typprice (arithmetic mean of high, low, close; equivalent to TA-Lib
TYPPRICEand tulipytypprice)Variable Index Dynamic Average: vidya
Volume Weighted Average Price: vwap (Requires a DatetimeIndex in ascending order; an unsorted index raises
ValueError). The anchor follows the calendar of the index’s time zone: convert a UTC index to the exchange’s time zone for a session that crosses midnight in UTC, and shift a session that opens before local midnight (CME’s 18:00 New York open) so it starts at 00:00;help(ta.vwap)shows both.Volume Weighted Moving Average: vwma
Weighted Closing Price: wcp
Weighted Moving Average: wma
Zero Lag Moving Average: zlma
Performance (3)
Performance and return metrics. Use parameter cumulative=True for cumulative results:
Draw Down: drawdown
Log Return: log_return
Percent Return: percent_return
Statistics (14)
Statistical analysis functions:
Beta: beta (asset volatility relative to a benchmark series)
Pearson Correlation Coefficient: correl
Entropy: entropy
Kurtosis: kurtosis
Mean Absolute Deviation: mad
Mean Deviation: md (equivalent to tulipy
md; rolling mean absolute deviation from mean)Median: median
Quantile: quantile
Skew: skew
Standard Deviation: stdev
Standard Error: stderr
Think or Swim Standard Deviation All: tos_stdevall
Variance: variance
Z Score: zscore
Trend (26)
Trend identification and direction indicators:
Average Directional Movement Index: adx (also returns +DI and −DI as
DMP_<length>andDMN_<length>)Average Directional Movement Index Rating: adxr
Archer Moving Averages Trends: amat
Aroon & Aroon Oscillator: aroon
Choppiness Index: chop
Chande Kroll Stop: cksp (default is TradingView’s
p=10, x=1, q=9with a Wilder ATR;tvmode=Falsegives the book’s10, 3, 20with an SMA ATR)Central Pivot Range: cpr (pivot methods
classic,camarilla,fibonacci,woodie;timeframedailyuses the previous bar,intraday/weekly/monthlythe last completed calendar day, week or month)Decay: decay (Formally: linear_decay)
Decreasing: decreasing
Detrended Price Oscillator: dpo (Set
lookahead=Falseto disable centering)Directional Index: dx
Exponential Decay: edecay (multiplicative exponential decay; equivalent to tulipy
edecay)Increasing: increasing
Long Run: long_run
Minus Directional Movement: minus_dm (raw Wilder-smoothed −DM before ATR normalisation; equals TA-Lib
MINUS_DM, whichtalib=Truecalls directly)Parabolic Stop and Reverse: psar (the long and short stops combined equal TA-Lib
SAR, whichtalib=Truecalls directly)Plus Directional Movement: plus_dm (raw Wilder-smoothed +DM before ATR normalisation; equals TA-Lib
PLUS_DM, whichtalib=Truecalls directly)Price Max: pmax
Q Stick: qstick
Parabolic SAR Extended: sarext (positive while long, negative while short, as TA-Lib
SAREXT, which it equals for every parameter)Short Run: short_run
Trend Signals: tsignals
TTM Trend: ttm_trend (+1 when the close is above the average HL2 of the previous
lengthbars, −1 at or below it; NaN until that average exists and on bars whose close is missing)Vertical Horizontal Filter: vhf
Vortex: vortex
Cross Signals: xsignals
Volatility (18)
Volatility and range-based indicators:
Aberration: aberration
Acceleration Bands: accbands
Annualised Volatility: avolume (rolling annualised log-return standard deviation;
length * sqrt(252)-scaled)Average True Range: atr
Bollinger Bands: bbands
Chandelier Exit: ce
Chaikins Volatility: cvi
Donchian Channel: donchian
Historical Volatility: hvol (Annualized;
annualization=252by default)Holt-Winter Channel: hwc
Keltner Channel: kc
Mass Index: massi
Normalized Average True Range: natr
Price Distance: pdist
Relative Volatility Index: rvi
Elder’s Thermometer: thermo
True Range: true_range
Ulcer Index: ui
Volume (20)
Volume analysis indicators:
Accumulation/Distribution Index: ad
Accumulation/Distribution Oscillator: adosc
Archer On-Balance Volume: aobv
Chaikin Money Flow: cmf
Elder’s Force Index: efi
Ease of Movement: eom
Ease of Movement (EMV): emv (equivalent to tulipy
emv; usesdivisor=10000for scale; rolling-averaged variant withlengthparameter)Klinger Volume Oscillator: kvo
Market Facilitation Index: marketfi
Money Flow Index: mfi
Negative Volume Index: nvi
On-Balance Volume: obv
Positive Volume Index: pvi
Price-Volume: pvol
Price Volume Rank: pvr
Price Volume Trend: pvt
Volume Flow Indicator: vfi (
vfi(high, low, close, volume), Katsanos’ definition; it takeshighandlowsince 0.9.0)Volume Oscillator: vosc
Volume Profile: vp
Williams Accumulation/Distribution: wad
Math (31)
Element-wise math operators, rolling aggregations, and mathematical transforms.
Note
Each operator lives in its own submodule (e.g., from pandas_ta_classic.math.add import add).
Aliases max, min, sum resolve to rolling_max, rolling_min, rolling_sum
(matching TA-Lib MAX, MIN, SUM names).
Element-wise binary operators:
Add: add — element-wise addition of two series
Subtract: sub — element-wise subtraction of two series
Multiply: mult — element-wise multiplication of two series
Divide: div — element-wise division of two series
Rolling aggregation operators:
Rolling Maximum: rolling_max — rolling maximum over a window
Rolling Minimum: rolling_min — rolling minimum over a window
Rolling Sum: rolling_sum — rolling sum over a window
Mathematical transforms (wrapping NumPy / SciPy math, TA-Lib MATH TRANSFORM and MATH OPERATORS group, and tulipy equivalents):
Inverse Sine: asin
Inverse Cosine: acos
Inverse Tangent: atan
Ceiling: ceil
Cosine: cos
Hyperbolic Cosine: cosh
Exponential: exp
Floor: floor
Natural Logarithm: ln
Logarithm Base 10: log10
Sine: sin
Hyperbolic Sine: sinh
Square Root: sqrt
Tangent: tan
Hyperbolic Tangent: tanh
Index / position operators (TA-Lib MATH OPERATORS group):
Maximum Index: maxindex — position of the rolling maximum within its window, counted from the oldest bar (0 = oldest,
length - 1= current bar; a tie picks the oldest; a window holding a NaN gives NaN)Minimum Index: minindex — position of the rolling minimum within its window, counted the same way
Min-Max: minmax — rolling minimum and maximum over a window
Min-Max Index: minmaxindex —
minindexandmaxindexin one frame
Unlike TA-Lib’s MAXINDEX/MININDEX/MINMAXINDEX, which return the absolute array index, the three index operators are relative to the window: at bar i (its position in the series), TA-Lib’s value is result + i - length + 1, except on a tie, where TA-Lib may pick a later bar.
Tulipy extras (NumPy wrappers):
Absolute Value: npabs — element-wise absolute value (tulipy:
abs)Round: npround — element-wise rounding (tulipy:
round)Truncate: trunc — element-wise truncation toward zero
To Degrees: todeg — convert radians to degrees
To Radians: torad — convert degrees to radians
Utility / signal functions (accessible directly or via df.ta):
Crossover: crossover (returns Boolean Series that is True on the bar where
acrosses aboveb)Lag: lag (returns a Series offset by
nperiods; equivalent to tulipylag)
See also
Indicator Compatibility Matrix — per-indicator table of which implementations (Native / TA-Lib / tulipy) back the indicators listed above.