# Minimal Technical Analysis Library for Python
This package offers a list of technical analysis indicators and timeseries calculations
all implemented in cython for improved performance. The library is built around `numpy` arrays,
and aims to be compatible with `pandas` and `polars` where applicable.
> **Warning**
> This project is experimental and the interface can change.
> For a similar project with a mature api you may want to look into
> [ta-lib](https://pypi.org/project/TA-Lib/).
## Structure
The `mintalib` package contains three main modules:
- [mintalib.core](https://github.com/furechan/mintalib/blob/main/docs/mintalib.core.md)
core calculation rountines implemented in cython, with names like `calc_sma`, `calc_ema`, etc ...
- [mintalib.functions](https://github.com/furechan/mintalib/blob/main/docs/mintalib.functions.md)
wrapper functions to compute calculations on series and dataframes, with names like `sma`, `ema`, etc ...
- [mintalib.indicators](https://github.com/furechan/mintalib/blob/main/docs/mintalib.indicators.md)
composable interface to indicators with names like `SMA`, `EMA`, etc ...
## List of Indicators
| Name | Description |
|:-----------|:-----------------------------------------|
| ABS | Absolute Value |
| ADX | Average Directional Index |
| ALMA | Arnaud Legoux Moving Average |
| ATR | Average True Range |
| AVGPRICE | Average Price |
| BBANDS | Bollinger Bands |
| BOP | Balance of Power |
| CCI | Commodity Channel Index |
| CLAG | Confirmation Lag |
| CMF | Chaikin Money Flow |
| CROSSOVER | Cross Over |
| CROSSUNDER | Cross Under |
| CURVE | Curve (quadratic regression) |
| DEMA | Double Exponential Moving Average |
| DIFF | Difference |
| DMI | Directional Movement Indicator |
| EMA | Exponential Moving Average |
| EVAL | Expression Eval (pandas only) |
| EXP | Exponential |
| FLAG | Flag Value |
| HMA | Hull Moving Average |
| KAMA | Kaufman Adaptive Moving Average |
| KELTNER | Keltner Channel |
| KER | Kaufman Efficiency Ratio |
| LAG | Lag Function |
| LOG | Logarithm |
| LROC | Logarithmic Rate of Change |
| MACD | Moving Average Convergenge Divergence |
| MAD | Mean Absolute Deviation |
| MAV | Generic Moving Average |
| MAX | Rolling Maximum |
| MDI | Minus Directional Index |
| MFI | Money Flow Index |
| MIDPRICE | Mid Price |
| MIN | Rolling Minimum |
| NATR | Average True Range (normalized) |
| PDI | Plus Directional Index |
| PPO | Price Percentage Oscillator |
| PRICE | Generic Price |
| RMA | Rolling Moving Average (RSI style) |
| ROC | Rate of Change |
| RSI | Relative Strength Index |
| RVALUE | R-Value (linear regression) |
| SAR | Parabolic Stop and Reverse |
| SIGN | Sign |
| SLOPE | Slope (linear regression) |
| SMA | Simple Moving Average |
| STDEV | Standard Deviation |
| STEP | Step Function |
| STOCH | Stochastic Oscillator |
| STREAK | Consecutive streak of ups or downs |
| SUM | Rolling Sum |
| TEMA | Triple Exponential Moving Average |
| TRANGE | True Range |
| TSF | Time Series Forecast (linear regression) |
| TYPPRICE | Typical Price |
| UPDOWN | Flag for value crossing up & down levels |
| WCLPRICE | Weighted Close Price |
| WMA | Weighted Moving Average |
## Mintalib Core
The calculation routines in `mintalib.core`, implemented in cython, operate on numpy arrays and return numpy arrays by default.
Functions in `mintalib.functions` and indicators in `mintalib.indicatoers` are just wrappers around the core calculation routines.
## Using Functions
The function names are all lower case and may conflict with standard functions,
so the best way to use this module is to alias it to a short name
like `ta` and access all functions as attributes.
```python
import mintalib.functions as ta
```
The first parameter of a function is either `prices` or `series` depending on whether
the functions expects a dataframe of prices or a single series.
Functions that expect series data can be applied to a prices dataframe, in which case they use
the column specified with the `item` parameter or by default the 'close' column.
A `prices` dataframe can be a pandas dataframe, a polars dataframe or a dictionary of numpy arrays.
The column names for prices are expected to include `open`, `high`, `low`, `close`, `volume` all in **lower case**.
A `series` can be a pandas series, a polars series or any iterable compatible with numpy arrays.
Functions automatically wrap the result to match the type and the index ofthe input data when applicable.
```python
import yfinance as yf
import mintalib.functions as ta
# fetch prices (eg with yfinance)
prices = yf.Ticker('AAPL').history('5y')
# convert column and index names to lower case
prices = prices.rename(columns=str.lower).rename_axis(index=str.lower)
# compute indicators
sma50 = ta.sma(prices, 50) # SMA of 'close' with period 50
sma200 = ta.sma(prices, 200) # SMA of 'close' with period 200
high200 = ta.max(prices, 200, item='high') # MAX of 'high' with period 200
```
## Using Indicators
Indicators are available via the `indicators` module, with similar names as functions but in **upper case**.
Indicators offer a composable interface where a function is bound with its calculation parameters. When instantiated with parameters an indicator yields a callable that can be applied to prices or series data. Indicators support the `@` operator as syntactic sugar to apply the indicator to data. So for example `SMA(50) @ prices` can be used to compute the 50 period simple moving average on `prices`, insted of `SMA(50)(prices)`.
```python
from mintalib.indicators import ROC. SMA, EMA
sma50 = SMA(50) @ prices
sma200 = SMA(200) @ prices
```
The `@` operator can also be used to compose indicators, where for example `ROC(1) @ EMA(20)` means `ROC(1)` applied to `EMA(20)`.
```python
trend = ROC(1) @ EMA(20) @ prices
```
## Using Indicators with Pandas
Prices indicators like `ATR` can only be applied to prices dataframes.
```python
# Average True Range
atr = ATR(14) @ prices
```
Series indicators can be applied to a prices dataframe or a series. When applied to prices you must specify a column with the `item` or otherwize the indicator will use the `'close'` column by default.
```python
# SMA on the close column
sma50 = SMA(50) @ prices
# SMA on the volume column
vol50 = SMA(50, item='volume') @ prices
# Which is the same as
vol50 = SMA(50) @ prices.volume
```
With pandas dataframes you can compose and assign multiple indicators in one call using the builtin `assign` method.
```python
import yfinance as yf
from mintalib.indicators import EMA, SMA, ROC, RSI, EVAL
# fetch prices (eg with yfinance)
prices = yf.Ticker('AAPL').history('5y')
# convert column and index names to lower case
prices = prices.rename(columns=str.lower).rename_axis(index=str.lower)
# compute and append indicators to prices
# note that calculations can use results from prior indicators
result = prices.assign(
sma50 = SMA(50),
sma200 = SMA(200),
rsi = RSI(14),
trend = ROC(1) @ EMA(20),
flag = EVAL("sma50 > sma200")
)
```
## Using Indicators with Polars
Indicators can be applied to polars prices dataframes and series in the same way as with pandas.
The `@` operator has been extended to work with polars expressions. Series indicators should be applied to a `polars.col` object, while
prices indicators should be applied to the `polars.all()` expression. In the expression context, multi column outputs are returned as struct series.
In the following example, you can assign multiple columns using polars `with_columns`.
```python
import polars as pl
import yfinance as yf
from mintalib.indicators import SMA, ATR
# fetch prices (eg with yfinance)
prices = yf.Ticker('AAPL').history('5y')
# convert column and index names to lower case
prices = prices.rename(columns=str.lower).rename_axis(index=str.lower)
# convert to polars dataframe
prices = pl.from_pandas(prices, include_index=True)
# compute and append indicators to prices
result = prices.with_columns(
sma20 = SMA(20) @ pl.col('close'),
sma50 = SMA(50) @ pl.col('close'),
atr14 = ATR(14) @ pl.all()
)
```
## Example Notebooks
You can find example notebooks in the `examples` folder.
## Installation
You can install the current version of this package with pip
```console
python -mpip install git+https://github.com/furechan/mintalib.git
```
## Dependencies
- python >= 3.9
- pandas
- numpy
## Related Projects
- [ta-lib](https://github.com/mrjbq7/ta-lib) Python wrapper for TA-Lib
- [qtalib](https://github.com/josephchenhk/qtalib) Quantitative Technical Analysis Library
- [numpy](https://github.com/numpy/numpy) The fundamental package for scientific computing with Python
- [pandas](https://github.com/pandas-dev/pandas) Flexible and powerful data analysis / manipulation library for Python
- [polars](https://github.com/pola-rs/polars) Fast multi-threaded, hybrid-out-of-core query engine focussing on DataFrame front-ends
- [yfinance](https://github.com/ranaroussi/yfinance) Download market data from Yahoo! Finance's API
Raw data
{
"_id": null,
"home_page": null,
"name": "mintalib",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "python, cython, finance, technical-analysis, indicators",
"author": null,
"author_email": "Furechan <furechan@xsmail.com>",
"download_url": "https://files.pythonhosted.org/packages/ea/92/7d6f1f9836e88eed1f0bc7e7c6f235beff2ba2b61a8e6f41b68b0e87b5d5/mintalib-0.0.20.tar.gz",
"platform": null,
"description": "# Minimal Technical Analysis Library for Python\n\nThis package offers a list of technical analysis indicators and timeseries calculations\nall implemented in cython for improved performance. The library is built around `numpy` arrays,\nand aims to be compatible with `pandas` and `polars` where applicable.\n\n\n> **Warning**\n> This project is experimental and the interface can change.\n> For a similar project with a mature api you may want to look into\n> [ta-lib](https://pypi.org/project/TA-Lib/).\n\n\n## Structure\nThe `mintalib` package contains three main modules:\n\n- [mintalib.core](https://github.com/furechan/mintalib/blob/main/docs/mintalib.core.md)\n core calculation rountines implemented in cython, with names like `calc_sma`, `calc_ema`, etc ... \n- [mintalib.functions](https://github.com/furechan/mintalib/blob/main/docs/mintalib.functions.md)\n wrapper functions to compute calculations on series and dataframes, with names like `sma`, `ema`, etc ...\n- [mintalib.indicators](https://github.com/furechan/mintalib/blob/main/docs/mintalib.indicators.md)\n composable interface to indicators with names like `SMA`, `EMA`, etc ...\n\n\n## List of Indicators\n\n| Name | Description |\n|:-----------|:-----------------------------------------|\n| ABS | Absolute Value |\n| ADX | Average Directional Index |\n| ALMA | Arnaud Legoux Moving Average |\n| ATR | Average True Range |\n| AVGPRICE | Average Price |\n| BBANDS | Bollinger Bands |\n| BOP | Balance of Power |\n| CCI | Commodity Channel Index |\n| CLAG | Confirmation Lag |\n| CMF | Chaikin Money Flow |\n| CROSSOVER | Cross Over |\n| CROSSUNDER | Cross Under |\n| CURVE | Curve (quadratic regression) |\n| DEMA | Double Exponential Moving Average |\n| DIFF | Difference |\n| DMI | Directional Movement Indicator |\n| EMA | Exponential Moving Average |\n| EVAL | Expression Eval (pandas only) |\n| EXP | Exponential |\n| FLAG | Flag Value |\n| HMA | Hull Moving Average |\n| KAMA | Kaufman Adaptive Moving Average |\n| KELTNER | Keltner Channel |\n| KER | Kaufman Efficiency Ratio |\n| LAG | Lag Function |\n| LOG | Logarithm |\n| LROC | Logarithmic Rate of Change |\n| MACD | Moving Average Convergenge Divergence |\n| MAD | Mean Absolute Deviation |\n| MAV | Generic Moving Average |\n| MAX | Rolling Maximum |\n| MDI | Minus Directional Index |\n| MFI | Money Flow Index |\n| MIDPRICE | Mid Price |\n| MIN | Rolling Minimum |\n| NATR | Average True Range (normalized) |\n| PDI | Plus Directional Index |\n| PPO | Price Percentage Oscillator |\n| PRICE | Generic Price |\n| RMA | Rolling Moving Average (RSI style) |\n| ROC | Rate of Change |\n| RSI | Relative Strength Index |\n| RVALUE | R-Value (linear regression) |\n| SAR | Parabolic Stop and Reverse |\n| SIGN | Sign |\n| SLOPE | Slope (linear regression) |\n| SMA | Simple Moving Average |\n| STDEV | Standard Deviation |\n| STEP | Step Function |\n| STOCH | Stochastic Oscillator |\n| STREAK | Consecutive streak of ups or downs |\n| SUM | Rolling Sum |\n| TEMA | Triple Exponential Moving Average |\n| TRANGE | True Range |\n| TSF | Time Series Forecast (linear regression) |\n| TYPPRICE | Typical Price |\n| UPDOWN | Flag for value crossing up & down levels |\n| WCLPRICE | Weighted Close Price |\n| WMA | Weighted Moving Average |\n\n\n## Mintalib Core\n\nThe calculation routines in `mintalib.core`, implemented in cython, operate on numpy arrays and return numpy arrays by default.\nFunctions in `mintalib.functions` and indicators in `mintalib.indicatoers` are just wrappers around the core calculation routines.\n\n\n## Using Functions\n\nThe function names are all lower case and may conflict with standard functions,\nso the best way to use this module is to alias it to a short name\nlike `ta` and access all functions as attributes.\n\n```python\nimport mintalib.functions as ta\n```\n\n\nThe first parameter of a function is either `prices` or `series` depending on whether\nthe functions expects a dataframe of prices or a single series.\n\nFunctions that expect series data can be applied to a prices dataframe, in which case they use \nthe column specified with the `item` parameter or by default the 'close' column.\n\nA `prices` dataframe can be a pandas dataframe, a polars dataframe or a dictionary of numpy arrays.\nThe column names for prices are expected to include `open`, `high`, `low`, `close`, `volume` all in **lower case**.\n\nA `series` can be a pandas series, a polars series or any iterable compatible with numpy arrays.\n\nFunctions automatically wrap the result to match the type and the index ofthe input data when applicable.\n\n\n```python\nimport yfinance as yf\nimport mintalib.functions as ta\n\n# fetch prices (eg with yfinance)\nprices = yf.Ticker('AAPL').history('5y')\n\n# convert column and index names to lower case\nprices = prices.rename(columns=str.lower).rename_axis(index=str.lower)\n\n# compute indicators\nsma50 = ta.sma(prices, 50) # SMA of 'close' with period 50\nsma200 = ta.sma(prices, 200) # SMA of 'close' with period 200\nhigh200 = ta.max(prices, 200, item='high') # MAX of 'high' with period 200\n```\n\n\n## Using Indicators\n\nIndicators are available via the `indicators` module, with similar names as functions but in **upper case**.\n\nIndicators offer a composable interface where a function is bound with its calculation parameters. When instantiated with parameters an indicator yields a callable that can be applied to prices or series data. Indicators support the `@` operator as syntactic sugar to apply the indicator to data. So for example `SMA(50) @ prices` can be used to compute the 50 period simple moving average on `prices`, insted of `SMA(50)(prices)`.\n\n```python\nfrom mintalib.indicators import ROC. SMA, EMA\n\nsma50 = SMA(50) @ prices\nsma200 = SMA(200) @ prices\n```\n\nThe `@` operator can also be used to compose indicators, where for example `ROC(1) @ EMA(20)` means `ROC(1)` applied to `EMA(20)`.\n\n```python\ntrend = ROC(1) @ EMA(20) @ prices\n```\n\n\n## Using Indicators with Pandas\n\nPrices indicators like `ATR` can only be applied to prices dataframes.\n\n```python\n# Average True Range\natr = ATR(14) @ prices\n```\n\nSeries indicators can be applied to a prices dataframe or a series. When applied to prices you must specify a column with the `item` or otherwize the indicator will use the `'close'` column by default.\n\n```python\n# SMA on the close column\nsma50 = SMA(50) @ prices\n\n# SMA on the volume column\nvol50 = SMA(50, item='volume') @ prices\n\n# Which is the same as\nvol50 = SMA(50) @ prices.volume \n``` \n\nWith pandas dataframes you can compose and assign multiple indicators in one call using the builtin `assign` method.\n\n\n```python\nimport yfinance as yf\n\nfrom mintalib.indicators import EMA, SMA, ROC, RSI, EVAL\n\n# fetch prices (eg with yfinance)\nprices = yf.Ticker('AAPL').history('5y')\n\n# convert column and index names to lower case\nprices = prices.rename(columns=str.lower).rename_axis(index=str.lower)\n\n# compute and append indicators to prices\n# note that calculations can use results from prior indicators\nresult = prices.assign(\n sma50 = SMA(50),\n sma200 = SMA(200),\n rsi = RSI(14),\n trend = ROC(1) @ EMA(20),\n flag = EVAL(\"sma50 > sma200\")\n)\n```\n\n\n## Using Indicators with Polars\n\nIndicators can be applied to polars prices dataframes and series in the same way as with pandas. \n\nThe `@` operator has been extended to work with polars expressions. Series indicators should be applied to a `polars.col` object, while \nprices indicators should be applied to the `polars.all()` expression. In the expression context, multi column outputs are returned as struct series.\n\nIn the following example, you can assign multiple columns using polars `with_columns`.\n\n```python\nimport polars as pl\nimport yfinance as yf\n\nfrom mintalib.indicators import SMA, ATR\n\n# fetch prices (eg with yfinance)\nprices = yf.Ticker('AAPL').history('5y')\n\n# convert column and index names to lower case\nprices = prices.rename(columns=str.lower).rename_axis(index=str.lower)\n\n# convert to polars dataframe \nprices = pl.from_pandas(prices, include_index=True)\n\n# compute and append indicators to prices\nresult = prices.with_columns(\n sma20 = SMA(20) @ pl.col('close'),\n sma50 = SMA(50) @ pl.col('close'),\n atr14 = ATR(14) @ pl.all()\n)\n```\n\n\n## Example Notebooks\n\nYou can find example notebooks in the `examples` folder. \n\n\n## Installation\n\nYou can install the current version of this package with pip\n\n```console\npython -mpip install git+https://github.com/furechan/mintalib.git\n```\n\n## Dependencies\n\n- python >= 3.9\n- pandas\n- numpy\n\n\n## Related Projects\n- [ta-lib](https://github.com/mrjbq7/ta-lib) Python wrapper for TA-Lib\n- [qtalib](https://github.com/josephchenhk/qtalib) Quantitative Technical Analysis Library\n- [numpy](https://github.com/numpy/numpy) The fundamental package for scientific computing with Python\n- [pandas](https://github.com/pandas-dev/pandas) Flexible and powerful data analysis / manipulation library for Python\n- [polars](https://github.com/pola-rs/polars) Fast multi-threaded, hybrid-out-of-core query engine focussing on DataFrame front-ends\n- [yfinance](https://github.com/ranaroussi/yfinance) Download market data from Yahoo! Finance's API\n\n\n",
"bugtrack_url": null,
"license": null,
"summary": "Minimal Technical Analysis Library for Python",
"version": "0.0.20",
"project_urls": {
"homepage": "https://github.com/furechan/mintalib"
},
"split_keywords": [
"python",
" cython",
" finance",
" technical-analysis",
" indicators"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "ea927d6f1f9836e88eed1f0bc7e7c6f235beff2ba2b61a8e6f41b68b0e87b5d5",
"md5": "bb0f07e309def43e437c1f22cc6ca37d",
"sha256": "e07bc3fe74ef43b5ead53918e7accbe8823773290950015b6024172668dd8a22"
},
"downloads": -1,
"filename": "mintalib-0.0.20.tar.gz",
"has_sig": false,
"md5_digest": "bb0f07e309def43e437c1f22cc6ca37d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 822151,
"upload_time": "2025-01-12T22:46:28",
"upload_time_iso_8601": "2025-01-12T22:46:28.963252Z",
"url": "https://files.pythonhosted.org/packages/ea/92/7d6f1f9836e88eed1f0bc7e7c6f235beff2ba2b61a8e6f41b68b0e87b5d5/mintalib-0.0.20.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-01-12 22:46:28",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "furechan",
"github_project": "mintalib",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"tox": true,
"lcname": "mintalib"
}