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.
The mintalib
package contains three main modules:
- mintalib.core
core calculation rountines implemented in cython, with names like
calc_sma
,calc_ema
, etc ... - mintalib.functions
wrapper functions to compute calculations on series and dataframes, with names like
sma
,ema
, etc ... - mintalib.indicators
composable interface to indicators with names like
SMA
,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 |
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 |
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.
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.
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
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)
.
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)
.
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.
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")
)
You can find example notebooks in the examples
folder.
You can install this package with pip
pip install mintalib
- python >= 3.9
- pandas
- numpy