← Back to Libraries
TA-Lib Library
Industry-standard technical analysis library with 150+ indicators and pattern recognition. Fast C implementation for high-performance calculations.
Difficulty: Beginner
Category: Indicators
Installation
# Windows (use pre-built wheel)
Download from: https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib
$ pip install TA_Lib‑0.4.24‑cp39‑cp39‑win_amd64.whl
Note: TA-Lib requires compilation on Windows. Use pre-built wheels for easier installation.
150+ Available Indicators
Overlap Studies
SMAEMAWMADEMATEMAKAMAMAMAT3BBANDSSAR
Momentum
RSIMACDSTOCHSTOCHFSTOCHRSICCICMOMOMROCWILLR
Volume
ADADOSCOBV
Volatility
ATRNATRTRANGE
Pattern Recognition
CDL2CROWSCDL3BLACKCROWSCDLDOJICDLENGULFINGCDLHAMMERCDLMORNINGSTAR
Code Examples
Installation (Windows)
Install TA-Lib on Windows using pre-built wheel
Python
# Download wheel from: https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib
# Choose the correct version for your Python (e.g., TA_Lib‑0.4.24‑cp39‑cp39‑win_amd64.whl)
# Install the downloaded wheel
pip install TA_Lib‑0.4.24‑cp39‑cp39‑win_amd64.whl
# Verify installation
python -c "import talib; print(talib.__version__)"
Basic Indicators
Calculate SMA, EMA, and RSI
Python
import talib
import numpy as np
import yfinance as yf
# Get data
df = yf.download("EURUSD=X", period="1y")
close = df['Close'].values
# Simple Moving Average
sma_20 = talib.SMA(close, timeperiod=20)
sma_50 = talib.SMA(close, timeperiod=50)
# Exponential Moving Average
ema_12 = talib.EMA(close, timeperiod=12)
ema_26 = talib.EMA(close, timeperiod=26)
# RSI
rsi = talib.RSI(close, timeperiod=14)
print(f"Latest SMA(20): {sma_20[-1]:.5f}")
print(f"Latest RSI: {rsi[-1]:.2f}")
MACD Indicator
Calculate MACD with signal and histogram
Python
import talib
# MACD returns three arrays: macd, signal, histogram
macd, signal, hist = talib.MACD(close,
fastperiod=12,
slowperiod=26,
signalperiod=9)
# Generate trading signals
buy_signals = (macd > signal) & (macd.shift(1) <= signal.shift(1))
sell_signals = (macd < signal) & (macd.shift(1) >= signal.shift(1))
print(f"MACD: {macd[-1]:.5f}")
print(f"Signal: {signal[-1]:.5f}")
print(f"Histogram: {hist[-1]:.5f}")
Bollinger Bands
Calculate Bollinger Bands with multiple deviations
Python
import talib
# Bollinger Bands
upper, middle, lower = talib.BBANDS(close,
timeperiod=20,
nbdevup=2,
nbdevdn=2,
matype=0)
# Calculate bandwidth
bandwidth = (upper - lower) / middle
# Identify squeeze (low volatility)
squeeze = bandwidth < bandwidth.rolling(50).mean() * 0.5
print(f"Upper Band: {upper[-1]:.5f}")
print(f"Middle Band: {middle[-1]:.5f}")
print(f"Lower Band: {lower[-1]:.5f}")
print(f"Bandwidth: {bandwidth[-1]:.4f}")
Stochastic Oscillator
Calculate Stochastic %K and %D
Python
import talib
high = df['High'].values
low = df['Low'].values
close = df['Close'].values
# Stochastic
slowk, slowd = talib.STOCH(high, low, close,
fastk_period=14,
slowk_period=3,
slowk_matype=0,
slowd_period=3,
slowd_matype=0)
# Generate signals
overbought = slowk > 80
oversold = slowk < 20
print(f"Stochastic %K: {slowk[-1]:.2f}")
print(f"Stochastic %D: {slowd[-1]:.2f}")
Average True Range (ATR)
Measure volatility with ATR
Python
import talib
high = df['High'].values
low = df['Low'].values
close = df['Close'].values
# ATR
atr = talib.ATR(high, low, close, timeperiod=14)
# Use ATR for position sizing
risk_per_trade = 0.02 # 2% risk
account_balance = 10000
sl_multiplier = 2 # Stop loss at 2 ATR
position_size = (account_balance * risk_per_trade) / (atr[-1] * sl_multiplier)
print(f"ATR: {atr[-1]:.5f}")
print(f"Suggested Position Size: {position_size:.2f} lots")
Candlestick Pattern Recognition
Detect candlestick patterns automatically
Python
import talib
open_prices = df['Open'].values
high = df['High'].values
low = df['Low'].values
close = df['Close'].values
# Detect various patterns
doji = talib.CDLDOJI(open_prices, high, low, close)
hammer = talib.CDLHAMMER(open_prices, high, low, close)
engulfing = talib.CDLENGULFING(open_prices, high, low, close)
morning_star = talib.CDLMORNINGSTAR(open_prices, high, low, close)
# Check latest patterns
patterns = {
'Doji': doji[-1],
'Hammer': hammer[-1],
'Engulfing': engulfing[-1],
'Morning Star': morning_star[-1]
}
for pattern, value in patterns.items():
if value != 0:
signal = "Bullish" if value > 0 else "Bearish"
print(f"{pattern}: {signal}")
Complete Trading System
Combine multiple indicators for trading signals
Python
import talib
import yfinance as yf
import pandas as pd
# Get data
df = yf.download("EURUSD=X", period="1y")
# Extract OHLC
open_p = df['Open'].values
high = df['High'].values
low = df['Low'].values
close = df['Close'].values
# Calculate indicators
sma_50 = talib.SMA(close, 50)
sma_200 = talib.SMA(close, 200)
rsi = talib.RSI(close, 14)
macd, signal, hist = talib.MACD(close)
atr = talib.ATR(high, low, close, 14)
# Create signals DataFrame
df['SMA_50'] = sma_50
df['SMA_200'] = sma_200
df['RSI'] = rsi
df['MACD'] = macd
df['Signal'] = signal
df['ATR'] = atr
# Generate trading signals
df['Trade_Signal'] = 0
# Buy conditions: SMA crossover + RSI not overbought + MACD bullish
buy_condition = (
(df['SMA_50'] > df['SMA_200']) &
(df['RSI'] < 70) &
(df['MACD'] > df['Signal'])
)
# Sell conditions
sell_condition = (
(df['SMA_50'] < df['SMA_200']) |
(df['RSI'] > 70) |
(df['MACD'] < df['Signal'])
)
df.loc[buy_condition, 'Trade_Signal'] = 1
df.loc[sell_condition, 'Trade_Signal'] = -1
# Calculate position sizing using ATR
df['Position_Size'] = (10000 * 0.02) / (df['ATR'] * 2)
print(df[['Close', 'SMA_50', 'RSI', 'MACD', 'Trade_Signal', 'Position_Size']].tail())
Best Practices
Use NumPy Arrays
TA-Lib requires NumPy arrays, not pandas Series
Handle NaN Values
Indicators return NaN for initial periods, handle appropriately
Installation Challenges
Use pre-built wheels on Windows to avoid compilation issues
Performance
While fast, consider pandas-ta for pure Python alternative