This is a Python wrapper for TA-Lib. From the homepage:
TA-Lib implements the standard technical analysis algorithms used across the industry, and is often the reference other libraries test their results against.
- 200+ indicators: ADX, MACD, RSI, Stochastic, Bollinger Bands and more, plus candlestick pattern recognition
- Batch and streaming: compute a whole array, or update one bar at a time without recomputing the history
- Native in five languages: C/C++, Java, C#, Rust and TypeScript
ta-lib-python uses Cython and Numpy
to efficiently and cleanly bind to the native C library.
In addition, this project also supports the use of the Polars and Pandas libraries.
Which TA-Lib C and numpy each ta-lib-python release line supports:
ta-lib-python0.4.x (supportsta-lib0.4.x andnumpy1)ta-lib-python0.5.x (supportsta-lib0.4.x andnumpy2)ta-lib-python0.6.x (supportsta-lib0.6.x andnumpy2)ta-lib-python0.7.x (supportsta-lib0.7.x andnumpy2)ta-lib-python0.8.x (supportsta-lib0.8.x andnumpy2)
You can install from PyPI:
python -m pip install TA-LibOr from Conda Forge:
conda install -c conda-forge ta-libBinary wheels include the TA-Lib C library and do not require a compiler or a separate TA-Lib C installation.
For convenience, and starting with version 0.6.5, we now build binary wheels for different operating systems, architectures, and Python versions using GitHub Actions which include the underlying TA-Lib C library and are easy to install. Starting with version 0.8.3, this library is statically linked into the extension.
Supported platforms:
- Linux
- x86_64
- arm64
- macOS
- x86_64
- arm64
- Windows
- x86_64
- x86
- arm64
Supported Python versions:
- 3.9
- 3.10
- 3.11
- 3.12
- 3.13
- 3.14
In the event that your operating system, architecture, or Python version is not available as a binary wheel, it is fairly easy to install from source using the instructions in Building from source below.
Similar to TA-Lib, the Function API provides a lightweight wrapper of the exposed TA-Lib indicators.
Each function returns an output array and has default values for their
parameters, unless specified as keyword arguments. Typically, these functions
will have an initial "lookback" period (a required number of observations
before an output is generated) set to NaN.
The lookback is function-specific and does not always match the value passed
to timeperiod. For example, RSI(timeperiod=14) needs 15 price observations
because the first RSI value depends on 14 price changes between consecutive
bars, not just 14 raw prices.
For convenience, the Function API supports both numpy.ndarray and
pandas.Series and polars.Series inputs.
All of the following examples use the Function API:
import numpy as np
import talib
close = np.random.random(100)Calculate a simple moving average of the close prices:
output = talib.SMA(close)Calculating bollinger bands, with triple exponential moving average:
from talib import MA_Type
upper, middle, lower = talib.BBANDS(close, matype=MA_Type.T3)Calculating momentum of the close prices, with a time period of 5:
output = talib.MOM(close, timeperiod=5)Functions marked in the docs as having an unstable period start with that
extra unstable-period setting at 0. In other words, get_unstable_period()
returns 0 until you explicitly change it with set_unstable_period().
Instead of a count, set_unstable_period() also takes an Auto level. With
talib.set_unstable_period('ALL', talib.UNSTABLE_AUTO_PREC_4) each function
works out how many leading values to discard, so that the first 4 significant
digits of what it returns no longer depend on where your data starts;
UNSTABLE_AUTO_PREC_8 targets 8. get_unstable_period() then returns the
level. See Unstable Period.
The underlying TA-Lib C library handles NaN's in a sometimes surprising manner by typically propagating NaN's to the end of the output, for example:
>>> c = np.array([1.0, 2.0, 3.0, np.nan, 4.0, 5.0, 6.0])
>>> talib.SMA(c, 3)
array([nan, nan, 2., nan, nan, nan, nan])You can compare that to a Pandas rolling mean, where their approach is to output NaN until enough "lookback" values are observed to generate new outputs:
>>> c = pandas.Series([1.0, 2.0, 3.0, np.nan, 4.0, 5.0, 6.0])
>>> c.rolling(3).mean()
0 NaN
1 NaN
2 2.0
3 NaN
4 NaN
5 NaN
6 5.0
dtype: float64If you're already familiar with using the function API, you should feel right at home using the Abstract API.
Every function takes a collection of named inputs, either a dict of
numpy.ndarray or pandas.Series or polars.Series, or a
pandas.DataFrame or polars.DataFrame. If a pandas.DataFrame or
polars.DataFrame is provided, the output is returned as the same type
with named output columns.
For example, inputs could be provided for the typical "OHLCV" data:
import numpy as np
# note that all ndarrays must be the same length!
inputs = {
'open': np.random.random(100),
'high': np.random.random(100),
'low': np.random.random(100),
'close': np.random.random(100),
'volume': np.random.random(100)
}Functions can either be imported directly or instantiated by name:
from talib import abstract
# directly
SMA = abstract.SMA
# or by name
SMA = abstract.Function('sma')From there, calling functions is basically the same as the function API:
from talib.abstract import *
# uses close prices (default)
output = SMA(inputs, timeperiod=25)
# uses open prices
output = SMA(inputs, timeperiod=25, price='open')
# uses close prices (default)
upper, middle, lower = BBANDS(inputs, 20, 2.0, 2.0)
# uses high, low, close (default)
slowk, slowd = STOCH(inputs, 5, 3, 0, 3, 0) # uses high, low, close by default
# uses high, low, open instead
slowk, slowd = STOCH(inputs, 5, 3, 0, 3, 0, prices=['high', 'low', 'open'])The Streaming API keeps a handle per indicator instead of recomputing from the whole array. Opening one costs a pass over the history; every bar after that is O(1), and each value it produces is identical to the one the Function API reports for that bar. On Apple Silicon macOS, a function using a transcendental math function (SIN, EXP, LN, ...) may differ from it in the last bits.
import talib
from talib import stream
# the Function API: the whole series, from the whole array
output = talib.SMA(close)
# the Streaming API: a handle, positioned at the end of the history
s = stream.SMA(close)
assert s.value == output[-1]
for price in feed:
latest = s.update(price) # one closed bar in, its value out
s.peek(forming) # what update would return, committing nothing
fork = s.copy() # an independent handle at the same barstream.SMA takes exactly the arguments talib.SMA takes. A single-output
function answers with a float (an int where the Function API returns an
integer array); a multi-output one with the same tuple the Function API returns:
m = stream.MACD(close)
macd, macdsignal, macdhist = m.update(price)
m.value[2] # the histogram, last bar
abstract.Function('MACD').output_names # ['macd', 'macdsignal', 'macdhist']Opening needs at least lookback + 1 bars, which abstract knows, and a little
more where a function's seeding does -- so rather than computing the number,
treat a short history as "not yet":
from talib import abstract
need = abstract.Function('RSI', timeperiod=14).lookback + 1 # 15, usually enough
try:
s = stream.RSI(history, timeperiod=14)
except talib.InsufficientHistory:
... # collect more barsLeading bars that are NaN in any input are not history. They are skipped, as the Function API skips them, and do not count toward the warm-up. A NaN or an infinity anywhere else in the history is undefined behaviour in TA-Lib C, and for a few window functions a handle and the Function API do then disagree.
A bar that is not finite is likewise rejected: update raises and the handle is
left exactly as it was, neither its value nor its range moved. For a bar you
mean to skip rather than re-feed, say so with advance(), or two handles on one
feed drift a bar apart.
If you want the series over the history as well, one pass gives both:
s, rsi = stream.RSI.open_and_fill(history, timeperiod=14) # rsi == talib.RSI(history)A handle also reports the range it has an output for, in the input series' coordinates, and can be told about a bar it was not fed:
s.out_range # (begidx, nbelement), as the Function API's output
s.advance() # count a skipped bar: the range moves, the value holdsA handle points into the TA-Lib C library, so it cannot be pickled or shared with another process. Keep the history and re-open instead.
TA-Lib supports both regular and free-threaded CPython. Native calculations, including stream opening, updates, reads and cloning, release the GIL on regular CPython. Python argument conversion, array allocation and result construction still require Python thread state. Independent calculations run concurrently; operations on the same stream handle use a per-handle mutex.
Inputs must remain unchanged during a call: do not write to or resize an input array from another thread. Calls allocate their own output arrays.
Settings are process-wide. Set unstable periods, compatibility and candle
settings before starting calculations or opening streams. Changing settings
while a calculation is active or any stream is alive raises RuntimeError.
After calls finish and all streams (including copies) are released, settings
can be changed again. The settings gate protects lookback calculation, output
allocation and computation together, while allowing simultaneous readers.
The synchronization covers calls through this Python extension; other code calling the same C library directly must observe TA-Lib's settings and lifecycle contract too. Separate subinterpreters are not supported.
Free-threaded Python requires a matching free-threaded extension build and compatible dependencies. Importing TA-Lib does not enable the GIL in that build.
Checkout the sources and build them yourself:
python -m pip install .Starting with version 0.8.3, source builds download the pinned TA-Lib C release, verify its checksum, and build and statically link it into the Python extension. This requires network access, a C compiler and CMake. On Windows, source builds require the Microsoft C++ Build Tools. CMake is installed automatically when using pip's default build isolation.
To use an existing TA-Lib C installation instead, set TA_INCLUDE_PATH or
TA_LIBRARY_PATH before building. Setting either variable disables the
bundled C build, including its download; if only one is set, the other uses
the standard search paths. These variables accept multiple directories
separated by os.pathsep (: on Unix, ; on Windows). They apply to
source builds, not prebuilt wheels.
To install the TA-Lib C library yourself, follow its installation directions. On macOS, for example, to link a source build against the Homebrew installation, set:
export TA_INCLUDE_PATH="$(brew --prefix ta-lib)/include"
export TA_LIBRARY_PATH="$(brew --prefix ta-lib)/lib"Some Conda Forge users have reported success installing the underlying TA-Lib C library using the libta-lib package:
$ conda install -c conda-forge libta-liband then point the two variables above at its
includeandlib.
If you installed the underlying TA-Lib library with a custom prefix
(e.g., with ./configure --prefix=$PREFIX), then when you go to install
this Python wrapper you can select that installation instead of the bundled
build using the TA_LIBRARY_PATH and TA_INCLUDE_PATH environment variables:
export TA_LIBRARY_PATH=$PREFIX/lib
export TA_INCLUDE_PATH=$PREFIX/include
python -m pip install --no-binary=TA-Lib TA-LibSometimes installation will produce build errors like this:
talib/_ta_lib.c:601:10: fatal error: ta-lib/ta_defs.h: No such file or directory
601 | #include "ta-lib/ta_defs.h"
| ^~~~~~~~~~~~~~~~~~
compilation terminated.or:
common.obj : error LNK2001: unresolved external symbol TA_SetUnstablePeriod
common.obj : error LNK2001: unresolved external symbol TA_Shutdown
common.obj : error LNK2001: unresolved external symbol TA_Initialize
common.obj : error LNK2001: unresolved external symbol TA_GetUnstablePeriod
common.obj : error LNK2001: unresolved external symbol TA_GetVersionStringWhen using TA_INCLUDE_PATH or TA_LIBRARY_PATH, check that they point
to the headers and libraries of a compatible TA-Lib C installation. On Windows,
the library architecture must match Python (for example, a 64-bit Python needs
a 64-bit TA-Lib C library).
Sometimes installation will fail with errors like this:
talib/common.c:8:22: fatal error: pyconfig.h: No such file or directory
#include "pyconfig.h"
^
compilation terminated.
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1This typically means that you need the Python headers, and should run something like:
sudo apt-get install python3-devIf you get an error on macOS like this:
code signature in <141BC883-189B-322C-AE90-CBF6B5206F67>
'python3.9/site-packages/talib/_ta_lib.cpython-39-darwin.so' not valid for
use in process: Trying to load an unsigned library)You might look at this question
and use xcrun codesign to fix it.
If the build appears to hang, you might be running on a VM with not enough memory - try 1 GB or 2 GB.
It has also been reported that using a swapfile could help, for example:
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfileIf you get "permission denied" errors such as this, you might need to give your user access to the location where the underlying TA-Lib C library is installed -- or install it to a user-accessible location.
talib/_ta_lib.c:747:28: fatal error: /usr/include/ta-lib/ta_defs.h: Permission denied
#include "ta-lib/ta-defs.h"
^
compilation terminated
error: command 'gcc' failed with exit status 1If you're having trouble using PyInstaller and get an error that looks like this:
...site-packages\PyInstaller\loader\pyimod03_importers.py", line 493, in exec_module
exec(bytecode, module.__dict__)
File "talib\__init__.py", line 72, in <module>
ModuleNotFoundError: No module named 'talib.stream'Then, perhaps you can use the --hidden-import argument to fix this:
pyinstaller --hidden-import talib.stream "replaceToYourFileName.py"If you want to use numpy<2, then you should use ta-lib<0.5.
If you want to use numpy>=2, then you should use ta-lib>=0.5.
We can show all the TA functions supported by TA-Lib, either as a list or
as a dict sorted by group (e.g. "Overlap Studies", "Momentum Indicators",
etc):
import talib
# list of functions
for name in talib.get_functions():
print(name)
# dict of functions by group
for group, names in talib.get_function_groups().items():
print(group)
for name in names:
print(f" {name}")- Overlap Studies
- Momentum Indicators
- Volume Indicators
- Cycle Indicators
- Price Transform
- Volatility Indicators
- Pattern Recognition
- Statistic Functions
- Math Transform
- Math Operators
ACCBANDS Acceleration Bands
ALMA Arnaud Legoux Moving Average
BBANDS Bollinger Bands
CKSP Chande Kroll Stop
DEMA Double Exponential Moving Average
DONCHIAN Donchian Channels
EMA Exponential Moving Average
FRAMA Fractal Adaptive Moving Average
HMA Hull Moving Average
HT_TRENDLINE Hilbert Transform - Instantaneous Trendline
ICHIMOKU Ichimoku Kinko Hyo
KAMA Kaufman Adaptive Moving Average
KC Keltner Channels
MA Moving average
MAMA MESA Adaptive Moving Average
MAVP Moving average with variable period
MCGD McGinley Dynamic
MIDPOINT MidPoint over period
MIDPRICE Midpoint Price over period
RMA Wilder's Smoothed Moving Average
SAR Parabolic SAR
SAREXT Parabolic SAR - Extended
SMA Simple Moving Average
SUPERTREND SuperTrend
SWAK_BUTTER Swiss Army Knife - Butterworth Filter
SWAK_GAUSS Swiss Army Knife - Gaussian Filter
T3 Triple Exponential Moving Average (T3)
TEMA Triple Exponential Moving Average
TRIMA Triangular Moving Average
VIDYA Variable Index Dynamic Average
VWMA Volume Weighted Moving Average
WMA Weighted Moving Average
ZIGZAG Zig Zag
ZLEMA Zero-Lag Exponential Moving Average
AC Accelerator/Decelerator Oscillator
ADX Average Directional Movement Index
ADXR Average Directional Movement Index Rating
AO Awesome Oscillator
APO Absolute Price Oscillator
AROON Aroon
AROONOSC Aroon Oscillator
ASI Wilder Accumulative Swing Index
BOP Balance Of Power
CCI Commodity Channel Index
CG Center of Gravity Oscillator
CHOP Choppiness Index
CHOPTR Choppiness Index (True Range Box)
CMO Chande Momentum Oscillator
CMOU Chande Momentum Oscillator (Unsmoothed)
COPPOCK Coppock Curve
CRSI Connors Relative Strength Index
CTI Correlation Trend Indicator
DOSC Derivative Oscillator
DPO Detrended Price Oscillator
DX Directional Movement Index
ER Kaufman Efficiency Ratio
ERI Elder Ray Index (Bull Power / Bear Power)
FISHER Fisher Transform
FOSC Forecast Oscillator
FRACTAL Williams Fractal
IBS Internal Bar Strength
IMI Intraday Momentum Index
KDJ KDJ Stochastic
KST Know Sure Thing (Pring)
KSTEXT Know Sure Thing with controllable MA type
MACD Moving Average Convergence/Divergence
MACDEXT MACD with controllable MA type
MACDFIX Moving Average Convergence/Divergence Fix 12/26
MFI Money Flow Index
MINUS_DI Minus Directional Indicator
MINUS_DM Minus Directional Movement
MOM Momentum
PLUS_DI Plus Directional Indicator
PLUS_DM Plus Directional Movement
PPO Percentage Price Oscillator
PSO Premier Stochastic Oscillator
QSTICK Qstick
ROC Rate of change : ((price/prevPrice)-1)*100
ROCP Rate of change Percentage: (price-prevPrice)/prevPrice
ROCR Rate of change ratio: (price/prevPrice)
ROCR100 Rate of change ratio 100 scale: (price/prevPrice)*100
RSI Relative Strength Index
SI Wilder Swing Index
SMI Stochastic Momentum Index
SQZMOM Squeeze Momentum and Level
STC Schaff Trend Cycle
STOCH Stochastic
STOCHF Stochastic Fast
STOCHRSI Stochastic Relative Strength Index
TRIX 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA
TSI True Strength Index
ULTOSC Ultimate Oscillator
VHF Vertical Horizontal Filter
VORTEX Vortex Indicator
WAD Williams' Accumulation/Distribution
WAVETREND WaveTrend Oscillator
WILLR Williams' %R
AD Chaikin A/D Line
ADOSC Chaikin A/D Oscillator
CMF Chaikin Money Flow
EFI Elder's Force Index
EMV Arms Ease of Movement
KVO Klinger Volume Oscillator
MARKETFI Market Facilitation Index
NVI Negative Volume Index
OBV On Balance Volume
PVI Positive Volume Index
PVO Percentage Volume Oscillator
PVT Price Volume Trend
RVOL Relative Volume
VWAP Volume Weighted Average Price
HT_DCPERIOD Hilbert Transform - Dominant Cycle Period
HT_DCPHASE Hilbert Transform - Dominant Cycle Phase
HT_PHASOR Hilbert Transform - Phasor Components
HT_SINE Hilbert Transform - SineWave
HT_TRENDMODE Hilbert Transform - Trend vs Cycle Mode
SWAK_2PHP Swiss Army Knife - Two-Pole High-Pass Filter
SWAK_BP Swiss Army Knife - Band-Pass Filter
SWAK_HP Swiss Army Knife - High-Pass Filter
AVGDEV Average Deviation
AVGPRICE Average Price
HA Heikin-Ashi Candles
MEDPRICE Median Price
TYPPRICE Typical Price
WCLPRICE Weighted Close Price
ADR Average Day Range
ATR Average True Range
BBW Bollinger BandWidth
CVI Chaikin's Volatility
MASSI Mass Index
NATR Normalized Average True Range
PERCENTB Bollinger Bands %B
ROGERSSATCHELL Rogers-Satchell Volatility
RVI Relative Volatility Index
RVIR Relative Volatility Index, refined high/low form
TRANGE True Range
CDL2CROWS Two Crows
CDL3BLACKCROWS Three Black Crows
CDL3INSIDE Three Inside Up/Down
CDL3LINESTRIKE Three-Line Strike
CDL3OUTSIDE Three Outside Up/Down
CDL3STARSINSOUTH Three Stars In The South
CDL3WHITESOLDIERS Three Advancing White Soldiers
CDLABANDONEDBABY Abandoned Baby
CDLADVANCEBLOCK Advance Block
CDLBELTHOLD Belt-hold
CDLBREAKAWAY Breakaway
CDLCLOSINGMARUBOZU Closing Marubozu
CDLCONCEALBABYSWALL Concealing Baby Swallow
CDLCOUNTERATTACK Counterattack
CDLDARKCLOUDCOVER Dark Cloud Cover
CDLDOJI Doji
CDLDOJISTAR Doji Star
CDLDRAGONFLYDOJI Dragonfly Doji
CDLENGULFING Engulfing Pattern
CDLEVENINGDOJISTAR Evening Doji Star
CDLEVENINGSTAR Evening Star
CDLGAPSIDESIDEWHITE Up/Down-gap side-by-side white lines
CDLGRAVESTONEDOJI Gravestone Doji
CDLHAMMER Hammer
CDLHANGINGMAN Hanging Man
CDLHARAMI Harami Pattern
CDLHARAMICROSS Harami Cross Pattern
CDLHIGHWAVE High-Wave Candle
CDLHIKKAKE Hikkake Pattern
CDLHIKKAKEMOD Modified Hikkake Pattern
CDLHOMINGPIGEON Homing Pigeon
CDLIDENTICAL3CROWS Identical Three Crows
CDLINNECK In-Neck Pattern
CDLINVERTEDHAMMER Inverted Hammer
CDLKICKING Kicking
CDLKICKINGBYLENGTH Kicking - bull/bear determined by the longer marubozu
CDLLADDERBOTTOM Ladder Bottom
CDLLONGLEGGEDDOJI Long Legged Doji
CDLLONGLINE Long Line Candle
CDLMARUBOZU Marubozu
CDLMATCHINGLOW Matching Low
CDLMATHOLD Mat Hold
CDLMORNINGDOJISTAR Morning Doji Star
CDLMORNINGSTAR Morning Star
CDLONNECK On-Neck Pattern
CDLPIERCING Piercing Pattern
CDLRICKSHAWMAN Rickshaw Man
CDLRISEFALL3METHODS Rising/Falling Three Methods
CDLSEPARATINGLINES Separating Lines
CDLSHOOTINGSTAR Shooting Star
CDLSHORTLINE Short Line Candle
CDLSPINNINGTOP Spinning Top
CDLSTALLEDPATTERN Stalled Pattern
CDLSTICKSANDWICH Stick Sandwich
CDLTAKURI Takuri (Dragonfly Doji with very long lower shadow)
CDLTASUKIGAP Tasuki Gap
CDLTHRUSTING Thrusting Pattern
CDLTRISTAR Tristar Pattern
CDLUNIQUE3RIVER Unique 3 River
CDLUPSIDEGAP2CROWS Upside Gap Two Crows
CDLXSIDEGAP3METHODS Upside/Downside Gap Three Methods
BETA Beta
CORREL Pearson's Correlation Coefficient (r)
KURTOSIS Rolling Excess Kurtosis
LINEARREG Linear Regression
LINEARREG_ANGLE Linear Regression Angle
LINEARREG_INTERCEPT Linear Regression Intercept
LINEARREG_SLOPE Linear Regression Slope
MEDIAN Rolling Median
PERCENTILE Percentile (nearest rank)
PERCENTRANK Percent Rank
STDDEV Standard Deviation
TSF Time Series Forecast
VAR Variance
ACOS Vector Trigonometric ACos
ASIN Vector Trigonometric ASin
ATAN Vector Trigonometric ATan
CEIL Vector Ceil
COS Vector Trigonometric Cos
COSH Vector Trigonometric Cosh
EXP Vector Arithmetic Exp
FLOOR Vector Floor
LN Vector Log Natural
LOG10 Vector Log10
SIN Vector Trigonometric Sin
SINH Vector Trigonometric Sinh
SQRT Vector Square Root
TAN Vector Trigonometric Tan
TANH Vector Trigonometric Tanh
ADD Vector Arithmetic Add
CUMSUM Cumulative Sum
DIV Vector Arithmetic Div
MAX Highest value over a specified period
MAXINDEX Index of highest value over a specified period
MIN Lowest value over a specified period
MININDEX Index of lowest value over a specified period
MINMAX Lowest and highest values over a specified period
MINMAXINDEX Indexes of lowest and highest values over a specified period
MULT Vector Arithmetic Mult
SUB Vector Arithmetic Subtraction
SUM Summation