# Minimal Technical Analysis Library for Python
This package offers a curated list of technical analysis indicators and timeseries calculations
all implemented in cython for improved performance. The library is built around `numpy` arrays,
and is compatible with `pandas` dataframes and series.
> **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 | Rolling 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 |
| QSF | Quadratic Series Forecast (quadratic regression) |
| RMA | Rolling Moving Average (RSI style) |
| ROC | Rate of Change |
| RSI | Relative Strength Index |
| RVALUE | R-Value (linear regression) |
| SAR | Parabolic Stop and Reverse |
| SHIFT | Shift Function |
| 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 |
## Using Functions
Functions are available as lower case methods like `sma`, `ema`, etc ...
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 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 or any iterable compatible with numpy arrays.
Functions automatically wrap the result to match the type and the index of the 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.
An indicator is a callable that accepts a series or a prices dataframe as a single parameter. You can also use the `@` operator as syntactic sugar to apply an indicator to its parameter.
So for example `SMA(50) @ prices` can be used to compute the 50 period simple moving average on `prices`, instead of the more verbose `SMA(50)(prices)`.
```python
from mintalib.indicators import ROC, SMA, EMA
sma50 = SMA(50) @ prices # SMA of 'close' with period 50
sma200 = SMA(200) @ prices # SMA of 'close' with period 200
high200 = MAX(200, item='high') @ prices # MAX of 'high' with period 200
```
The `@` operator can also be used to chain indicators, where for example `ROC(1) @ EMA(20)` means `ROC(1)` applied to `EMA(20)`.
```python
from mintalib.indicators import ROC, SMA, EMA
trend = ROC(1) @ EMA(20) @ prices
```
With pandas dataframes you can compose and apply multiple indicators in one call using the `assign` dataframe 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")
)
```
## Example Notebooks
You can find example notebooks in the `examples` folder.
## Installation
You can install this package with pip
```console
pip install mintalib
```
## 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
- [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/a6/e7/4c473eebcda5d402cc62e42c703610f004845a621f756b5c4c3b1c83c4b0/mintalib-0.0.22.tar.gz",
"platform": null,
"description": "# Minimal Technical Analysis Library for Python\n\nThis package offers a curated list of technical analysis indicators and timeseries calculations\nall implemented in cython for improved performance. The library is built around `numpy` arrays,\nand is compatible with `pandas` dataframes and series.\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\n\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 | Rolling 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| QSF | Quadratic Series Forecast (quadratic regression) |\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| SHIFT | Shift Function |\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## Using Functions\n\nFunctions are available as lower case methods like `sma`, `ema`, etc ...\nThe 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\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 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 or any iterable compatible with numpy arrays.\n\nFunctions automatically wrap the result to match the type and the index of the 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.\n\nAn indicator is a callable that accepts a series or a prices dataframe as a single parameter. You can also use the `@` operator as syntactic sugar to apply an indicator to its parameter. \n\nSo for example `SMA(50) @ prices` can be used to compute the 50 period simple moving average on `prices`, instead of the more verbose `SMA(50)(prices)`. \n\n```python\nfrom mintalib.indicators import ROC, SMA, EMA\n\nsma50 = SMA(50) @ prices # SMA of 'close' with period 50\nsma200 = SMA(200) @ prices # SMA of 'close' with period 200\nhigh200 = MAX(200, item='high') @ prices # MAX of 'high' with period 200\n```\n\n\nThe `@` operator can also be used to chain indicators, where for example `ROC(1) @ EMA(20)` means `ROC(1)` applied to `EMA(20)`.\n\n\n```python\nfrom mintalib.indicators import ROC, SMA, EMA\n\ntrend = ROC(1) @ EMA(20) @ prices\n```\n\n\nWith pandas dataframes you can compose and apply multiple indicators in one call using the `assign` dataframe method.\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## Example Notebooks\n\nYou can find example notebooks in the `examples` folder. \n\n\n## Installation\n\nYou can install this package with pip\n\n```console\npip install mintalib\n```\n\n## Dependencies\n\n- python >= 3.9\n- pandas\n- numpy\n\n\n## Related Projects\n\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- [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.22",
"project_urls": {
"homepage": "https://github.com/furechan/mintalib"
},
"split_keywords": [
"python",
" cython",
" finance",
" technical-analysis",
" indicators"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "a6e74c473eebcda5d402cc62e42c703610f004845a621f756b5c4c3b1c83c4b0",
"md5": "b1fba7e6bed775aa0b22d799fc3db9c4",
"sha256": "ef2b07fff283580962ad9139979e723eeb3ff925d19f720032c7a4b685f75014"
},
"downloads": -1,
"filename": "mintalib-0.0.22.tar.gz",
"has_sig": false,
"md5_digest": "b1fba7e6bed775aa0b22d799fc3db9c4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 814672,
"upload_time": "2025-02-13T15:19:29",
"upload_time_iso_8601": "2025-02-13T15:19:29.170631Z",
"url": "https://files.pythonhosted.org/packages/a6/e7/4c473eebcda5d402cc62e42c703610f004845a621f756b5c4c3b1c83c4b0/mintalib-0.0.22.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-02-13 15:19:29",
"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"
}