TA-Lib
The C indicator library everything else wraps — and pip now ships the C part with it.
Last updated
What it is
TA-Lib is two projects sharing a name, and knowing which is which is the difference between a five-second install and a lost afternoon.
The first is the C library — TA-Lib/ta-lib on GitHub, written by Mario Fortier in 1999 and
still maintained by him. It holds the algorithms, and native implementations also exist for Rust,
Java and C#. The second is ta-lib-python, John Benediktsson's Cython wrapper, published on
PyPI as TA-Lib and imported as talib. Nearly every other indicator library in Python either
wraps this one or defines itself against it.
As of 0.8.0 the wrapper exposes 201 functions, 61 of them candlestick patterns — counted both in
the generated _func.pxi inside the 0.8.0 source distribution and on the project's own function
index on 19 September 2026. That is up from 161 in 0.6.8, because the C library's 0.8.1 release added forty
new ones in September 2026: SUPERTREND, VWAP, Hull and zero-lag moving averages, Donchian and
Keltner channels, Heikin-Ashi, TSI, Vortex, Chaikin Money Flow and the rest of the list that users
had been filing issues about for a decade. The "158 indicators" every tutorial quotes is now out of
date.
Three Python APIs sit on top: a function API taking NumPy arrays or pandas and polars Series, an abstract API taking a dict or DataFrame of OHLCV and returning named columns, and a streaming API that computes only the latest value.
Pricing
Free, and there is nothing to buy — no pro build, no hosted tier, no commercial licence. The licensing is the part worth reading twice, because "TA-Lib is BSD" is only half true: the C library is BSD 3-Clause and the Python wrapper is BSD 2-Clause. Both are OSI-approved and neither is copyleft, but a wheel contains both, so shipping one to a customer means carrying two notices and honouring the extra no-endorsement clause.
Data & coverage
Ships no data of any kind. Functions take float arrays and never see a ticker, an exchange or a timestamp, so any instrument and any bar size works — including ones where the indicator makes no sense.
Integrations
Wheels have been published since 0.6.5, and 0.8.0 ships 54 of them for CPython 3.9–3.14 across
manylinux and musl on x86_64 and aarch64, macOS on Intel and Apple Silicon, and Windows in 32-bit,
64-bit and arm64. They are self-contained: a bundled libta-lib shared object on Linux, a
.dylibs/libta-lib.1.1.0.dylib on macOS, and the C code linked statically into the .pyd on
Windows.
Outside Python, 0.7.1 and 0.8.1 added Conan and vcpkg packaging and a setup-ta-lib GitHub Action,
and community bindings now exist for Go, PHP, PostgreSQL, R, Ruby and Zig. conda-forge carries both
ta-lib and libta-lib.
Limitations
- The wrapper's README still opens by telling you to install the C library yourself, with
Homebrew and
TA_LIBRARY_PATHinstructions below it. That text predates the wheels and is the single largest source of installation confusion around this library. - NaN handling is not pandas' handling. One missing value mid-series propagates to the end of the output rather than clearing after the lookback window.
- Upgrading to 0.8.1 changes numbers, and two of those changes are not rounding: BBANDS' default period moved from 5 to 20, and PPO and APO now default to an EMA where they used to default to an SMA. Same call, different output, no error. The rest is floating-point re-ordering from the fused multiply-add rewrites, and the release notes quantify it: RSI moves by at most 5.7e-14 on the 0–100 scale at the default period and 5.3e-13 at period 20,000, STOCHRSI by up to 1.1e-11, ATR and NATR by 1.3e-15, EMA by 2.8e-16.
- Function level only. No bar loop, no positions, no portfolio — that is a backtesting framework's job.
- NumPy 1 users are stuck on
ta-lib<0.5.
Alternatives
pandas-ta and its successor fork are the pure-Python answer for anyone who wants a DataFrame accessor and no binary dependency at all; the trade is speed and the reference implementation. VectorBT bundles its own Numba-compiled indicators and will also call TA-Lib if it is installed.
Specs
- Interfaces
- Python, C
- Export
- None
- Asset classes
- Stocks, ETF, Futures, Forex, Crypto, Indices, Commodities
- Markets
- Global
- Platforms
- Library
- AI features
- None
- Pricing verified
- Capabilities verified
- Coverage verified
Also worth comparing
- pandas-ta — The DataFrame indicator library whose repo is gone and whose last release is a year old.
- arch — GARCH and the rest of the volatility-model family, plus the tests you need around them.
- empyrical-reloaded — The maintained fork of Quantopian's empyrical — risk statistics, no plots.
- exchange_calendars — Sessions, minutes and holidays for 69 exchanges, keyed by ISO-10383 code.
- ffn — Performance stats, drawdowns and portfolio weights from a DataFrame of prices.
- PyPortfolioOpt — Prices in, weights out — efficient frontier, Black-Litterman and HRP.
FAQ
Do I still need a C compiler to install TA-Lib in Python?
Almost certainly not. Since 0.6.5 the project publishes binary wheels that carry the C library inside them, and 0.8.0 ships 54 of them covering CPython 3.9 through 3.14 on Linux x86_64 and aarch64, macOS Intel and Apple Silicon, and Windows 32-bit, 64-bit and arm64. A compiler is needed only off that matrix.
Which package do I install, and what do I import?
The PyPI project is TA-Lib and the import is talib. Neither talib nor ta-lib-python is registered on PyPI by anyone else, so the obvious guesses simply fail rather than installing a stranger's code. Skip ta-lib-bin and TA-Lib-Precompiled — the same author published them as pre-wheel workarounds and both stopped at 0.4.x in 2022.
Is TA-Lib still maintained?
Both halves are, and the C library is busier now than it has been in years. Version 0.8.1 landed on 12 September 2026 with forty new functions, and the last commit to main was 17 September 2026. The Python wrapper released 0.8.0 on 13 September 2026. Neither repository is archived.
What licence is TA-Lib under?
Two licences, both permissive and neither copyleft. The C library is BSD 3-Clause, copyright Mario Fortier; the Python wrapper is BSD 2-Clause. A pip wheel contains both, so redistributing one means honouring the three-clause no-endorsement condition as well as the two-clause one.