Metadata-Version: 2.4
Name: numbatalib
Version: 0.1.0
Summary: TA-Lib reimplemented in pure Python + Numba.
License-Expression: BSD-3-Clause
Keywords: ta-lib,talib,technical-analysis,indicators,numba
Classifier: Development Status :: 3 - Alpha
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Office/Business :: Financial
Classifier: Topic :: Scientific/Engineering
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: numpy>=1.23
Requires-Dist: numba>=0.59
Provides-Extra: dev
Requires-Dist: build>=1.0; extra == "dev"
Requires-Dist: pytest>=7; extra == "dev"
Requires-Dist: pytest-benchmark>=4; extra == "dev"
Requires-Dist: twine>=5; extra == "dev"
Dynamic: license-file

# numbatalib

Reimplement TA-Lib (technical analysis indicators) in **pure Python + Numba**, aiming for:

- algorithmic parity with the local installed `talib` (ground-truth reference for tests/benchmarks)
- near-C performance for large vectors (Numba JIT)
- no compiled extension at install time (no `libta-lib` dependency)

## Status

- Implemented TA-Lib Core functions: **161 / 161**
- Parity tests: `generated/pytest_results.txt`
- Parity + benchmark results: `generated/parity_results.csv`, `generated/bench_results.csv`
- Status tracker: `port_checklist.csv`

Note: the local `talib` wheel in this environment does not expose `ACCBANDS`, `AVGDEV`, `IMI`; those are validated against upstream TA-Lib C (see `generated/parity_results_upstream_c.csv`).

## Install

After publishing to PyPI:

```bash
pip install numbatalib
```

## Usage

`numbatalib` exposes TA-Lib function names dynamically:

```python
import numpy as np
import numbatalib as ta

x = np.random.default_rng(0).normal(size=1000).cumsum()

sma = ta.SMA(x, timeperiod=20)
rsi = ta.RSI(x, timeperiod=14)
```

## TA-Lib compatible API (minimal habit cost)

If you want `talib`-like **APIs + error messages**, use the compatibility shim:

```python
import numpy as np
import numbatalib.talib as talib  # or: import numbatalib.compat.talib as talib

x = np.random.default_rng(0).normal(size=1000).cumsum()

talib.SMA(x, timeperiod=20)
talib.stream.SMA(x, timeperiod=20)        # streaming scalar
from numbatalib.talib import abstract
abstract.Function("SMA")(x, timeperiod=20)
```

Notes:
- `set_compatibility/get_compatibility` and `set_unstable_period/get_unstable_period` are supported (matching TA-Lib behavior for EMA/RSI/CMO and unstable-period masking).

## Dev

- Run parity tests vs installed `talib`: `pytest -q`
- Regenerate parity + speed CSVs and update checklist: `python tools/compare_vs_talib.py --bench --write-checklist`
