Pratik Bhadane 53566b9d82 feat: expand rust parity, wasm exports, and api conformance
Move several hot Python analysis paths to Rust-backed helpers. This adds Rust implementations for backtest strategy signal generation and the core portfolio loop, options and futures payoff aggregation, Greeks aggregation, ratio calculation, trade extraction, chunked close-only indicator runs, and forward-fill helpers. Wire the Python analysis and data modules to prefer these paths, and add coverage for the new batch fast path.

Expand the WASM package to export WMA, ADX, and MFI from ferro_ta_core, refresh the Node examples, benchmarks, and README, and add a Node-vs-Python conformance test so the browser and node surface stays aligned with the main Python package.

Introduce a generated cross-surface API manifest in docs/, along with scripts to rebuild and verify it from source exports. Enforce manifest freshness in the Python and WASM CI workflows so release candidates catch surface drift before push.
2026-03-24 14:28:51 +05:30
2026-03-23 23:34:28 +05:30
2026-03-24 11:09:48 +05:30
2026-03-24 11:19:48 +05:30
2026-03-24 12:54:41 +05:30
2026-03-23 23:34:28 +05:30
2026-03-23 23:34:28 +05:30
2026-03-24 12:54:41 +05:30
2026-03-24 12:54:41 +05:30
2026-03-24 12:54:41 +05:30
2026-03-23 23:34:28 +05:30
2026-03-23 23:34:28 +05:30
2026-03-23 23:34:28 +05:30
2026-03-23 23:34:28 +05:30
2026-03-23 23:34:28 +05:30
2026-03-24 11:09:48 +05:30
2026-03-23 23:34:28 +05:30
2026-03-23 23:34:28 +05:30
2026-03-24 11:09:48 +05:30

ferro-ta

Rust-powered Python technical analysis with a TA-Lib-compatible API

Focused on one primary job: fast, reproducible technical analysis for Python users who want TA-Lib-style ergonomics without native build friction.

Binder Open in Colab Documentation


ferro-ta is a Rust-backed Python technical analysis library for NumPy-first workloads. It keeps TA-Lib-style ergonomics, ships pre-built wheels on supported targets, and publishes reproducible benchmark artifacts instead of blanket speed claims.

🚀 What ferro-ta is

TA-Lib ferro-ta
Primary product C-backed Python TA library Rust-backed Python TA library
API shape talib.SMA(close, 20) ferro_ta.SMA(close, 20)
Installation Often requires native/system setup Pre-built wheels on supported targets
Scope Technical indicators Technical indicators first; other tooling is optional and secondary

Benchmark evidence

The latest checked-in TA-Lib comparison artifact uses contiguous float64 arrays at 10k and 100k bars on an Apple M3 Max, CPython 3.13.5, and Rust 1.91.1.

  • ferro-ta is ahead outside the tie band on 6 of 12 indicators at both 10k and 100k bars.
  • Strong public wins in the latest 100k-bar artifact include SMA (2.28x), BBANDS (2.34x), MFI (3.04x), and WMA (2.39x).
  • TA-Lib still wins or ties on parts of the suite, including STOCH, ADX, and some current EMA / RSI / ATR runs.

See the benchmark methodology and artifacts:

🎯 Core capabilities

  • 160+ indicators with a TA-Lib-style public API.
  • Batch and streaming APIs for multi-series and bar-by-bar workloads.
  • NumPy-first execution with pandas and polars adapters.
  • Pre-built wheels on the supported Python and OS matrix.
  • Type stubs, error codes, examples, and reproducible benchmarks.

Adjacent and experimental surfaces such as derivatives analytics, MCP, GPU, plugins, and WASM remain opt-in and secondary to the core TA library story.

📦 Installation

pip install ferro-ta

Optional extras:

pip install "ferro-ta[pandas]"   # pandas.Series support
pip install "ferro-ta[polars]"   # polars.Series support
pip install "ferro-ta[gpu]"      # PyTorch-backed GPU helpers
pip install "ferro-ta[options]"  # derivatives analytics helpers
pip install "ferro-ta[mcp]"      # MCP server for agent/tool clients
pip install "ferro-ta[all]"      # most optional extras (excluding gpu)

Quick start

import numpy as np
from ferro_ta import SMA, EMA, RSI, MACD, BBANDS

close = np.array([44.34, 44.09, 44.15, 43.61, 44.33, 44.83, 45.10, 45.15,
                  43.61, 44.33, 44.83, 45.10, 45.15, 43.61, 44.33])

sma = SMA(close, timeperiod=5)
ema = EMA(close, timeperiod=5)
rsi = RSI(close, timeperiod=14)
macd_line, signal, histogram = MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)
upper, middle, lower = BBANDS(close, timeperiod=5, nbdevup=2.0, nbdevdn=2.0)

📊 TA-Lib compatibility

  • ferro-ta implements 100% of TA-Lib's function set (162+ indicators).
  • Most functions are marked Exact or Close; the remaining notable non-exact categories are the Hilbert cycle indicators plus MAMA, SAR, and SAREXT.
  • The full parity matrix and coverage summary now live in TA_LIB_COMPATIBILITY.md.

Migration and compatibility references:

🗺️ Docs map

Core guides:

Evidence and APIs:

Optional and experimental surfaces:

Project and release docs:

🛠️ Development

uv sync --extra dev
uv run pytest tests/unit tests/integration
uv run maturin build --release --out dist

More setup details live in CONTRIBUTING.md.

S
Description
Rust-powered Python technical analysis.
Readme MIT 2 MiB
Languages
Python 62.7%
Rust 36.7%
Shell 0.3%
JavaScript 0.1%