This package offers a curated list of technical analysis indicators implemented in cython for optimal performance. The library is built around numpy arrays, but also offers an interface for pandas and polars dataframes and series.
Warning This project is experimental and the interface can change.
The mintalib package contains four main modules:
mintalib.core: core calculation routines at numpy level, implemented in cython, with names likecalc_sma,calc_ema, etc ...mintalib.functions: wrapper functions to apply calculations to series and dataframes, with names likesma,ema, etc ...mintalib.indicators: composable interface to pandas indicators with names likeSMA,EMA, etc ...mintalib.expressions: polars expressions library with names likeSMA,EMA, etc ...
| Name | Description |
|---|---|
| ABS | Absolute Value |
| ADX | Average Directional Index |
| ALMA | Arnaud Legoux Moving Average |
| ATR | Average True Range |
| AVGPRICE | Average Price |
| BBANDS | Bollinger Bands |
| BBP | Bollinger Bands Percent (%B) |
| BBW | Bollinger Bands Width |
| 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 |
| MACDV | Moving Average Convergenge Divergence - Volatility Normalized |
| 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 values above zero |
| 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 |
Functions are available via the mintalib.functins module, with lower case names like sma, ema, etc ...
The best way to use this module is to import it with a short alias name like ta.
import mintalib.functions as taThe 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 also 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 or polars dataframe. The column names for prices are expected to include open, high, low, close, volume all in lower case.
A series can be a pandas or polars series.
Functions automatically wrap the result to match the type and the index of the input data when applicable.
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 200Indicators are available via the mintalib.indicators module, with similar names as functions but in upper case. Indicators are best imported directly in the name space like:
from mintalib.indicators import SMA, EMA, ROC, MACDIndicators 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).
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 200The @ operator can also be used to chain indicators, where for example ROC(1) @ EMA(20) means ROC(1) applied to EMA(20).
trend = ROC(1) @ EMA(20) @ pricesWith pandas dataframes you can compose and apply multiple indicators in one call using the assign dataframe method.
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")
)Expressions are available via the mintalib.expressions module, with similar names as functions but in upper case. Expressions are best imported directly in the name space like:
from mintalib.expressions import SMA, EMA, ROC, MACD, ATRSeries based expressions have a first argument src that is required. The src parameter can be a column name or a polars expression. So for example SMA('close', period=50), is equivalent to SMA(pl.col('close'), period=50).
prices.select(
SMA('close', period=50)
)Series expressions can also be applied with the polars pipe method as in:
prices.select(
pl.col('close').pipe(SMA, period=50)
)In prices based expressions like ATR, the src argument is optional and keyword only.
prices.select(
ATR(period=14)
)Multi-column expressions like MACD return a struct series instead of a dataframe. You can access the fields with the polars struct accessor. So for example to convert he MACD expression to individual columns you can use the following:
prices.select(
MACD('close').struct.field('*')
)Example notebooks in the examples folder.
You can install this package with pip
pip install mintalib- python >= 3.10
- numpy
- pandas
- polars [optional]
- ta-lib Python wrapper for TA-Lib
- qtalib Quantitative Technical Analysis Library
- polars-ta Technical Analysis Indicators for polars
- polars-talib Polars extension for Ta-Lib: Support Ta-Lib functions in Polars expressions