This library offers a curated list of technical analysis indicators
implemented in cython.
It is built around numpy
arrays and aims to be compatible
with both pandas
and polars
dataframes where possible.
Warning This project is experimental and the interface can change. For a similar project with a mature api you may want to look at ta-lib.
The mintalib
package contains three main modules:
mintalib.core
low level calculation rountines implemented in cythonmintalib.functions
single use functions to compute indicatorsmintalib.indicators
composable interface to indicators
Indicators are available as simple functions via the functions
module,
with names like SMA
, EMA
, RSI
, MACD
, all in upper case.
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 still be applied to prices data, in which case they use
the close
column by default or otherwize the column specified with the item
parameter.
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
all in lower case.
A series
can be a pandas series, a polars series or any iterable compatible with numpy arrays.
Functions attempt to wrap their result to match their input, so that for example pandas based inputs will yield pandas based results with matching index.
import yfinance as yf
from mintalib.functions import SMA, MAX
# fetch prices (eg with yfinance)
prices = yf.Ticker('AAPL').history('5y')
# convert column names to lower case
prices = prices.rename(columns=str.lower).rename_axis(index=str.lower)
# compute indicators
sma50 = SMA(prices, 50) # SMA of 'close' with period = 50
sma200 = SMA(prices, 200) # SMA of 'close' with period = 200
high200 = MAX(prices, 200, item='high') # MAX of 'high' with period = 200
Indicators are also available through a composable interface via the indicators
module,
with similar the same names all in uper case.
Each indicator is implemented as a class to be instanciated with calculation parameters.
The instance objects are callables that can be applied to series or prices data like regular functions.
So for example SMA(50)
is a callable object that will return the 50 period simple moving average of its argument.
Indicators can be composed with the @
operator,
where for example EMA(20) @ ROC(5)
means EMA(20)
applied to ROC(5)
.
The same @
operator can also be used to apply an indicator to some data,
where for example SMA(50) @ prices
can be used to compute the 50 period simple moving average on prices
.
Please note that with pandas dataframes you can compose and assign multiple indicators in one go
using the builtin assign
method.
import yfinance as yf
from mintalib.indicators import EMA, SMA, ROC, RSI, SLOPE, EVAL
# fetch prices (eg with yfinance)
prices = yf.Ticker('AAPL').history('5y')
# convert column names to lower case
prices = prices.rename(columns=str.lower).rename_axis(index=str.lower)
# compute and append indicators to prices
result = prices.assign(
sma50 = SMA(50),
sma200 = SMA(200),
rsi = RSI(14),
slope = SLOPE(20),
trend = EMA(20) @ ROC(5),
pos = EVAL("sma50 > sma200")
)
# you will notice that the EVAL expression at the end
# can use the names sma50 and sma200 that where defined
# just above in the same function call!
You can find example notebooks in the examples folder.
You can install the current version of this package with pip
python -mpip install git+https://github.com/furechan/mintalib.git
- ta-lib Python wrapper for TA-Lib
- qtalib Quantitative Technical Analysis Library
- numpy The fundamental package for scientific computing with Python
- pandas Flexible and powerful data analysis / manipulation library for Python
- polars Fast multi-threaded, hybrid-out-of-core query engine focussing on DataFrame front-ends
- yfinance Download market data from Yahoo! Finance's API
Name | Description |
---|---|
ADX | Average Directional Index |
ATR | Average True Range |
AVGPRICE | Average Price |
BBANDS | Bollinger Bands |
BOP | Balance of Power |
CCI | Commodity Channel Index |
CMF | Chaikin Money Flow |
CROSSOVER | Cross Over |
CROSSUNDER | Cross Under |
DEMA | Double Exponential Moving Average |
DIFF | Difference |
EFFICIENCY_RATIO | Efficiency Ratio (Kaufman) |
EMA | Exponential Moving Average |
EVAL | Expression Eval (pandas only) |
EXP | Exponential |
FLAG_ABOVE | Flag for value above level |
FLAG_BELOW | Flag for value below level |
FORECAST | Forecast (time linear regression) |
INVERT_FLAG | Invert flag |
KAMA | Kaufman Adaptive Moving Average (Kaufman) |
KELTNER | Keltner Channel |
LATR | Average True Range (logarithmic) |
LOG | Logarithm |
MA | Generic Moving Average |
MACD | Moving Average Convergenge Divergence |
MAD | Mean Absolute Deviation |
MAX | Rolling Maximum |
MFI | Money Flow Index |
MIDPRICE | Mid Price |
MIN | Rolling Minimum |
MINUSDI | Minus Directional Index |
NATR | Average True Range (normalized) |
PLUSDI | 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 | RValue (time linear regression) |
SAR | Parabolic Stop and Reverse |
SLOPE | Slope (time linear regression) |
SMA | Simple Moving Average |
STDEV | Standard Deviation |
STOCH | Stochastic Oscillator |
STREAK_DOWN | Consecutive streak of downs |
STREAK_UP | Consecutive streak of ups |
SUM | Rolling Sum |
TEMA | Triple Exponential Moving Average |
TRANGE | True Range |
TYPPRICE | Typical Price |
UPDOWN_FLAG | Flag for value crossing levels up & down |
WCLPRICE | Weighted Close Price |
WMA | Weighted Moving Average |