← Back to list
💰

pandas-ta Checked

Technical analysis with 130+ indicators using pandas-ta for crypto market data
💰 Finance & Trading skills By agiprolabs Version v1.0.0 Added 2026-09-20 Updated 2026-09-20 Source ↗
8.2Overall rating
2Views
9Downloads
366Stars

Installation

🤖 Install via AI

Copy the prompt below and send it to your AI assistant (e.g. Claude Code) — it will follow the instructions and install automatically.

Install the "pandas-ta" skill by following the instructions at https://skill123.me/install/pandas-ta.
⌨️ Command line install

Run in your terminal — downloads and installs to ~/.claude/skills/.

curl -fsSL https://skill123.me/install/pandas-ta.sh | bash
📦 Download ZIP

Download the zip and extract it into your skills directory (e.g. ~/.claude/skills/), then restart your session.

⬇ Download v1.0.0 · 24 KB
📊 Static rating
8.2/10
Trigger
5.5
Structure
8.7
Workflow
8.4
Content
9.0
Engineering
10.0
Security
9.0

Six-dimension rubric with reviewer rationale.

View scorecard ↓
🛡 Dynamic test
—

Not live-tested yet — this skill is rated on static analysis only.

About this skill

Technical analysis with 130+ indicators using pandas-ta for crypto market data

pandas-ta — Technical Analysis for Crypto Markets

pandas-ta is a Python library that extends pandas DataFrames with 130+ technical analysis indicators accessible via df.ta. It covers trend, momentum, volatility, volume, and overlap indicator categories — all callable with a single method on any OHLCV DataFrame.

Documentation

Technical analysis with 130+ indicators using pandas-ta for crypto market data

pandas-ta — Technical Analysis for Crypto Markets

pandas-ta is a Python library that extends pandas DataFrames with 130+ technical analysis indicators accessible via df.ta. It covers trend, momentum, volatility, volume, and overlap indicator categories — all callable with a single method on any OHLCV DataFrame.

Installation


uv pip install pandas-ta pandas httpx

Quick Start


import pandas as pd
import pandas_ta as ta

# Assume df is a DataFrame with columns: open, high, low, close, volume
# All lowercase column names required

# Single indicator
df["rsi"] = df.ta.rsi(length=14)
df["atr"] = df.ta.atr(length=14)

# Multiple indicators via strategy
df.ta.strategy(ta.Strategy(
    name="Quick Check",
    ta=[
        {"kind": "rsi", "length": 14},
        {"kind": "macd", "fast": 12, "slow": 26, "signal": 9},
        {"kind": "bbands", "length": 20, "std": 2.0},
    ]
))

OHLCV DataFrame Format

pandas-ta expects a DataFrame with lowercase column names:


import pandas as pd

df = pd.DataFrame({
    "open": [...],
    "high": [...],
    "low": [...],
    "close": [...],
    "volume": [...]
}, index=pd.DatetimeIndex([...]))

**Important**: Set the index to a DatetimeIndex for time-aware indicators like VWAP. Column names must be lowercase (close, not Close).

### Handling Missing Data


# Drop rows with NaN in OHLCV columns
df = df.dropna(subset=["open", "high", "low", "close", "volume"])

# Forward-fill small gaps (1-2 bars max)
df = df.ffill(limit=2)

# Verify no zero-volume bars for volume indicators
df = df[df["volume"] > 0]

Core Indicator Categories

### Trend Indicators

Identify market direction and trend strength.

| Indicator | Call | Key Signal |

|-----------|------|------------|

| SMA | df.ta.sma(length=20) | Price above = bullish |

| EMA | df.ta.ema(length=20) | Faster than SMA, less lag |

| SuperTrend | df.ta.supertrend(length=10, multiplier=3) | Direction column: 1=bull, -1=bear |

| Ichimoku | df.ta.ichimoku() | Returns tuple of (span, lines) DataFrames |

| VWMA | df.ta.vwma(length=20) | Volume-weighted price trend |

| HMA | df.ta.hma(length=20) | Minimal lag, smooth trend |

| ADX | df.ta.adx(length=14) | >25 = trending, <20 = ranging |

### Momentum Indicators

Measure speed and magnitude of price changes.

| Indicator | Call | Key Signal |

