VERSION: 0.6.2
Supply a wrapper StockDataFrame
for pandas.DataFrame
with inline stock
statistics/indicators support.
Supported statistics/indicators are:
pip install stockstats
The build checks the compatibility for the last two major releases of python3 and the last release of python2.
StockDataFrame
works as a wrapper for the pandas.DataFrame
. You need to
Initialize the StockDataFrame
with wrap
or StockDataFrame.retype
.
import pandas as pd
from stockstats import wrap
data = pd.read_csv('stock.csv')
df = wrap(data)
Formalize your data. This package takes for granted that your data is sorted by timestamp and contains certain columns. Please align your column name.
date
: timestamp of the record, optional.close
: the close price of the periodhigh
: the highest price of the intervallow
: the lowest price of the intervalvolume
: the volume of stocks traded during the intervalNote these column names are case-insensitive. They are converted to lower case when you wrap the data frame.
By default, the date
column is used as the index. Users can also specify the
index column name in the wrap
or retype
function.
Example:
DataFrame
loaded from CSV.
Date Amount Close High Low Volume
0 20040817 90923240.0 11.20 12.21 11.03 7877900
1 20040818 52955668.0 10.29 10.90 10.29 5043200
2 20040819 32614676.0 10.53 10.65 10.30 3116800
... ... ... ... ... ... ...
2810 20160815 56416636.0 39.58 39.79 38.38 1436706
2811 20160816 68030472.0 39.66 40.86 39.00 1703600
2812 20160817 62536480.0 40.45 40.59 39.12 1567600
After conversion to StockDataFrame
amount close high low volume
date
20040817 90923240.0 11.20 12.21 11.03 7877900
20040818 52955668.0 10.29 10.90 10.29 5043200
20040819 32614676.0 10.53 10.65 10.30 3116800
... ... ... ... ... ...
20160815 56416636.0 39.58 39.79 38.38 1436706
20160816 68030472.0 39.66 40.86 39.00 1703600
20160817 62536480.0 40.45 40.59 39.12 1567600
Use unwrap
to convert it back to a pandas.DataFrame
.
Note that unwrap
won't reset the columns and the index.
StockDataFrame
is a subclass of pandas.DataFrame
. All the functions
of pandas.DataFrame
should work the same as before.
We allow the user to access the statistics directly with some specified column
name, such as kdjk
, macd
, rsi
.
The values of these columns are calculated the first time you access them from the data frame. Please delete those columns first if you want the lib to re-evaluate them.
Use macd = stock['macd']
or rsi = stock.get('rsi')
to retrieve the Series
.
Some statistics need the column name and the window size,
such as delta, shift, simple moving average, etc. Use this patter to retrieve
them: <columnName>_<windowSize>_<statistics>
Examples:
high_5_sma
close_10_ema
high_-1_d
.
The minus symbol means looking backward.Some statistics require the window size but not the column name. Use
this patter to specify your window: <statistics>_<windowSize>
Examples:
rsi_6
cci_10
atr_13
Some of them have default windows. Check their document for detail.
Some indicators, such as KDJ, BOLL, MFI, have shortcuts. Use df.init_all()
to initialize all these indicators.
This operation generates lots of columns. Please use it with caution.
Some statistics have configurable parameters. They are class-level fields. Change of these fields is global. And they won't affect the existing results. Removing existing columns so that they will be re-evaluated the next time you access them.
Using pattern <column>_<window>_d
to retrieve the delta between different periods.
You can also use <column>_delta
as a shortcut to <column>_-1_d
Examples:
df['close_-1_d']
retrieves the close price delta between current and prev. period.df['close_delta']
is the same as df['close_-1_d']
df['high_2_d']
retrieves the high price delta between current and 2 days laterShift the column backward or forward. It takes 2 parameters:
We fill the head and tail with the nearest data.
See the example below:
In [15]: df[['close', 'close_-1_s', 'close_2_s']]
Out[15]:
close close_-1_s close_2_s
date
20040817 11.20 11.20 10.53
20040818 10.29 11.20 10.55
20040819 10.53 10.29 10.10
20040820 10.55 10.53 10.25
... ... ... ...
20160812 39.10 38.70 39.66
20160815 39.58 39.10 40.45
20160816 39.66 39.58 40.45
20160817 40.45 39.66 40.45
[2813 rows x 3 columns]
RSI has a configurable window. The default window size is 14 which is
configurable through set_dft_window('rsi', n)
. e.g.
df['rsi']
: 14 periods RSIdf['rsi_6']
: 6 periods RSILogarithmic return = ln( close / last close)
From wiki:
For example, if a stock is priced at 3.570 USD per share at the close on one day, and at 3.575 USD per share at the close the next day, then the logarithmic return is: ln(3.575/3.570) = 0.0014, or 0.14%.
Use df['log-ret']
to access this column.
Count non-zero values of a specific range. It requires a column and a window.
Examples:
In [22]: tp = df['middle']
In [23]: df['res'] = df['middle'] > df['close']
In [24]: df[['middle', 'close', 'res', 'res_10_c']]
Out[24]:
middle close res res_10_c
date
20040817 11.480000 11.20 True 1.0
20040818 10.493333 10.29 True 2.0
20040819 10.493333 10.53 False 2.0
20040820 10.486667 10.55 False 2.0
20040823 10.163333 10.10 True 3.0
... ... ... ... ...
20160811 38.703333 38.70 True 5.0
20160812 38.916667 39.10 False 5.0
20160815 39.250000 39.58 False 4.0
20160816 39.840000 39.66 True 5.0
20160817 40.053333 40.45 False 5.0
[2813 rows x 4 columns]
In [26]: df['ups'], df['downs'] = df['change'] > 0, df['change'] < 0
In [27]: df[['ups', 'ups_10_c', 'downs', 'downs_10_c']]
Out[27]:
ups ups_10_c downs downs_10_c
date
20040817 False 0.0 False 0.0
20040818 False 0.0 True 1.0
20040819 True 1.0 False 1.0
20040820 True 2.0 False 1.0
20040823 False 2.0 True 2.0
... ... ... ... ...
20160811 False 3.0 True 7.0
20160812 True 3.0 False 7.0
20160815 True 4.0 False 6.0
20160816 True 5.0 False 5.0
20160817 True 5.0 False 5.0
[2813 rows x 4 columns]
Retrieve the max/min value of specified periods. They require column and
window.
Note the window does NOT simply stand for the rolling window.
Examples:
close_-3,2_max
stands for the max of 2 periods later and 3 periods agoclose_-2~0_min
stands for the min of 2 periods ago till nowRSV is essential for calculating KDJ. It takes a window parameter.
Use df['rsv']
or df['rsv_6']
to access it.
RSI chart the current and historical strength or weakness of a stock. It takes a window parameter.
The default window is 14. Use set_dft_window('rsi', n)
to tune it.
Examples:
df['rsi']
: retrieve the RSI of 14 periodsdf['rsi_6']
: retrieve the RSI of 6 periodsStochastic RSI gives traders an idea of whether the current RSI value is overbought or oversold. It takes a window parameter.
The default window is 14. Use set_dft_window('stochrsi', n)
to tune it.
Examples:
df['stochrsi']
: retrieve the Stochastic RSI of 14 periodsdf['stochrsi_6']
: retrieve the Stochastic RSI of 6 periodsRetrieve the LazyBear's Wave Trend with df['wt1']
and df['wt2']
.
Wave trend uses two parameters. You can tune them with
set_dft_window('wt', (10, 21))
.
It requires column and window.
For example, use df['close_7_smma']
to retrieve the 7 periods smoothed moving
average of the close price.
The Price Rate of Change (ROC) is a momentum-based technical indicator that measures the percentage change in price between the current price and the price a certain number of periods ago.
Formular:
ROC = (PriceP - PricePn) / PricePn * 100
Where:
You need a column name and a period to calculate ROC.
Examples:
df['close_10_roc']
: the ROC of the close price in 10 periodsdf['high_5_roc']
: the ROC of the high price in 5 periodsThe mean absolute deviation of a dataset is the average distance between each data point and the mean. It gives us an idea about the variability in a dataset.
Formular:
Example:
df['close_10_mad']
: the MAD of the close price in 10 periodsThe triple exponential average is used to identify oversold and overbought markets.
The algorithm is:
TRIX = (TripleEMA - LastTripleEMA) - * 100 / LastTripleEMA
TripleEMA = EMA of EMA of EMA
LastTripleEMA = TripleEMA of the last period
It requires column and window. By default, the column is close
,
the window is 12.
Use set_dft_window('trix', n)
to change the default window.
Examples:
df['trix']
stands for 12 periods Trix for the close price.df['middle_10_trix']
stands for the 10 periods Trix for the typical price.Tema is another implementation for the triple exponential moving average.
TEMA=(3 x EMA) - (3 x EMA of EMA) + (EMA of EMA of EMA)
It takes two parameters, column and window. By default, the column is close
,
the window is 5.
Use set_dft_window('tema', n)
to change the default window.
Examples:
df['tema']
stands for 12 periods TEMA for the close price.df['middle_10_tema']
stands for the 10 periods TEMA for the typical price.It is the strength index of the trading volume.
It has a default window of 26. Change it with set_dft_window('vr', n)
.
Examples:
df['vr']
retrieves the 26 periods VR.df['vr_6']
retrieves the 6 periods VR.Williams Overbought/Oversold index is a type of momentum indicator that moves between 0 and -100 and measures overbought and oversold levels.
It takes a window parameter. The default window is 14. Use set_dft_window('wr', n)
to change the default window.
Examples:
df['wr']
retrieves the 14 periods WR.df['wr_6']
retrieves the 6 periods WR.CCI stands for Commodity Channel Index.
It requires a window parameter. The default window is 14. Use
set_dft_window('cci', n)
to change it.
Examples:
df['cci']
retrieves the default 14 periods CCI.df['cci_6']
retrieves the 6 periods CCI.TR is a measure of the volatility of a High-Low-Close series. It is used for calculating the ATR.
The Average True Range is an
N-period smoothed moving average (SMMA) of the true range value.
Default to 14 periods.
Users can modify the default window with set_dft_window('atr', n)
.
Example:
df['atr']
retrieves the 14 periods ATR.df['atr_5']
retrieves the 5 periods ATR.Supertrend indicates the current trend.
We use the algorithm described here.
It includes 3 lines:
df['supertrend']
is the trend line.df['supertrend_ub']
is the upper band of the trenddf['supertrend_lb']
is the lower band of the trendIt has 2 parameters:
StockDataFrame.SUPERTREND_MUL
is the multiplier of the band, default to 3.set_dft_window('supertrend', n)
df['dma']
retrieves the difference of 10 periods SMA of the close price and
the 50 periods SMA of the close price.
The directional movement index (DMI) identifies in which direction the price of an asset is moving.
It has several lines:
df['pdi']
is the positive directional movement line (+DI)df['ndi']
is the negative directional movement line (-DI)df['dx']
is the directional index (DX)df['adx']
is the average directional index (ADX)df['adxr']
is an EMA for ADXIt has several parameters.
set_dft_window('pdi', n)
set_dft_window('ndi', n)
StockDataFrame.DX_SMMA
- window for DX, default to 14StockDataFrame.ADX_EMA
- window for ADX, default to 6StockDataFrame.ADXR_EMA
- window for ADXR, default to 6The stochastic oscillator is a momenxtum indicator that uses support and resistance levels.
It includes three lines:
df['kdjk']
- K seriesdf['kdjd']
- D seriesdf['kdjj']
- J seriesThe default window is 9. Use set_dft_window('kdjk', n)
to change it.
Use df['kdjk_6']
to retrieve the K series of 6 periods.
KDJ also has two configurable parameters named StockDataFrame.KDJ_PARAM
.
The default value is (2.0/3.0, 1.0/3.0)
The Energy Index (Intermediate Willingness Index) uses the relationship between the highest price, the lowest price and yesterday's middle price to reflect the market's willingness to buy and sell.
It contains 4 lines:
df['cr']
- the CR linedf['cr-ma1']
- StockDataFrame.CR_MA[0]
periods of the CR moving average,
the default window is 5df['cr-ma2']
- StockDataFrame.CR_MA[1]
periods of the CR moving average,
the default window is 10df['cr-ma3']
- StockDataFrame.CR_MA[2]
periods of the CR moving average,
the default window is 20It's the average of high
, low
and close
.
Use df['middle']
to access this value.
When amount
is available, middle = amount / volume
This should be more accurate because amount represents the total cash flow.
The Bollinger bands includes three lines
df['boll']
is the baselinedf['boll_ub']
is the upper banddf['boll_lb']
is the lower bandThe default window of boll is 20.
You can also supply your window with df['boll_10']
. It will also
generate the boll_ub_10
and boll_lb_10
column.
The default period of the Bollinger Band can be changed with
set_dft_window('boll', n)
. The width of the bands can be turned with
StockDataFrame.BOLL_STD_TIMES
. The default value is 2.
We use the close price to calculate the MACD lines.
df['macd']
is the difference between two exponential moving averages.df['macds]
is the signal line.df['macdh']
is he histogram line.The period of short, long EMA and signal line can be tuned with
set_dft_window('macd', (short, long, signal))
. The default
windows are 12 and 26 and 9.
The Percentage Price Oscillator includes three lines.
df['ppo']
derives from the difference of 2 exponential moving average.df['ppos]
is the signal line.df['ppoh']
is he histogram line.The period of short, long EMA and signal line can be tuned with
set_dft_window('ppo', (short, long, signal))
. The default
windows are 12 and 26 and 9.
Follow the pattern <columnName>_<window>_sma
to retrieve a simple moving average.
Follow the pattern <columnName>_<window>_mstd
to retrieve the moving STD.
Follow the pattern <columnName>_<window>_mvar
to retrieve the moving VAR.
It's the moving average weighted by volume.
It has a parameter for window size. The default window is 14. Change it with
set_dft_window('vwma', n)
.
Examples:
df['vwma']
retrieves the 14 periods VWMAdf['vwma_6']
retrieves the 6 periods VWMAThe Choppiness Index determines if the market is choppy.
It has a parameter for window size. The default window is 14. Change it with
set_dft_window('chop', n)
.
Examples:
df['chop']
retrieves the 14 periods CHOPdf['chop_6']
retrieves the 6 periods CHOPThe Money Flow Index identifies overbought or oversold signals in an asset.
It has a parameter for window size. The default window is 14. Change it with
set_dft_window('mfi', n)
.
Examples:
df['mfi']
retrieves the 14 periods MFIdf['mfi_6']
retrieves the 6 periods MFIThe Elder-Ray Index contains the bull and the bear power. Both are calculated based on the EMA of the close price.
The default window is 13.
Formular:
Examples:
df['eribull']
retrieves the 13 periods bull powerdf['eribear']
retrieves the 13 periods bear powerdf['eribull_5']
retrieves the 5 periods bull powerdf['eribear_5']
retrieves the 5 periods bear powerThe Efficiency Ratio (ER) is calculated by dividing the price change over a period by the absolute sum of the price movements that occurred to achieve that change.
The resulting ratio ranges between 0 and 1 with higher values representing a more efficient or trending market.
The default column is close.
The default window is 10.
Formular:
Examples:
df['ker']
retrieves the 10 periods KER of the close pricedf['high_5_ker']
retrieves 5 periods KER of the high priceKaufman's Adaptive Moving Average is designed to account for market noise or volatility.
It has 2 optional parameters and 2 required parameters
The default value for window, fast and slow can be configured with
set_dft_window('kama', (10, 5, 34))
Examples:
df['close_10,2,30_kama']
retrieves 10 periods KAMA of the close
price with fast = 2
and slow = 30
df['close_2_kama']
retrieves 2 periods KAMA of the close price
with default fast and slowUse the pattern <A>_xu_<B>
to check when A crosses up B.
Use the pattern <A>_xd_<B>
to check when A crosses down B.
Use the pattern <A>_x_<B>
to check when A crosses B.
Examples:
kdjk_x_kdjd
returns a series that marks the cross of KDJK and KDJDkdjk_xu_kdjd
returns a series that marks where KDJK crosses up KDJDkdjk_xd_kdjd
returns a series that marks where KDJD crosses down KDJDThe Aroon Oscillator measures the strength of a trend and the likelihood that it will continue.
The default window is 25.
Examples:
df['aroon']
returns Aroon oscillator with a window of 25df['aroon_14']
returns Aroon oscillator with a window of 14Z-score is a statistical measurement that describes a value's relationship to the mean of a group of values.
There is no default column name or window for Z-Score.
The statistical formula for a value's z-score is calculated using the following formula:
z = ( x - μ ) / σ
Where:
z
= Z-scorex
= the value being evaluatedμ
= the meanσ
= the standard deviationExamples:
df['close_75_z']
returns the Z-Score of close price with a window of 75The AO indicator is a good indicator for measuring the market dynamics, it reflects specific changes in the driving force of the market, which helps to identify the strength of the trend, including the points of its formation and reversal.
Awesome Oscillator Formula
Examples:
df['ao']
returns the Awesome Oscillator with default windows (5, 34)df['ao_3,10']
returns the Awesome Oscillator with a window of 3 and 10Balance of Power (BOP) measures the strength of the bulls vs. bears.
Formular:
BOP = (close - open) / (high - low)
Example:
df['bop']
returns the Balance of PowerThe Chande Momentum Oscillator (CMO) is a technical momentum indicator developed by Tushar Chande.
The formula calculates the difference between the sum of recent gains and the sum of recent losses and then divides the result by the sum of all price movements over the same period.
The default window is 14.
Formular:
CMO = 100 * ((sH - sL) / (sH + sL))
where:
Examples:
df['cmo']
returns the CMO with a window of 14df['cmo_5']
returns the CMO with a window of 5Coppock Curve is a momentum indicator that signals long-term trend reversals.
Formular:
Coppock Curve = 10-period WMA of (14-period RoC + 11-period RoC) WMA = Weighted Moving Average RoC = Rate-of-Change
Examples:
df['coppock']
returns the Coppock Curve with default windowsdf['coppock_5,10,15']
returns the Coppock Curve with WMA window 5,
fast window 10, slow window 15. The Ichimoku Cloud is a collection of technical indicators that show support and resistance levels, as well as momentum and trend direction.
In this implementation, we only calculate the delta between lead A and lead B (which is the width of the cloud).
It contains three windows:
Formular:
Where:
Examples:
df['ichimoku']
returns the ichimoku cloud width with default windowsdf['ichimoku_7,22,44']
returns the ichimoku cloud width with window sizes
7, 22, 44Linear regression works by taking various data points in a sample and providing a “best fit” line to match the general trend in the data.
Implementation reference:
https://github.com/twopirllc/pandas-ta/blob/main/pandas_ta/overlap/linreg.py
Examples:
df['close_10_lrma']
linear regression of close price with window size 10Correlation Trend Indicator is a study that estimates the current direction and strength of a trend.
Implementation is based on the following code:
https://github.com/twopirllc/pandas-ta/blob/main/pandas_ta/momentum/cti.py
Examples:
df['cti']
returns the CTI of close price with window 12df['high_5_cti']
returns the CTI of high price with window 5The Gaussian Fisher Transform Price Reversals indicator, dubbed FTR for short, is a stat based price reversal detection indicator inspired by and based on the work of the electrical engineer now private trader John F. Ehlers.
https://www.tradingview.com/script/ajZT2tZo-Gaussian-Fisher-Transform-Price-Reversals-FTR/
Implementation reference:
Formular:
Examples:
df['ftr']
returns the FTR with window 9df['ftr_20']
returns the FTR with window 20The Relative Vigor Index (RVI) is a momentum indicator used in technical analysis that measures the strength of a trend by comparing a security's closing price to its trading range while smoothing the results using a simple moving average (SMA).
Formular
where:
Examples:
df['rvgi']
retrieves the RVGI line of window 14df['rvgis']
retrieves the RVGI signal line of window 14df['rvgi_5']
retrieves the RVGI line of window 5df['rvgis_5']
retrieves the RVGI signal line of window 5In financial markets, the concept of inertia was given by Donald Dorsey in the 1995 issue of Technical Analysis of Stocks and Commodities through the Inertia Indicator. The Inertia Indicator is moment-based and is an extension of Dorsey’s Relative Volatility Index (RVI).
Formular:
Examples:
df['inertia']
retrieves the inertia of 20 periods linear regression of 14 periods RVGIdf['inertia_10']
retrieves the inertia of 10 periods linear regression of 14 periods RVGIThe Know Sure Thing (KST) is a momentum oscillator developed by Martin Pring to make rate-of-change readings easier for traders to interpret.
Formular:
Where:
Example:
df['kst']
retrieves the KST.The Pretty Good Oscillator indicator by Mark Johnson measures the distance of the current close from its N-day simple moving average, expressed in terms of an average true range over a similar period.
Formular:
Example:
df['pgo']
retrieves the PGO with default window 14.df['pgo_10']
retrieves the PGO with window 10.The Psychological Line indicator is the ratio of the number of rising periods over the total number of periods.
Formular:
Example:
df['psl']
retrieves the PSL with default window 12.df['psl_10']
retrieves the PSL with window 10.df['high_12_psl']
retrieves the PSL of high price with window 10.The Percentage Volume Oscillator (PVO) is a momentum oscillator for volume. The PVO measures the difference between two volume-based moving averages as a percentage of the larger moving average.
Formular:
Example:
df['pvo']
derives from the difference of 2 exponential moving average.df['pvos]
is the signal line.df['pvoh']
is he histogram line.The period of short, long EMA and signal line can be tuned with
set_dft_window('pvo', (short, long, signal))
. The default
windows are 12 and 26 and 9.
The Qualitative Quantitative Estimation (QQE) indicator works like a smoother version of the popular Relative Strength Index (RSI) indicator. QQE expands on RSI by adding two volatility based trailing stop lines. These trailing stop lines are composed of a fast and a slow moving Average True Range (ATR). These ATR lines are smoothed making this indicator less susceptible to short term volatility.
Implementation reference: https://github.com/twopirllc/pandas-ta/blob/main/pandas_ta/momentum/qqe.py
Example:
df['qqe']
retrieves the QQE with RSI window 14, MA window 5.df['qqel']
retrieves the QQE longdf['qqes']
retrieves the QQE shortdf['qqe_10,4']
retrieves the QQE with RSI window 10, MA window 4df['qqel_10,4']
retrieves the QQE long with customized windows.
Initialized by retrieving df['qqe_10,4']
df['qqes_10,4']
retrieves the QQE short with customized windows
Initialized by retrieving df['qqe_10,4']
The period of short, long EMA and signal line can be tuned with
set_dft_window('qqe', (rsi, rsi_ma))
. The default windows are 14 and 5.
We use Github Issues to track the issues or bugs.
MACDH Note:
In July 2017 the code for MACDH was changed to drop an extra 2x multiplier on the final value to align better with calculation methods used in tools like cryptowatch, tradingview, etc.