1012 lines
32 KiB
Python
1012 lines
32 KiB
Python
"""
|
||
.. module:: volatility
|
||
:synopsis: Volatility Indicators.
|
||
|
||
.. moduleauthor:: Dario Lopez Padial (Bukosabino)
|
||
|
||
"""
|
||
import numpy as np
|
||
import pandas as pd
|
||
|
||
from ta.utils import IndicatorMixin
|
||
|
||
|
||
class AverageTrueRange(IndicatorMixin):
|
||
"""Average True Range (ATR)
|
||
|
||
The indicator provide an indication of the degree of price volatility.
|
||
Strong moves, in either direction, are often accompanied by large ranges,
|
||
or large True Ranges.
|
||
|
||
http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:average_true_range_atr
|
||
|
||
Args:
|
||
high(pandas.Series): dataset 'High' column.
|
||
low(pandas.Series): dataset 'Low' column.
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
fillna(bool): if True, fill nan values.
|
||
"""
|
||
|
||
def __init__(
|
||
self,
|
||
high: pd.Series,
|
||
low: pd.Series,
|
||
close: pd.Series,
|
||
window: int = 14,
|
||
fillna: bool = False,
|
||
):
|
||
self._high = high
|
||
self._low = low
|
||
self._close = close
|
||
self._window = window
|
||
self._fillna = fillna
|
||
self._run()
|
||
|
||
def _run(self):
|
||
close_shift = self._close.shift(1)
|
||
true_range = self._true_range(self._high, self._low, close_shift)
|
||
atr = np.zeros(len(self._close))
|
||
atr[self._window - 1] = true_range[0 : self._window].mean()
|
||
for i in range(self._window, len(atr)):
|
||
atr[i] = (atr[i - 1] * (self._window - 1) + true_range.iloc[i]) / float(
|
||
self._window
|
||
)
|
||
self._atr = pd.Series(data=atr, index=true_range.index)
|
||
|
||
def average_true_range(self) -> pd.Series:
|
||
"""Average True Range (ATR)
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
atr = self._check_fillna(self._atr, value=0)
|
||
return pd.Series(atr, name="atr")
|
||
|
||
|
||
class BollingerBands(IndicatorMixin):
|
||
"""Bollinger Bands
|
||
|
||
https://school.stockcharts.com/doku.php?id=technical_indicators:bollinger_bands
|
||
|
||
Args:
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
window_dev(int): n factor standard deviation
|
||
fillna(bool): if True, fill nan values.
|
||
"""
|
||
|
||
def __init__(
|
||
self,
|
||
close: pd.Series,
|
||
window: int = 20,
|
||
window_dev: int = 2,
|
||
fillna: bool = False,
|
||
):
|
||
self._close = close
|
||
self._window = window
|
||
self._window_dev = window_dev
|
||
self._fillna = fillna
|
||
self._run()
|
||
|
||
def _run(self):
|
||
min_periods = 0 if self._fillna else self._window
|
||
self._mavg = self._close.rolling(self._window, min_periods=min_periods).mean()
|
||
self._mstd = self._close.rolling(self._window, min_periods=min_periods).std(
|
||
ddof=0
|
||
)
|
||
self._hband = self._mavg + self._window_dev * self._mstd
|
||
self._lband = self._mavg - self._window_dev * self._mstd
|
||
|
||
def bollinger_mavg(self) -> pd.Series:
|
||
"""Bollinger Channel Middle Band
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
mavg = self._check_fillna(self._mavg, value=-1)
|
||
return pd.Series(mavg, name="mavg")
|
||
|
||
def bollinger_hband(self) -> pd.Series:
|
||
"""Bollinger Channel High Band
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
hband = self._check_fillna(self._hband, value=-1)
|
||
return pd.Series(hband, name="hband")
|
||
|
||
def bollinger_lband(self) -> pd.Series:
|
||
"""Bollinger Channel Low Band
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
lband = self._check_fillna(self._lband, value=-1)
|
||
return pd.Series(lband, name="lband")
|
||
|
||
def bollinger_wband(self) -> pd.Series:
|
||
"""Bollinger Channel Band Width
|
||
|
||
From: https://school.stockcharts.com/doku.php?id=technical_indicators:bollinger_band_width
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
wband = ((self._hband - self._lband) / self._mavg) * 100
|
||
wband = self._check_fillna(wband, value=0)
|
||
return pd.Series(wband, name="bbiwband")
|
||
|
||
def bollinger_pband(self) -> pd.Series:
|
||
"""Bollinger Channel Percentage Band
|
||
|
||
From: https://school.stockcharts.com/doku.php?id=technical_indicators:bollinger_band_perce
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
pband = (self._close - self._lband) / (self._hband - self._lband).where(
|
||
self._hband != self._lband, np.nan
|
||
)
|
||
pband = self._check_fillna(pband, value=0)
|
||
return pd.Series(pband, name="bbipband")
|
||
|
||
def bollinger_hband_indicator(self) -> pd.Series:
|
||
"""Bollinger Channel Indicator Crossing High Band (binary).
|
||
|
||
It returns 1, if close is higher than bollinger_hband. Else, it returns 0.
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
hband = pd.Series(
|
||
np.where(self._close > self._hband, 1.0, 0.0), index=self._close.index
|
||
)
|
||
hband = self._check_fillna(hband, value=0)
|
||
return pd.Series(hband, index=self._close.index, name="bbihband")
|
||
|
||
def bollinger_lband_indicator(self) -> pd.Series:
|
||
"""Bollinger Channel Indicator Crossing Low Band (binary).
|
||
|
||
It returns 1, if close is lower than bollinger_lband. Else, it returns 0.
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
lband = pd.Series(
|
||
np.where(self._close < self._lband, 1.0, 0.0), index=self._close.index
|
||
)
|
||
lband = self._check_fillna(lband, value=0)
|
||
return pd.Series(lband, name="bbilband")
|
||
|
||
|
||
class KeltnerChannel(IndicatorMixin):
|
||
"""KeltnerChannel
|
||
|
||
Keltner Channels are a trend following indicator used to identify reversals with channel breakouts and
|
||
channel direction. Channels can also be used to identify overbought and oversold levels when the trend
|
||
is flat.
|
||
|
||
https://school.stockcharts.com/doku.php?id=technical_indicators:keltner_channels
|
||
|
||
Args:
|
||
high(pandas.Series): dataset 'High' column.
|
||
low(pandas.Series): dataset 'Low' column.
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
window_atr(int): n atr period. Only valid if original_version param is False.
|
||
fillna(bool): if True, fill nan values.
|
||
original_version(bool): if True, use original version as the centerline (SMA of typical price)
|
||
if False, use EMA of close as the centerline. More info:
|
||
https://school.stockcharts.com/doku.php?id=technical_indicators:keltner_channels
|
||
multiplier(int): The multiplier has the most effect on the channel width. default is 2
|
||
"""
|
||
|
||
def __init__(
|
||
self,
|
||
high: pd.Series,
|
||
low: pd.Series,
|
||
close: pd.Series,
|
||
window: int = 20,
|
||
window_atr: int = 10,
|
||
fillna: bool = False,
|
||
original_version: bool = True,
|
||
multiplier: int = 2,
|
||
):
|
||
self._high = high
|
||
self._low = low
|
||
self._close = close
|
||
self._window = window
|
||
self._window_atr = window_atr
|
||
self._fillna = fillna
|
||
self._original_version = original_version
|
||
self._multiplier = multiplier
|
||
self._run()
|
||
|
||
def _run(self):
|
||
min_periods = 1 if self._fillna else self._window
|
||
if self._original_version:
|
||
self._tp = (
|
||
((self._high + self._low + self._close) / 3.0)
|
||
.rolling(self._window, min_periods=min_periods)
|
||
.mean()
|
||
)
|
||
self._tp_high = (
|
||
(((4 * self._high) - (2 * self._low) + self._close) / 3.0)
|
||
.rolling(self._window, min_periods=0)
|
||
.mean()
|
||
)
|
||
self._tp_low = (
|
||
(((-2 * self._high) + (4 * self._low) + self._close) / 3.0)
|
||
.rolling(self._window, min_periods=0)
|
||
.mean()
|
||
)
|
||
else:
|
||
self._tp = self._close.ewm(
|
||
span=self._window, min_periods=min_periods, adjust=False
|
||
).mean()
|
||
atr = AverageTrueRange(
|
||
close=self._close,
|
||
high=self._high,
|
||
low=self._low,
|
||
window=self._window_atr,
|
||
fillna=self._fillna,
|
||
).average_true_range()
|
||
self._tp_high = self._tp + (self._multiplier * atr)
|
||
self._tp_low = self._tp - (self._multiplier * atr)
|
||
|
||
def keltner_channel_mband(self) -> pd.Series:
|
||
"""Keltner Channel Middle Band
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
tp_middle = self._check_fillna(self._tp, value=-1)
|
||
return pd.Series(tp_middle, name="mavg")
|
||
|
||
def keltner_channel_hband(self) -> pd.Series:
|
||
"""Keltner Channel High Band
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
tp_high = self._check_fillna(self._tp_high, value=-1)
|
||
return pd.Series(tp_high, name="kc_hband")
|
||
|
||
def keltner_channel_lband(self) -> pd.Series:
|
||
"""Keltner Channel Low Band
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
tp_low = self._check_fillna(self._tp_low, value=-1)
|
||
return pd.Series(tp_low, name="kc_lband")
|
||
|
||
def keltner_channel_wband(self) -> pd.Series:
|
||
"""Keltner Channel Band Width
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
wband = ((self._tp_high - self._tp_low) / self._tp) * 100
|
||
wband = self._check_fillna(wband, value=0)
|
||
return pd.Series(wband, name="bbiwband")
|
||
|
||
def keltner_channel_pband(self) -> pd.Series:
|
||
"""Keltner Channel Percentage Band
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
pband = (self._close - self._tp_low) / (self._tp_high - self._tp_low)
|
||
pband = self._check_fillna(pband, value=0)
|
||
return pd.Series(pband, name="bbipband")
|
||
|
||
def keltner_channel_hband_indicator(self) -> pd.Series:
|
||
"""Keltner Channel Indicator Crossing High Band (binary)
|
||
|
||
It returns 1, if close is higher than keltner_channel_hband. Else, it returns 0.
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
hband = pd.Series(
|
||
np.where(self._close > self._tp_high, 1.0, 0.0), index=self._close.index
|
||
)
|
||
hband = self._check_fillna(hband, value=0)
|
||
return pd.Series(hband, name="dcihband")
|
||
|
||
def keltner_channel_lband_indicator(self) -> pd.Series:
|
||
"""Keltner Channel Indicator Crossing Low Band (binary)
|
||
|
||
It returns 1, if close is lower than keltner_channel_lband. Else, it returns 0.
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
lband = pd.Series(
|
||
np.where(self._close < self._tp_low, 1.0, 0.0), index=self._close.index
|
||
)
|
||
lband = self._check_fillna(lband, value=0)
|
||
return pd.Series(lband, name="dcilband")
|
||
|
||
|
||
class DonchianChannel(IndicatorMixin):
|
||
"""Donchian Channel
|
||
|
||
https://www.investopedia.com/terms/d/donchianchannels.asp
|
||
|
||
Args:
|
||
high(pandas.Series): dataset 'High' column.
|
||
low(pandas.Series): dataset 'Low' column.
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
fillna(bool): if True, fill nan values.
|
||
"""
|
||
|
||
def __init__(
|
||
self,
|
||
high: pd.Series,
|
||
low: pd.Series,
|
||
close: pd.Series,
|
||
window: int = 20,
|
||
offset: int = 0,
|
||
fillna: bool = False,
|
||
):
|
||
self._offset = offset
|
||
self._close = close
|
||
self._high = high
|
||
self._low = low
|
||
self._window = window
|
||
self._fillna = fillna
|
||
self._run()
|
||
|
||
def _run(self):
|
||
self._min_periods = 1 if self._fillna else self._window
|
||
self._hband = self._high.rolling(
|
||
self._window, min_periods=self._min_periods
|
||
).max()
|
||
self._lband = self._low.rolling(
|
||
self._window, min_periods=self._min_periods
|
||
).min()
|
||
|
||
def donchian_channel_hband(self) -> pd.Series:
|
||
"""Donchian Channel High Band
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
hband = self._check_fillna(self._hband, value=-1)
|
||
if self._offset != 0:
|
||
hband = hband.shift(self._offset)
|
||
return pd.Series(hband, name="dchband")
|
||
|
||
def donchian_channel_lband(self) -> pd.Series:
|
||
"""Donchian Channel Low Band
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
lband = self._check_fillna(self._lband, value=-1)
|
||
if self._offset != 0:
|
||
lband = lband.shift(self._offset)
|
||
return pd.Series(lband, name="dclband")
|
||
|
||
def donchian_channel_mband(self) -> pd.Series:
|
||
"""Donchian Channel Middle Band
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
mband = ((self._hband - self._lband) / 2.0) + self._lband
|
||
mband = self._check_fillna(mband, value=-1)
|
||
if self._offset != 0:
|
||
mband = mband.shift(self._offset)
|
||
return pd.Series(mband, name="dcmband")
|
||
|
||
def donchian_channel_wband(self) -> pd.Series:
|
||
"""Donchian Channel Band Width
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
mavg = self._close.rolling(self._window, min_periods=self._min_periods).mean()
|
||
wband = ((self._hband - self._lband) / mavg) * 100
|
||
wband = self._check_fillna(wband, value=0)
|
||
if self._offset != 0:
|
||
wband = wband.shift(self._offset)
|
||
return pd.Series(wband, name="dcwband")
|
||
|
||
def donchian_channel_pband(self) -> pd.Series:
|
||
"""Donchian Channel Percentage Band
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
pband = (self._close - self._lband) / (self._hband - self._lband)
|
||
pband = self._check_fillna(pband, value=0)
|
||
if self._offset != 0:
|
||
pband = pband.shift(self._offset)
|
||
return pd.Series(pband, name="dcpband")
|
||
|
||
|
||
class UlcerIndex(IndicatorMixin):
|
||
"""Ulcer Index
|
||
|
||
https://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:ulcer_index
|
||
|
||
Args:
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
fillna(bool): if True, fill nan values.
|
||
"""
|
||
|
||
def __init__(self, close: pd.Series, window: int = 14, fillna: bool = False):
|
||
self._close = close
|
||
self._window = window
|
||
self._fillna = fillna
|
||
self._run()
|
||
|
||
def _run(self):
|
||
_ui_max = self._close.rolling(self._window, min_periods=1).max()
|
||
_r_i = 100 * (self._close - _ui_max) / _ui_max
|
||
|
||
def ui_function():
|
||
def _ui_function(x):
|
||
return np.sqrt((x**2 / self._window).sum())
|
||
|
||
return _ui_function
|
||
|
||
self._ulcer_idx = _r_i.rolling(self._window).apply(ui_function(), raw=True)
|
||
|
||
def ulcer_index(self) -> pd.Series:
|
||
"""Ulcer Index (UI)
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
ulcer_idx = self._check_fillna(self._ulcer_idx)
|
||
return pd.Series(ulcer_idx, name="ui")
|
||
|
||
|
||
def average_true_range(high, low, close, window=14, fillna=False):
|
||
"""Average True Range (ATR)
|
||
|
||
The indicator provide an indication of the degree of price volatility.
|
||
Strong moves, in either direction, are often accompanied by large ranges,
|
||
or large True Ranges.
|
||
|
||
http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:average_true_range_atr
|
||
|
||
Args:
|
||
high(pandas.Series): dataset 'High' column.
|
||
low(pandas.Series): dataset 'Low' column.
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
fillna(bool): if True, fill nan values.
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
indicator = AverageTrueRange(
|
||
high=high, low=low, close=close, window=window, fillna=fillna
|
||
)
|
||
return indicator.average_true_range()
|
||
|
||
|
||
def bollinger_mavg(close, window=20, fillna=False):
|
||
"""Bollinger Bands (BB)
|
||
|
||
N-period simple moving average (MA).
|
||
|
||
https://en.wikipedia.org/wiki/Bollinger_Bands
|
||
|
||
Args:
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
fillna(bool): if True, fill nan values.
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
indicator = BollingerBands(close=close, window=window, fillna=fillna)
|
||
return indicator.bollinger_mavg()
|
||
|
||
|
||
def bollinger_hband(close, window=20, window_dev=2, fillna=False):
|
||
"""Bollinger Bands (BB)
|
||
|
||
Upper band at K times an N-period standard deviation above the moving
|
||
average (MA + Kdeviation).
|
||
|
||
https://en.wikipedia.org/wiki/Bollinger_Bands
|
||
|
||
Args:
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
window_dev(int): n factor standard deviation
|
||
fillna(bool): if True, fill nan values.
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
indicator = BollingerBands(
|
||
close=close, window=window, window_dev=window_dev, fillna=fillna
|
||
)
|
||
return indicator.bollinger_hband()
|
||
|
||
|
||
def bollinger_lband(close, window=20, window_dev=2, fillna=False):
|
||
"""Bollinger Bands (BB)
|
||
|
||
Lower band at K times an N-period standard deviation below the moving
|
||
average (MA − Kdeviation).
|
||
|
||
https://en.wikipedia.org/wiki/Bollinger_Bands
|
||
|
||
Args:
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
window_dev(int): n factor standard deviation
|
||
fillna(bool): if True, fill nan values.
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
indicator = BollingerBands(
|
||
close=close, window=window, window_dev=window_dev, fillna=fillna
|
||
)
|
||
return indicator.bollinger_lband()
|
||
|
||
|
||
def bollinger_wband(close, window=20, window_dev=2, fillna=False):
|
||
"""Bollinger Channel Band Width
|
||
|
||
From: https://school.stockcharts.com/doku.php?id=technical_indicators:bollinger_band_width
|
||
|
||
Args:
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
window_dev(int): n factor standard deviation
|
||
fillna(bool): if True, fill nan values.
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
indicator = BollingerBands(
|
||
close=close, window=window, window_dev=window_dev, fillna=fillna
|
||
)
|
||
return indicator.bollinger_wband()
|
||
|
||
|
||
def bollinger_pband(close, window=20, window_dev=2, fillna=False):
|
||
"""Bollinger Channel Percentage Band
|
||
|
||
From: https://school.stockcharts.com/doku.php?id=technical_indicators:bollinger_band_perce
|
||
|
||
Args:
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
window_dev(int): n factor standard deviation
|
||
fillna(bool): if True, fill nan values.
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
indicator = BollingerBands(
|
||
close=close, window=window, window_dev=window_dev, fillna=fillna
|
||
)
|
||
return indicator.bollinger_pband()
|
||
|
||
|
||
def bollinger_hband_indicator(close, window=20, window_dev=2, fillna=False):
|
||
"""Bollinger High Band Indicator
|
||
|
||
Returns 1, if close is higher than bollinger high band. Else, return 0.
|
||
|
||
https://en.wikipedia.org/wiki/Bollinger_Bands
|
||
|
||
Args:
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
window_dev(int): n factor standard deviation
|
||
fillna(bool): if True, fill nan values.
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
indicator = BollingerBands(
|
||
close=close, window=window, window_dev=window_dev, fillna=fillna
|
||
)
|
||
return indicator.bollinger_hband_indicator()
|
||
|
||
|
||
def bollinger_lband_indicator(close, window=20, window_dev=2, fillna=False):
|
||
"""Bollinger Low Band Indicator
|
||
|
||
Returns 1, if close is lower than bollinger low band. Else, return 0.
|
||
|
||
https://en.wikipedia.org/wiki/Bollinger_Bands
|
||
|
||
Args:
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
window_dev(int): n factor standard deviation
|
||
fillna(bool): if True, fill nan values.
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
indicator = BollingerBands(
|
||
close=close, window=window, window_dev=window_dev, fillna=fillna
|
||
)
|
||
return indicator.bollinger_lband_indicator()
|
||
|
||
|
||
def keltner_channel_mband(
|
||
high, low, close, window=20, window_atr=10, fillna=False, original_version=True
|
||
):
|
||
"""Keltner channel (KC)
|
||
|
||
Showing a simple moving average line (central) of typical price.
|
||
|
||
https://school.stockcharts.com/doku.php?id=technical_indicators:keltner_channels
|
||
|
||
Args:
|
||
high(pandas.Series): dataset 'High' column.
|
||
low(pandas.Series): dataset 'Low' column.
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
window_atr(int): n atr period. Only valid if original_version param is False.
|
||
fillna(bool): if True, fill nan values.
|
||
original_version(bool): if True, use original version as the centerline (SMA of typical price)
|
||
if False, use EMA of close as the centerline. More info:
|
||
https://school.stockcharts.com/doku.php?id=technical_indicators:keltner_channels
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
indicator = KeltnerChannel(
|
||
high=high,
|
||
low=low,
|
||
close=close,
|
||
window=window,
|
||
window_atr=window_atr,
|
||
fillna=fillna,
|
||
original_version=original_version,
|
||
)
|
||
return indicator.keltner_channel_mband()
|
||
|
||
|
||
def keltner_channel_hband(
|
||
high, low, close, window=20, window_atr=10, fillna=False, original_version=True
|
||
):
|
||
"""Keltner channel (KC)
|
||
|
||
Showing a simple moving average line (high) of typical price.
|
||
|
||
https://school.stockcharts.com/doku.php?id=technical_indicators:keltner_channels
|
||
|
||
Args:
|
||
high(pandas.Series): dataset 'High' column.
|
||
low(pandas.Series): dataset 'Low' column.
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
window_atr(int): n atr period. Only valid if original_version param is False.
|
||
fillna(bool): if True, fill nan values.
|
||
original_version(bool): if True, use original version as the centerline (SMA of typical price)
|
||
if False, use EMA of close as the centerline. More info:
|
||
https://school.stockcharts.com/doku.php?id=technical_indicators:keltner_channels
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
indicator = KeltnerChannel(
|
||
high=high,
|
||
low=low,
|
||
close=close,
|
||
window=window,
|
||
window_atr=window_atr,
|
||
fillna=fillna,
|
||
original_version=original_version,
|
||
)
|
||
return indicator.keltner_channel_hband()
|
||
|
||
|
||
def keltner_channel_lband(
|
||
high, low, close, window=20, window_atr=10, fillna=False, original_version=True
|
||
):
|
||
"""Keltner channel (KC)
|
||
|
||
Showing a simple moving average line (low) of typical price.
|
||
|
||
https://school.stockcharts.com/doku.php?id=technical_indicators:keltner_channels
|
||
|
||
Args:
|
||
high(pandas.Series): dataset 'High' column.
|
||
low(pandas.Series): dataset 'Low' column.
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
window_atr(int): n atr period. Only valid if original_version param is False.
|
||
fillna(bool): if True, fill nan values.
|
||
original_version(bool): if True, use original version as the centerline (SMA of typical price)
|
||
if False, use EMA of close as the centerline. More info:
|
||
https://school.stockcharts.com/doku.php?id=technical_indicators:keltner_channels
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
indicator = KeltnerChannel(
|
||
high=high,
|
||
low=low,
|
||
close=close,
|
||
window=window,
|
||
window_atr=window_atr,
|
||
fillna=fillna,
|
||
original_version=original_version,
|
||
)
|
||
return indicator.keltner_channel_lband()
|
||
|
||
|
||
def keltner_channel_wband(
|
||
high, low, close, window=20, window_atr=10, fillna=False, original_version=True
|
||
):
|
||
"""Keltner Channel Band Width
|
||
|
||
https://school.stockcharts.com/doku.php?id=technical_indicators:keltner_channels
|
||
|
||
Args:
|
||
high(pandas.Series): dataset 'High' column.
|
||
low(pandas.Series): dataset 'Low' column.
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
window_atr(int): n atr period. Only valid if original_version param is False.
|
||
fillna(bool): if True, fill nan values.
|
||
original_version(bool): if True, use original version as the centerline (SMA of typical price)
|
||
if False, use EMA of close as the centerline. More info:
|
||
https://school.stockcharts.com/doku.php?id=technical_indicators:keltner_channels
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
indicator = KeltnerChannel(
|
||
high=high,
|
||
low=low,
|
||
close=close,
|
||
window=window,
|
||
window_atr=window_atr,
|
||
fillna=fillna,
|
||
original_version=original_version,
|
||
)
|
||
return indicator.keltner_channel_wband()
|
||
|
||
|
||
def keltner_channel_pband(
|
||
high, low, close, window=20, window_atr=10, fillna=False, original_version=True
|
||
):
|
||
"""Keltner Channel Percentage Band
|
||
|
||
https://school.stockcharts.com/doku.php?id=technical_indicators:keltner_channels
|
||
|
||
Args:
|
||
high(pandas.Series): dataset 'High' column.
|
||
low(pandas.Series): dataset 'Low' column.
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
window_atr(int): n atr period. Only valid if original_version param is False.
|
||
fillna(bool): if True, fill nan values.
|
||
original_version(bool): if True, use original version as the centerline (SMA of typical price)
|
||
if False, use EMA of close as the centerline. More info:
|
||
https://school.stockcharts.com/doku.php?id=technical_indicators:keltner_channels
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
indicator = KeltnerChannel(
|
||
high=high,
|
||
low=low,
|
||
close=close,
|
||
window=window,
|
||
window_atr=window_atr,
|
||
fillna=fillna,
|
||
original_version=original_version,
|
||
)
|
||
return indicator.keltner_channel_pband()
|
||
|
||
|
||
def keltner_channel_hband_indicator(
|
||
high, low, close, window=20, window_atr=10, fillna=False, original_version=True
|
||
):
|
||
"""Keltner Channel High Band Indicator (KC)
|
||
|
||
Returns 1, if close is higher than keltner high band channel. Else,
|
||
return 0.
|
||
|
||
https://school.stockcharts.com/doku.php?id=technical_indicators:keltner_channels
|
||
|
||
Args:
|
||
high(pandas.Series): dataset 'High' column.
|
||
low(pandas.Series): dataset 'Low' column.
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
window_atr(int): n atr period. Only valid if original_version param is False.
|
||
fillna(bool): if True, fill nan values.
|
||
original_version(bool): if True, use original version as the centerline (SMA of typical price)
|
||
if False, use EMA of close as the centerline. More info:
|
||
https://school.stockcharts.com/doku.php?id=technical_indicators:keltner_channels
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
indicator = KeltnerChannel(
|
||
high=high,
|
||
low=low,
|
||
close=close,
|
||
window=window,
|
||
window_atr=window_atr,
|
||
fillna=fillna,
|
||
original_version=original_version,
|
||
)
|
||
return indicator.keltner_channel_hband_indicator()
|
||
|
||
|
||
def keltner_channel_lband_indicator(
|
||
high, low, close, window=20, window_atr=10, fillna=False, original_version=True
|
||
):
|
||
"""Keltner Channel Low Band Indicator (KC)
|
||
|
||
Returns 1, if close is lower than keltner low band channel. Else, return 0.
|
||
|
||
https://school.stockcharts.com/doku.php?id=technical_indicators:keltner_channels
|
||
|
||
Args:
|
||
high(pandas.Series): dataset 'High' column.
|
||
low(pandas.Series): dataset 'Low' column.
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
window_atr(int): n atr period. Only valid if original_version param is False.
|
||
fillna(bool): if True, fill nan values.
|
||
original_version(bool): if True, use original version as the centerline (SMA of typical price)
|
||
if False, use EMA of close as the centerline. More info:
|
||
https://school.stockcharts.com/doku.php?id=technical_indicators:keltner_channels
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
indicator = KeltnerChannel(
|
||
high=high,
|
||
low=low,
|
||
close=close,
|
||
window=window,
|
||
window_atr=window_atr,
|
||
fillna=fillna,
|
||
original_version=original_version,
|
||
)
|
||
return indicator.keltner_channel_lband_indicator()
|
||
|
||
|
||
def donchian_channel_hband(high, low, close, window=20, offset=0, fillna=False):
|
||
"""Donchian Channel High Band (DC)
|
||
|
||
The upper band marks the highest price of an issue for n periods.
|
||
|
||
https://www.investopedia.com/terms/d/donchianchannels.asp
|
||
|
||
Args:
|
||
high(pandas.Series): dataset 'High' column.
|
||
low(pandas.Series): dataset 'Low' column.
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
fillna(bool): if True, fill nan values.
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
indicator = DonchianChannel(
|
||
high=high, low=low, close=close, window=window, offset=offset, fillna=fillna
|
||
)
|
||
return indicator.donchian_channel_hband()
|
||
|
||
|
||
def donchian_channel_lband(high, low, close, window=20, offset=0, fillna=False):
|
||
"""Donchian Channel Low Band (DC)
|
||
|
||
The lower band marks the lowest price for n periods.
|
||
|
||
https://www.investopedia.com/terms/d/donchianchannels.asp
|
||
|
||
Args:
|
||
high(pandas.Series): dataset 'High' column.
|
||
low(pandas.Series): dataset 'Low' column.
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
fillna(bool): if True, fill nan values.
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
indicator = DonchianChannel(
|
||
high=high, low=low, close=close, window=window, offset=offset, fillna=fillna
|
||
)
|
||
return indicator.donchian_channel_lband()
|
||
|
||
|
||
def donchian_channel_mband(high, low, close, window=10, offset=0, fillna=False):
|
||
"""Donchian Channel Middle Band (DC)
|
||
|
||
https://www.investopedia.com/terms/d/donchianchannels.asp
|
||
|
||
Args:
|
||
high(pandas.Series): dataset 'High' column.
|
||
low(pandas.Series): dataset 'Low' column.
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
fillna(bool): if True, fill nan values.
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
indicator = DonchianChannel(
|
||
high=high, low=low, close=close, window=window, offset=offset, fillna=fillna
|
||
)
|
||
return indicator.donchian_channel_mband()
|
||
|
||
|
||
def donchian_channel_wband(high, low, close, window=10, offset=0, fillna=False):
|
||
"""Donchian Channel Band Width (DC)
|
||
|
||
https://www.investopedia.com/terms/d/donchianchannels.asp
|
||
|
||
Args:
|
||
high(pandas.Series): dataset 'High' column.
|
||
low(pandas.Series): dataset 'Low' column.
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
fillna(bool): if True, fill nan values.
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
indicator = DonchianChannel(
|
||
high=high, low=low, close=close, window=window, offset=offset, fillna=fillna
|
||
)
|
||
return indicator.donchian_channel_wband()
|
||
|
||
|
||
def donchian_channel_pband(high, low, close, window=10, offset=0, fillna=False):
|
||
"""Donchian Channel Percentage Band (DC)
|
||
|
||
https://www.investopedia.com/terms/d/donchianchannels.asp
|
||
|
||
Args:
|
||
high(pandas.Series): dataset 'High' column.
|
||
low(pandas.Series): dataset 'Low' column.
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
fillna(bool): if True, fill nan values.
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
indicator = DonchianChannel(
|
||
high=high, low=low, close=close, window=window, offset=offset, fillna=fillna
|
||
)
|
||
return indicator.donchian_channel_pband()
|
||
|
||
|
||
def ulcer_index(close, window=14, fillna=False):
|
||
"""Ulcer Index
|
||
|
||
https://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:ulcer_index
|
||
|
||
Args:
|
||
close(pandas.Series): dataset 'Close' column.
|
||
window(int): n period.
|
||
fillna(bool): if True, fill nan values.
|
||
|
||
Returns:
|
||
pandas.Series: New feature generated.
|
||
"""
|
||
indicator = UlcerIndex(close=close, window=window, fillna=fillna)
|
||
return indicator.ulcer_index()
|