|-----------|------|------------|

| RSI | df.ta.rsi(length=14) | >70 overbought, <30 oversold |

| MACD | df.ta.macd(fast=12, slow=26, signal=9) | Histogram crossover = entry |

| Stochastic | df.ta.stoch(k=14, d=3, smooth_k=3) | >80 overbought, <20 oversold |

| CCI | df.ta.cci(length=20) | >100 overbought, <-100 oversold |

| Williams %R | df.ta.willr(length=14) | >-20 overbought, <-80 oversold |

| ROC | df.ta.roc(length=10) | Positive = upward momentum |

| MFI | df.ta.mfi(length=14) | Money flow version of RSI |

View full documentation

### Volatility Indicators

Measure price dispersion and expected range.

| Indicator | Call | Key Signal |

|-----------|------|------------|

| Bollinger Bands | df.ta.bbands(length=20, std=2) | Squeeze = breakout pending |

| ATR | df.ta.atr(length=14) | Position sizing, stop placement |

| Keltner Channels | df.ta.kc(length=20, scalar=1.5) | BB inside KC = squeeze |

| Donchian Channels | df.ta.donchian(lower_length=20, upper_length=20) | Breakout detection |

### Volume Indicators

Confirm price moves with volume analysis.

| Indicator | Call | Key Signal |

|-----------|------|------------|

| OBV | df.ta.obv() | Divergence from price = reversal |

| VWAP | df.ta.vwap() | Intraday fair value (needs DatetimeIndex) |

| CMF | df.ta.cmf(length=20) | >0 accumulation, <0 distribution |

| AD | df.ta.ad() | Accumulation/Distribution line |

Strategy Class

Run multiple indicators in a single call using ta.Strategy:


import pandas_ta as ta

# Built-in "All" strategy runs every indicator
df.ta.strategy(ta.AllStrategy)

# Custom strategy
my_strategy = ta.Strategy(
    name="Crypto Scalp",
    description="Fast indicators for crypto scalping",
    ta=[
        {"kind": "ema", "length": 9},
        {"kind": "ema", "length": 21},
        {"kind": "rsi", "length": 7},
        {"kind": "stoch", "k": 5, "d": 3, "smooth_k": 3},
        {"kind": "atr", "length": 7},
        {"kind": "bbands", "length": 10, "std": 2.0},
        {"kind": "obv"},
    ]
)
df.ta.strategy(my_strategy)

### Named Strategy Patterns


# Trend following
trend_strategy = ta.Strategy(
    name="Trend",
    ta=[
        {"kind": "ema", "length": 20},
        {"kind": "ema", "length": 50},
        {"kind": "adx", "length": 14},
        {"kind": "supertrend", "length": 10, "multiplier": 3},
        {"kind": "atr", "length": 14},
    ]
)

# Mean reversion
reversion_strategy = ta.Strategy(
    name="Mean Reversion",
    ta=[
        {"kind": "rsi", "length": 14},
        {"kind": "bbands", "length": 20, "std": 2.0},
        {"kind": "stoch", "k": 14, "d": 3, "smooth_k": 3},
        {"kind": "cci", "length": 20},
    ]
)

# Momentum
momentum_strategy = ta.Strategy(
    name="Momentum",
    ta=[
        {"kind": "macd", "fast": 12, "slow": 26, "signal": 9},
        {"kind": "rsi", "length": 14},
        {"kind": "obv"},
        {"kind": "roc", "length": 10},
        {"kind": "mfi", "length": 14},
    ]
)

Crypto-Specific Considerations

### 24/7 Markets

  • No session gaps — indicators that rely on open/close of sessions behave differently
  • VWAP resets at midnight UTC by default; consider anchored VWAP for custom periods
  • Weekend data is continuous — no Monday gap effects

### High Volatility Adjustments

  • **Bollinger Bands**: Use 2.5-3x standard deviation instead of the default 2x
  • **RSI periods**: Shorter periods (7-10) capture faster crypto cycles
  • **ATR**: Use for dynamic stop-losses; crypto ATR is typically 2-5x equity ATR
  • **SuperTrend multiplier**: 3-4x for crypto vs 2-3x for equities

