Files
ferro-ta/docs/migration_talib.rst
2026-03-23 23:34:28 +05:30

169 lines
5.0 KiB
ReStructuredText

Migration from TA-Lib
=====================
ferro-ta is designed as a drop-in replacement for `ta-lib` (the Python
`talib` package) for the most-commonly used indicators. This guide explains
the differences so you can migrate existing code with confidence.
.. contents::
:local:
:depth: 2
Import changes
--------------
TA-Lib uses a single flat namespace::
import talib
result = talib.SMA(close, timeperiod=14)
ferro-ta exposes the same names at the top level **and** in sub-modules::
# Option A — top-level (most concise, mirrors talib)
from ferro_ta import SMA, EMA, RSI
result = SMA(close, timeperiod=14)
# Option B — sub-modules
from ferro_ta.overlap import SMA
from ferro_ta.momentum import RSI
Multi-output functions return a **tuple** in both libraries::
# talib
upper, middle, lower = talib.BBANDS(close)
# ferro_ta
upper, middle, lower = ferro_ta.BBANDS(close)
Input / output conventions
--------------------------
Both libraries accept NumPy ``float64`` arrays. ferro-ta also accepts any
array-like (Python list, ``float32``, pandas Series) and converts
automatically.
- **Leading NaN values** — both libraries emit ``NaN`` for the "warm-up"
period at the start of an array. The number of ``NaN`` values is identical
for all indicators marked **Exact** or **Close** in the accuracy table.
- **Output length** — always equal to input length, matching TA-Lib.
- **Pandas Series** — ferro-ta transparently preserves the original index when
a ``pd.Series`` is passed as input.
Accuracy levels
---------------
.. list-table::
:header-rows: 1
* - Symbol
- Meaning
* - ✅ **Exact**
- Values match TA-Lib to floating-point precision.
* - ✅ **Close**
- Values converge to TA-Lib after the warm-up window (EMA-seed
differences resolve within ~50 bars for typical periods).
* - ⚠️ **Corr**
- Strong correlation (> 0.95) but not numerically identical (e.g.
MAMA uses the same algorithm but slightly different initialization).
* - ⚠️ **Shape**
- Same output shape and NaN structure; absolute values differ (e.g. SAR
reversal history can diverge due to floating-point accumulation).
All overlap, momentum, volume, volatility, statistic, and price-transform
functions are **Exact** or **Close**. The only remaining **Corr / Shape**
functions are MAMA, SAR, SAREXT, and the six HT_* cycle indicators — see
the roadmap for details.
Known behavioural differences
------------------------------
EMA / DEMA / TEMA / T3 / MACD
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TA-Lib seeds the first EMA value with a simple moving average. ferro-ta uses
the same seeding, so values converge after the warm-up period. For a 14-period
EMA on typical market data, convergence is complete by bar ~60.
RSI
~~~
ferro-ta uses the same Wilder smoothing seed as TA-Lib (SMA seed for the first
``timeperiod`` bars) and produces **Exact** results.
SAR / SAREXT
~~~~~~~~~~~~
Parabolic SAR reversal history can diverge in rare edge-cases due to
floating-point accumulation differences. Output shapes (NaN count, length)
match exactly.
HT_* cycle indicators
~~~~~~~~~~~~~~~~~~~~~
The Hilbert Transform cycle indicators (``HT_DCPERIOD``, ``HT_DCPHASE``,
``HT_PHASOR``, ``HT_SINE``, ``HT_TRENDLINE``, ``HT_TRENDMODE``) use the
same Ehlers algorithm as TA-Lib but may differ slightly in floating-point
accumulation. All six share a 63-bar lookback matching TA-Lib.
OBV
~~~
ferro-ta OBV starts accumulation from zero at bar 0 (same as TA-Lib for most
data sets). If your TA-Lib OBV shows an offset this is usually due to a
starting volume difference in the input data.
Before / after example
-----------------------
.. code-block:: python
# --- Before (ta-lib) ---
import numpy as np
import talib
close = np.random.rand(200).cumsum() + 100.0
high = close + 0.5
low = close - 0.5
sma = talib.SMA(close, timeperiod=14)
ema = talib.EMA(close, timeperiod=14)
rsi = talib.RSI(close, timeperiod=14)
upper, mid, lower = talib.BBANDS(close, timeperiod=20)
macd, signal, hist = talib.MACD(close)
atr = talib.ATR(high, low, close, timeperiod=14)
# --- After (ferro_ta) ---
import numpy as np
from ferro_ta import SMA, EMA, RSI, BBANDS, MACD, ATR
close = np.random.rand(200).cumsum() + 100.0
high = close + 0.5
low = close - 0.5
sma = SMA(close, timeperiod=14)
ema = EMA(close, timeperiod=14)
rsi = RSI(close, timeperiod=14)
upper, mid, lower = BBANDS(close, timeperiod=20)
macd, signal, hist = MACD(close)
atr = ATR(high, low, close, timeperiod=14)
Only the import line changes for the most common indicators.
Extended (non-TA-Lib) indicators
---------------------------------
ferro-ta additionally provides indicators not in TA-Lib::
from ferro_ta import (
VWAP, SUPERTREND, ICHIMOKU, DONCHIAN, PIVOT_POINTS,
KELTNER_CHANNELS, HULL_MA, CHANDELIER_EXIT, VWMA, CHOPPINESS_INDEX,
)
See :doc:`extended` for full API documentation.