### Low-Cap Token Considerations

  • Volume indicators (OBV, CMF, MFI) are unreliable with thin order books
  • Prefer price-based indicators (RSI, BBands, SuperTrend) for low-liquidity tokens
  • ATR-based position sizing is critical — wide spreads amplify losses
  • Wash trading inflates volume; cross-reference with on-chain data

### Timeframe Selection

| Timeframe | Use Case | Recommended Indicators |

|-----------|----------|----------------------|

| 1m-5m | Scalping, PumpFun | RSI(5-7), EMA(5,13), ATR(5) |

| 15m-1h | Day trading | MACD, RSI(14), BBands, EMA(20,50) |

| 4h-1d | Swing trading | SuperTrend, ADX, EMA(50,200) |

| 1w | Position trading | SMA(20,50), RSI(14), monthly VWAP |

Common Indicator Combinations

### Trend Following


# EMA crossover + ADX confirmation + SuperTrend direction
ema_fast = df.ta.ema(length=20)
ema_slow = df.ta.ema(length=50)
adx_df = df.ta.adx(length=14)
st_df = df.ta.supertrend(length=10, multiplier=3)

bullish = (
    (ema_fast > ema_slow) &
    (adx_df["ADX_14"] > 25) &
    (st_df["SUPERTd_10_3.0"] == 1)
)

### Mean Reversion


# RSI oversold + price at lower BB + Stochastic oversold
rsi = df.ta.rsi(length=14)
bb = df.ta.bbands(length=20, std=2.5)
stoch = df.ta.stoch(k=14, d=3, smooth_k=3)

buy_signal = (
    (rsi < 30) &
    (df["close"] <= bb["BBL_20_2.5"]) &
    (stoch["STOCHk_14_3_3"] < 20)
)

### Momentum Confirmation


# MACD histogram positive + RSI above 50 + OBV rising
macd = df.ta.macd(fast=12, slow=26, signal=9)
rsi = df.ta.rsi(length=14)
obv = df.ta.obv()

momentum_bull = (
    (macd["MACDh_12_26_9"] > 0) &
    (rsi > 50) &
    (obv > obv.shift(1))
)

### Volatility Breakout (BB Squeeze)


# Bollinger Band width contracting + volume spike
bb = df.ta.bbands(length=20, std=2.0)
atr = df.ta.atr(length=14)
vol_sma = df["volume"].rolling(20).mean()

bb_width = (bb["BBU_20_2.0"] - bb["BBL_20_2.0"]) / bb["BBM_20_2.0"]
squeeze = bb_width < bb_width.rolling(120).quantile(0.1)
vol_spike = df["volume"] > (vol_sma * 2.0)

breakou

Score breakdown

Trigger
5.5
Description states What (130+ indicators, pandas-ta, crypto) with good topic keywords but no Use-when, no boundary, no trigger-phrase variants.
Structure
8.7
292-line SKILL.md with three well-scoped references and two scripts, correctly classified and annotated; minor duplication between SKILL.md indicator tables and indicator_guide.md.
Workflow
8.4
Strong task design: copy-runnable indicator calls, missing-data handling code, named Strategy patterns, timeframe selection table, and pitfalls reference covering warmup NaN, look-ahead, and wash-trading traps; scripts offer demo mode (verification without network) and live mode; error paths in fetch (HTTPStatusError/RequestError handling).
Content
9.0
Concise imperative style; every snippet has concrete parameters; consistent tables.
Engineering
10.0
Frontmatter valid; shebangs present; dependencies and env vars (BIRDEYE_API_KEY, TOKEN_MINT) documented in script headers; all paths exist.
Security
9.0
6.0 manifest — network destination: https://public-api.birdeye.so only (official public market-data API, declared in usage); sends only API key header and token mint query (auth, not local data); no file writes, no credential-file reads, no persistence. Capabilities match declared scope. API key read from env, never hardcoded. Minor: no not-financial-advice disclaimer.
Well-executed tool-wrapper skill for pandas-ta technical analysis on crypto OHLCV data: indicator catalog with calls and signal thresholds, crypto-specific parameter adjustments, named strategy patterns, and an excellent common-pitfalls reference. Scripts default to synthetic demo mode with opt-in --live fetching from the official Birdeye API. Deductions: thin description (no When/When-Not); no financial disclaimer for signal-generating guidance.