diff --git a/README.md b/README.md index 7a367b6..e225da3 100644 --- a/README.md +++ b/README.md @@ -73,9 +73,6 @@ _Pandas Technical Analysis_ (**Pandas TA**) is an easy to use library that lever * [Support](#support) - - -
@@ -83,21 +80,22 @@ _Pandas Technical Analysis_ (**Pandas TA**) is an easy to use library that lever * Has 130+ indicators and utility functions. * **BETA** Also Pandas TA will run TA Lib's version, this includes TA Lib's 63 Chart Patterns. -* Indicators are tightly correlated with the de facto [TA Lib](https://github.com/mrjbq7/ta-lib) if they share common indicators. +* Indicators in Python are tightly correlated with the _de facto_ [TA Lib](https://github.com/mrjbq7/ta-lib) if they share common indicators. +* If TA Lib is also installed, TA Lib computations are enabled by default but can be disabled disabled per indicator by using the argument ```talib=False```. + * For instance to disable TA Lib calculation for **stdev**: ```ta.stdev(df["close"], length=30, talib=False)```. * Example Jupyter Notebook with **vectorbt** Portfolio Backtesting with Pandas TA's ```ta.tsignals``` method. * Have the need for speed? By using the DataFrame _strategy_ method, you get **multiprocessing** for free! __Conditions permitting__. * Easily add _prefixes_ or _suffixes_ or _both_ to columns names. Useful for Custom Chained Strategies. * Example Jupyter Notebooks under the [examples](https://github.com/twopirllc/pandas-ta/tree/main/examples) directory, including how to create Custom Strategies using the new [__Strategy__ Class](https://github.com/twopirllc/pandas-ta/tree/main/examples/PandaTA_Strategy_Examples.ipynb) -* Potential Data Leaks: **ichimoku** and **dpo**. See indicator list below for details. Set ```lookahead=False``` to disable. +* Potential Data Leaks: **dpo** and **ichimoku**. See indicator list below for details. Set ```lookahead=False``` to disable.
**Under Development** =================== -**Pandas TA** checks if the user has some common trading packages installed including but not limited to: [**TA Lib**](https://mrjbq7.github.io/ta-lib/), [**Vector BT**](https://github.com/polakowo/vectorbt), [**YFinance**](https://github.com/ranaroussi/yfinance) ... Much of which is experimental and likely to break until it stabilizes more. +**Pandas TA** checks if the user has some common trading packages installed including but not limited to: [**TA Lib**](https://mrjbq7.github.io/ta-lib/), [**Vector BT**](https://github.com/polakowo/vectorbt), [**YFinance**](https://github.com/ranaroussi/yfinance) ... Much of which is _experimental_ and likely to break until it stabilizes more. * If **TA Lib** installed, existing indicators will _eventually_ get a **TA Lib** version. * Easy Downloading of _ohlcv_ data using [yfinance](https://github.com/ranaroussi/yfinance). See ```help(ta.ticker)``` and ```help(ta.yf)``` and examples below. -* Hopefully soon a Pandas TA _YAML_ configuration file contained in ```~/pandas_ta/``` can be implemented. To see the proposed specification and leave comments and suggestions on it's implementation, see Issue [#258](https://github.com/twopirllc/pandas-ta/issues/258). * Some Common Performance Metrics
@@ -114,7 +112,7 @@ $ pip install pandas_ta Latest Version -------------- -Best choice! Version: *0.3.06b* +Best choice! Version: *0.3.07b* * Includes all fixes and updates between **pypi** and what is covered in this README. ```sh $ pip install -U git+https://github.com/twopirllc/pandas-ta @@ -161,6 +159,8 @@ df.tail()
# **Help** +**Some** indicator arguments have been reordered for consistency. Use ```help(ta.indicator_name)``` for more information or make a Pull Request to improve documentation. + ```python import pandas as pd import pandas_ta as ta @@ -213,7 +213,7 @@ Thanks for using **Pandas TA**! _Thank you for your contributions!_ - +
@@ -979,12 +979,15 @@ of the last bars defined by the length parameter. See ```help(ta.tos_stdevall)``
## **Updated Indicators** + +* _Acceleration Bands_ (**accbands**) Argument ```mamode``` renamed to ```mode```. See ```help(ta.accbands)```. * _ADX_ (**adx**): Added ```mamode``` with default "**RMA**" and with the same ```mamode``` options as TradingView. New argument ```lensig``` so it behaves like TradingView's builtin ADX indicator. See ```help(ta.adx)```. * _Archer Moving Averages Trends_ (**amat**): Added ```drift``` argument and more descriptive column names. * _Average True Range_ (**atr**): The default ```mamode``` is now "**RMA**" and with the same ```mamode``` options as TradingView. See ```help(ta.atr)```. * _Bollinger Bands_ (**bbands**): New argument ```ddoff``` to control the Degrees of Freedom. Also included BB Percent (BBP) as the final column. Default is 0. See ```help(ta.bbands)```. * _Choppiness Index_ (**chop**): New argument ```ln``` to use Natural Logarithm (True) instead of the Standard Logarithm (False). Default is False. See ```help(ta.chop)```. * _Chande Kroll Stop_ (**cksp**): Added ```tvmode``` with default ```True```. When ```tvmode=False```, **cksp** implements “The New Technical Trader” with default values. See ```help(ta.cksp)```. +* _Chande Momentum Oscillator_ (**cmo**): New argument ```talib``` will use TA Lib's version and if TA Lib is installed. Default is True. See ```help(ta.cmo)```. * _Decreasing_ (**decreasing**): New argument ```strict``` checks if the series is continuously decreasing over period ```length``` with a faster calculation. Default: ```False```. The ```percent``` argument has also been added with default None. See ```help(ta.decreasing)```. * _Increasing_ (**increasing**): New argument ```strict``` checks if the series is continuously increasing over period ```length``` with a faster calculation. Default: ```False```. The ```percent``` argument has also been added with default None. See ```help(ta.increasing)```. * _Klinger Volume Oscillator_ (**kvo**): Implements TradingView's Klinger Volume Oscillator version. See ```help(ta.kvo)```. diff --git a/pandas_ta/momentum/apo.py b/pandas_ta/momentum/apo.py index 3d0b32f..55c55e0 100644 --- a/pandas_ta/momentum/apo.py +++ b/pandas_ta/momentum/apo.py @@ -4,7 +4,7 @@ from pandas_ta.overlap import ma from pandas_ta.utils import get_offset, tal_ma, verify_series -def apo(close, fast=None, slow=None, mamode=None, offset=None, **kwargs): +def apo(close, fast=None, slow=None, mamode=None, talib=None, offset=None, **kwargs): """Indicator: Absolute Price Oscillator (APO)""" # Validate Arguments fast = int(fast) if fast and fast > 0 else 12 @@ -14,11 +14,12 @@ def apo(close, fast=None, slow=None, mamode=None, offset=None, **kwargs): close = verify_series(close, max(fast, slow)) mamode = mamode if isinstance(mamode, str) else "sma" offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if close is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import APO apo = APO(close, fast, slow, tal_ma(mamode)) else: @@ -63,6 +64,9 @@ Args: close (pd.Series): Series of 'close's fast (int): The short period. Default: 12 slow (int): The long period. Default: 26 + mamode (str): See ```help(ta.ma)```. Default: 'sma' + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/momentum/bias.py b/pandas_ta/momentum/bias.py index 093dbea..3b30003 100644 --- a/pandas_ta/momentum/bias.py +++ b/pandas_ta/momentum/bias.py @@ -53,7 +53,7 @@ Calculation: Args: close (pd.Series): Series of 'close's length (int): The period. Default: 26 - mamode (str): Options: 'ema', 'hma', 'rma', 'sma', 'wma'. Default: 'sma' + mamode (str): See ```help(ta.ma)```. Default: 'sma' drift (int): The short period. Default: 1 offset (int): How many periods to offset the result. Default: 0 diff --git a/pandas_ta/momentum/bop.py b/pandas_ta/momentum/bop.py index 5f901af..8a8f383 100644 --- a/pandas_ta/momentum/bop.py +++ b/pandas_ta/momentum/bop.py @@ -3,7 +3,7 @@ from pandas_ta import Imports from pandas_ta.utils import get_offset, non_zero_range, verify_series -def bop(open_, high, low, close, scalar=None, offset=None, **kwargs): +def bop(open_, high, low, close, scalar=None, talib=None, offset=None, **kwargs): """Indicator: Balance of Power (BOP)""" # Validate Arguments open_ = verify_series(open_) @@ -12,9 +12,10 @@ def bop(open_, high, low, close, scalar=None, offset=None, **kwargs): close = verify_series(close) scalar = float(scalar) if scalar else 1 offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import BOP bop = BOP(open_, high, low, close) else: @@ -56,6 +57,8 @@ Args: low (pd.Series): Series of 'low's close (pd.Series): Series of 'close's scalar (float): How much to magnify. Default: 1 + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/momentum/cci.py b/pandas_ta/momentum/cci.py index f8eec17..5b5370c 100644 --- a/pandas_ta/momentum/cci.py +++ b/pandas_ta/momentum/cci.py @@ -5,7 +5,7 @@ from pandas_ta.statistics.mad import mad from pandas_ta.utils import get_offset, verify_series -def cci(high, low, close, length=None, c=None, offset=None, **kwargs): +def cci(high, low, close, length=None, c=None, talib=None, offset=None, **kwargs): """Indicator: Commodity Channel Index (CCI)""" # Validate Arguments length = int(length) if length and length > 0 else 14 @@ -14,11 +14,12 @@ def cci(high, low, close, length=None, c=None, offset=None, **kwargs): low = verify_series(low, length) close = verify_series(close, length) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if high is None or low is None or close is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import CCI cci = CCI(high, low, close, length) else: @@ -71,6 +72,8 @@ Args: close (pd.Series): Series of 'close's length (int): It's period. Default: 14 c (float): Scaling Constant. Default: 0.015 + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/momentum/cmo.py b/pandas_ta/momentum/cmo.py index 69ab1ca..b14402f 100644 --- a/pandas_ta/momentum/cmo.py +++ b/pandas_ta/momentum/cmo.py @@ -4,7 +4,7 @@ from pandas_ta.overlap import rma from pandas_ta.utils import get_drift, get_offset, verify_series -def cmo(close, length=None, scalar=None, drift=None, offset=None, **kwargs): +def cmo(close, length=None, scalar=None, talib=None, drift=None, offset=None, **kwargs): """Indicator: Chande Momentum Oscillator (CMO)""" # Validate Arguments length = int(length) if length and length > 0 else 14 @@ -12,12 +12,12 @@ def cmo(close, length=None, scalar=None, drift=None, offset=None, **kwargs): close = verify_series(close, length) drift = get_drift(drift) offset = get_offset(offset) - talib_mode = kwargs.pop("talib", True) + mode_tal = bool(talib) if isinstance(talib, bool) else True if close is None: return # Calculate Result - if talib_mode and Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import CMO cmo = CMO(close, length) else: @@ -25,7 +25,7 @@ def cmo(close, length=None, scalar=None, drift=None, offset=None, **kwargs): positive = mom.copy().clip(lower=0) negative = mom.copy().clip(upper=0).abs() - if talib_mode: + if mode_tal: pos_ = rma(positive, length) neg_ = rma(negative, length) else: @@ -71,6 +71,9 @@ Calculation: Args: close (pd.Series): Series of 'close's scalar (float): How much to magnify. Default: 100 + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. If TA Lib is not installed but talib is True, it runs the Python + version TA Lib. Default: True drift (int): The short period. Default: 1 offset (int): How many periods to offset the result. Default: 0 diff --git a/pandas_ta/momentum/dm.py b/pandas_ta/momentum/dm.py index 3f35d8d..3f442fa 100644 --- a/pandas_ta/momentum/dm.py +++ b/pandas_ta/momentum/dm.py @@ -5,7 +5,7 @@ from pandas_ta.overlap import ma from pandas_ta.utils import get_offset, verify_series, get_drift, zero -def dm(high, low, length=None, mamode=None, drift=None, offset=None, **kwargs): +def dm(high, low, length=None, mamode=None, talib=None, drift=None, offset=None, **kwargs): """Indicator: DM""" # Validate Arguments length = int(length) if length and length > 0 else 14 @@ -14,11 +14,12 @@ def dm(high, low, length=None, mamode=None, drift=None, offset=None, **kwargs): low = verify_series(low) drift = get_drift(drift) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if high is None or low is None: return - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import MINUS_DM, PLUS_DM pos = PLUS_DM(high, low, length) neg = MINUS_DM(high, low, length) @@ -86,6 +87,9 @@ Calculation: Args: high (pd.Series): Series of 'high's low (pd.Series): Series of 'low's + mamode (str): See ```help(ta.ma)```. Default: 'rma' + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True drift (int): The difference period. Default: 1 offset (int): How many periods to offset the result. Default: 0 diff --git a/pandas_ta/momentum/inertia.py b/pandas_ta/momentum/inertia.py index fd580e5..a8cd726 100644 --- a/pandas_ta/momentum/inertia.py +++ b/pandas_ta/momentum/inertia.py @@ -78,6 +78,9 @@ Args: close (pd.Series): Series of 'close's length (int): It's period. Default: 20 rvi_length (int): RVI period. Default: 14 + refined (bool): Use 'refined' calculation. Default: False + thirds (bool): Use 'thirds' calculation. Default: False + mamode (str): See ```help(ta.ma)```. Default: 'ema' drift (int): The difference period. Default: 1 offset (int): How many periods to offset the result. Default: 0 diff --git a/pandas_ta/momentum/macd.py b/pandas_ta/momentum/macd.py index 20e7f82..8e6e2ce 100644 --- a/pandas_ta/momentum/macd.py +++ b/pandas_ta/momentum/macd.py @@ -5,7 +5,7 @@ from pandas_ta.overlap import ema from pandas_ta.utils import get_offset, verify_series, signals -def macd(close, fast=None, slow=None, signal=None, offset=None, **kwargs): +def macd(close, fast=None, slow=None, signal=None, talib=None, offset=None, **kwargs): """Indicator: Moving Average, Convergence/Divergence (MACD)""" # Validate arguments fast = int(fast) if fast and fast > 0 else 12 @@ -15,13 +15,14 @@ def macd(close, fast=None, slow=None, signal=None, offset=None, **kwargs): fast, slow = slow, fast close = verify_series(close, max(fast, slow, signal)) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if close is None: return as_mode = kwargs.setdefault("asmode", False) # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import MACD macd, signalma, histogram = MACD(close, fast, slow, signal) else: @@ -133,6 +134,8 @@ Args: fast (int): The short period. Default: 12 slow (int): The long period. Default: 26 signal (int): The signal period. Default: 9 + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/momentum/mom.py b/pandas_ta/momentum/mom.py index 3c1a8f5..e2f6638 100644 --- a/pandas_ta/momentum/mom.py +++ b/pandas_ta/momentum/mom.py @@ -3,17 +3,18 @@ from pandas_ta import Imports from pandas_ta.utils import get_offset, verify_series -def mom(close, length=None, offset=None, **kwargs): +def mom(close, length=None, talib=None, offset=None, **kwargs): """Indicator: Momentum (MOM)""" # Validate Arguments length = int(length) if length and length > 0 else 10 close = verify_series(close, length) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if close is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import MOM mom = MOM(close, length) else: @@ -53,6 +54,8 @@ Calculation: Args: close (pd.Series): Series of 'close's length (int): It's period. Default: 1 + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/momentum/ppo.py b/pandas_ta/momentum/ppo.py index 2c5af15..a92f3ca 100644 --- a/pandas_ta/momentum/ppo.py +++ b/pandas_ta/momentum/ppo.py @@ -5,7 +5,7 @@ from pandas_ta.overlap import ma from pandas_ta.utils import get_offset, tal_ma, verify_series -def ppo(close, fast=None, slow=None, signal=None, scalar=None, mamode=None, offset=None, **kwargs): +def ppo(close, fast=None, slow=None, signal=None, scalar=None, mamode=None, talib=None, offset=None, **kwargs): """Indicator: Percentage Price Oscillator (PPO)""" # Validate Arguments fast = int(fast) if fast and fast > 0 else 12 @@ -17,11 +17,12 @@ def ppo(close, fast=None, slow=None, signal=None, scalar=None, mamode=None, offs fast, slow = slow, fast close = verify_series(close, max(fast, slow, signal)) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if close is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import PPO ppo = PPO(close, fast, slow, tal_ma(mamode)) else: @@ -90,7 +91,9 @@ Args: slow(int): The long period. Default: 26 signal(int): The signal period. Default: 9 scalar (float): How much to magnify. Default: 100 - mamode (str): Options: 'ema', 'hma', 'rma', 'sma', 'wma'. Default: 'sma' + mamode (str): See ```help(ta.ma)```. Default: 'sma' + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset(int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/momentum/qqe.py b/pandas_ta/momentum/qqe.py index 1badab6..69be112 100644 --- a/pandas_ta/momentum/qqe.py +++ b/pandas_ta/momentum/qqe.py @@ -143,8 +143,7 @@ Args: length (int): RSI period. Default: 14 smooth (int): RSI smoothing period. Default: 5 factor (float): QQE Factor. Default: 4.236 - mamode (str): Smoothing MA type: "ema", "hma", "rma", "sma" or "wma". - Default: "ema" + mamode (str): See ```help(ta.ma)```. Default: 'sma' drift (int): The difference period. Default: 1 offset (int): How many periods to offset the result. Default: 0 diff --git a/pandas_ta/momentum/roc.py b/pandas_ta/momentum/roc.py index 1fb62e7..75f30d2 100644 --- a/pandas_ta/momentum/roc.py +++ b/pandas_ta/momentum/roc.py @@ -4,18 +4,19 @@ from pandas_ta import Imports from pandas_ta.utils import get_offset, verify_series -def roc(close, length=None, scalar=None, offset=None, **kwargs): +def roc(close, length=None, scalar=None, talib=None, offset=None, **kwargs): """Indicator: Rate of Change (ROC)""" # Validate Arguments length = int(length) if length and length > 0 else 10 scalar = float(scalar) if scalar and scalar > 0 else 100 close = verify_series(close, length) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if close is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import ROC roc = ROC(close, length) else: @@ -57,6 +58,9 @@ Calculation: Args: close (pd.Series): Series of 'close's length (int): It's period. Default: 1 + scalar (float): How much to magnify. Default: 100 + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/momentum/rsi.py b/pandas_ta/momentum/rsi.py index c2b747a..a8978ef 100644 --- a/pandas_ta/momentum/rsi.py +++ b/pandas_ta/momentum/rsi.py @@ -5,7 +5,7 @@ from pandas_ta.overlap import rma from pandas_ta.utils import get_drift, get_offset, verify_series, signals -def rsi(close, length=None, scalar=None, drift=None, offset=None, **kwargs): +def rsi(close, length=None, scalar=None, talib=None, drift=None, offset=None, **kwargs): """Indicator: Relative Strength Index (RSI)""" # Validate arguments length = int(length) if length and length > 0 else 14 @@ -13,11 +13,12 @@ def rsi(close, length=None, scalar=None, drift=None, offset=None, **kwargs): close = verify_series(close, length) drift = get_drift(drift) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if close is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import RSI rsi = RSI(close, length) else: @@ -99,6 +100,8 @@ Args: close (pd.Series): Series of 'close's length (int): It's period. Default: 14 scalar (float): How much to magnify. Default: 100 + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True drift (int): The difference period. Default: 1 offset (int): How many periods to offset the result. Default: 0 diff --git a/pandas_ta/momentum/stoch.py b/pandas_ta/momentum/stoch.py index 2b55b55..823c332 100644 --- a/pandas_ta/momentum/stoch.py +++ b/pandas_ta/momentum/stoch.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- from pandas import DataFrame -from pandas_ta.overlap import sma +from pandas_ta.overlap import ma from pandas_ta.utils import get_offset, non_zero_range, verify_series -def stoch(high, low, close, k=None, d=None, smooth_k=None, offset=None, **kwargs): +def stoch(high, low, close, k=None, d=None, smooth_k=None, mamode=None, offset=None, **kwargs): """Indicator: Stochastic Oscillator (STOCH)""" # Validate arguments k = k if k and k > 0 else 14 @@ -15,6 +15,7 @@ def stoch(high, low, close, k=None, d=None, smooth_k=None, offset=None, **kwargs low = verify_series(low, _length) close = verify_series(close, _length) offset = get_offset(offset) + mamode = mamode if isinstance(mamode, str) else "sma" if high is None or low is None or close is None: return @@ -25,8 +26,8 @@ def stoch(high, low, close, k=None, d=None, smooth_k=None, offset=None, **kwargs stoch = 100 * (close - lowest_low) stoch /= non_zero_range(highest_high, lowest_low) - stoch_k = sma(stoch, length=smooth_k) - stoch_d = sma(stoch_k, length=d) + stoch_k = ma(mamode, stoch.loc[stoch.first_valid_index():,], length=smooth_k) + stoch_d = ma(mamode, stoch_k.loc[stoch_k.first_valid_index():,], length=d) # Offset if offset != 0: @@ -53,7 +54,6 @@ def stoch(high, low, close, k=None, d=None, smooth_k=None, offset=None, **kwargs df = DataFrame(data) df.name = f"{_name}{_props}" df.category = stoch_k.category - return df @@ -91,6 +91,7 @@ Args: k (int): The Fast %K period. Default: 14 d (int): The Slow %K period. Default: 3 smooth_k (int): The Slow %D period. Default: 3 + mamode (str): See ```help(ta.ma)```. Default: 'sma' offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/momentum/stochrsi.py b/pandas_ta/momentum/stochrsi.py index cdd32b0..0841484 100644 --- a/pandas_ta/momentum/stochrsi.py +++ b/pandas_ta/momentum/stochrsi.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- from pandas import DataFrame from .rsi import rsi -from pandas_ta.overlap import sma +from pandas_ta.overlap import ma from pandas_ta.utils import get_offset, non_zero_range, verify_series -def stochrsi(close, length=None, rsi_length=None, k=None, d=None, offset=None, **kwargs): +def stochrsi(close, length=None, rsi_length=None, k=None, d=None, mamode=None, offset=None, **kwargs): """Indicator: Stochastic RSI Oscillator (STOCHRSI)""" # Validate arguments length = length if length and length > 0 else 14 @@ -14,6 +14,7 @@ def stochrsi(close, length=None, rsi_length=None, k=None, d=None, offset=None, * d = d if d and d > 0 else 3 close = verify_series(close, max(length, rsi_length, k, d)) offset = get_offset(offset) + mamode = mamode if isinstance(mamode, str) else "sma" if close is None: return @@ -25,8 +26,8 @@ def stochrsi(close, length=None, rsi_length=None, k=None, d=None, offset=None, * stoch = 100 * (rsi_ - lowest_rsi) stoch /= non_zero_range(highest_rsi, lowest_rsi) - stochrsi_k = sma(stoch, length=k) - stochrsi_d = sma(stochrsi_k, length=d) + stochrsi_k = ma(mamode, stoch, length=k) + stochrsi_d = ma(mamode, stochrsi_k, length=d) # Offset if offset != 0: @@ -92,6 +93,7 @@ Args: rsi_length (int): RSI period. Default: 14 k (int): The Fast %K period. Default: 3 d (int): The Slow %K period. Default: 3 + mamode (str): See ```help(ta.ma)```. Default: 'sma' offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/momentum/uo.py b/pandas_ta/momentum/uo.py index cca14c2..f58691a 100644 --- a/pandas_ta/momentum/uo.py +++ b/pandas_ta/momentum/uo.py @@ -4,7 +4,7 @@ from pandas_ta import Imports from pandas_ta.utils import get_drift, get_offset, verify_series -def uo(high, low, close, fast=None, medium=None, slow=None, fast_w=None, medium_w=None, slow_w=None, drift=None, offset=None, **kwargs): +def uo(high, low, close, fast=None, medium=None, slow=None, fast_w=None, medium_w=None, slow_w=None, talib=None, drift=None, offset=None, **kwargs): """Indicator: Ultimate Oscillator (UO)""" # Validate arguments fast = int(fast) if fast and fast > 0 else 7 @@ -19,11 +19,12 @@ def uo(high, low, close, fast=None, medium=None, slow=None, fast_w=None, medium_ close = verify_series(close, _length) drift = get_drift(drift) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if high is None or low is None or close is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import ULTOSC uo = ULTOSC(high, low, close, fast, medium, slow) else: @@ -101,6 +102,8 @@ Args: fast_w (float): The Fast %K period. Default: 4.0 medium_w (float): The Slow %K period. Default: 2.0 slow_w (float): The Slow %D period. Default: 1.0 + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True drift (int): The difference period. Default: 1 offset (int): How many periods to offset the result. Default: 0 diff --git a/pandas_ta/momentum/willr.py b/pandas_ta/momentum/willr.py index fe69cb7..d3e87f7 100644 --- a/pandas_ta/momentum/willr.py +++ b/pandas_ta/momentum/willr.py @@ -3,7 +3,7 @@ from pandas_ta import Imports from pandas_ta.utils import get_offset, verify_series -def willr(high, low, close, length=None, offset=None, **kwargs): +def willr(high, low, close, length=None, talib=None, offset=None, **kwargs): """Indicator: William's Percent R (WILLR)""" # Validate arguments length = int(length) if length and length > 0 else 14 @@ -13,11 +13,12 @@ def willr(high, low, close, length=None, offset=None, **kwargs): low = verify_series(low, _length) close = verify_series(close, _length) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if high is None or low is None or close is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import WILLR willr = WILLR(high, low, close, length) else: @@ -65,6 +66,8 @@ Args: low (pd.Series): Series of 'low's close (pd.Series): Series of 'close's length (int): It's period. Default: 14 + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/overlap/dema.py b/pandas_ta/overlap/dema.py index 29deb5e..5ce8e03 100644 --- a/pandas_ta/overlap/dema.py +++ b/pandas_ta/overlap/dema.py @@ -4,17 +4,18 @@ from pandas_ta import Imports from pandas_ta.utils import get_offset, verify_series -def dema(close, length=None, offset=None, **kwargs): +def dema(close, length=None, talib=None, offset=None, **kwargs): """Indicator: Double Exponential Moving Average (DEMA)""" # Validate Arguments length = int(length) if length and length > 0 else 10 close = verify_series(close, length) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if close is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import DEMA dema = DEMA(close, length) else: @@ -60,6 +61,8 @@ Calculation: Args: close (pd.Series): Series of 'close's length (int): It's period. Default: 10 + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/overlap/ema.py b/pandas_ta/overlap/ema.py index 105f856..507aa9f 100644 --- a/pandas_ta/overlap/ema.py +++ b/pandas_ta/overlap/ema.py @@ -4,7 +4,7 @@ from pandas_ta import Imports from pandas_ta.utils import get_offset, verify_series -def ema(close, length=None, offset=None, **kwargs): +def ema(close, length=None, talib=None, offset=None, **kwargs): """Indicator: Exponential Moving Average (EMA)""" # Validate Arguments length = int(length) if length and length > 0 else 10 @@ -12,11 +12,12 @@ def ema(close, length=None, offset=None, **kwargs): sma = kwargs.pop("sma", True) close = verify_series(close, length) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if close is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import EMA ema = EMA(close, length) else: @@ -69,6 +70,8 @@ Calculation: Args: close (pd.Series): Series of 'close's length (int): It's period. Default: 10 + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/overlap/hilo.py b/pandas_ta/overlap/hilo.py index 5c7250a..128c9ef 100644 --- a/pandas_ta/overlap/hilo.py +++ b/pandas_ta/overlap/hilo.py @@ -115,7 +115,7 @@ Args: close (pd.Series): Series of 'close's high_length (int): It's period. Default: 13 low_length (int): It's period. Default: 21 - mamode (str): Options: 'sma' or 'ema'. Default: 'sma' + mamode (str): See ```help(ta.ma)```. Default: 'sma' offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/overlap/hlc3.py b/pandas_ta/overlap/hlc3.py index e22046b..087ed1d 100644 --- a/pandas_ta/overlap/hlc3.py +++ b/pandas_ta/overlap/hlc3.py @@ -3,16 +3,17 @@ from pandas_ta import Imports from pandas_ta.utils import get_offset, verify_series -def hlc3(high, low, close, offset=None, **kwargs): +def hlc3(high, low, close, talib=None, offset=None, **kwargs): """Indicator: HLC3""" # Validate Arguments high = verify_series(high) low = verify_series(low) close = verify_series(close) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import TYPPRICE hlc3 = TYPPRICE(high, low, close) else: diff --git a/pandas_ta/overlap/midpoint.py b/pandas_ta/overlap/midpoint.py index 26dad4a..efd9cc1 100644 --- a/pandas_ta/overlap/midpoint.py +++ b/pandas_ta/overlap/midpoint.py @@ -3,18 +3,19 @@ from pandas_ta import Imports from pandas_ta.utils import get_offset, verify_series -def midpoint(close, length=None, offset=None, **kwargs): +def midpoint(close, length=None, talib=None, offset=None, **kwargs): """Indicator: Midpoint""" # Validate arguments length = int(length) if length and length > 0 else 2 min_periods = int(kwargs["min_periods"]) if "min_periods" in kwargs and kwargs["min_periods"] is not None else length close = verify_series(close, max(length, min_periods)) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if close is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import MIDPOINT midpoint = MIDPOINT(close, length) else: diff --git a/pandas_ta/overlap/midprice.py b/pandas_ta/overlap/midprice.py index 633f133..39b775e 100644 --- a/pandas_ta/overlap/midprice.py +++ b/pandas_ta/overlap/midprice.py @@ -3,7 +3,7 @@ from pandas_ta import Imports from pandas_ta.utils import get_offset, verify_series -def midprice(high, low, length=None, offset=None, **kwargs): +def midprice(high, low, length=None, talib=None, offset=None, **kwargs): """Indicator: Midprice""" # Validate arguments length = int(length) if length and length > 0 else 2 @@ -12,11 +12,12 @@ def midprice(high, low, length=None, offset=None, **kwargs): high = verify_series(high, _length) low = verify_series(low, _length) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if high is None or low is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import MIDPRICE midprice = MIDPRICE(high, low, length) else: diff --git a/pandas_ta/overlap/sma.py b/pandas_ta/overlap/sma.py index 72760de..dbcf8cb 100644 --- a/pandas_ta/overlap/sma.py +++ b/pandas_ta/overlap/sma.py @@ -3,18 +3,19 @@ from pandas_ta import Imports from pandas_ta.utils import get_offset, verify_series -def sma(close, length=None, offset=None, **kwargs): +def sma(close, length=None, talib=None, offset=None, **kwargs): """Indicator: Simple Moving Average (SMA)""" # Validate Arguments length = int(length) if length and length > 0 else 10 min_periods = int(kwargs["min_periods"]) if "min_periods" in kwargs and kwargs["min_periods"] is not None else length close = verify_series(close, max(length, min_periods)) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if close is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import SMA sma = SMA(close, length) else: @@ -54,6 +55,8 @@ Calculation: Args: close (pd.Series): Series of 'close's length (int): It's period. Default: 10 + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/overlap/t3.py b/pandas_ta/overlap/t3.py index fc8ebd8..0ceae2d 100644 --- a/pandas_ta/overlap/t3.py +++ b/pandas_ta/overlap/t3.py @@ -4,18 +4,19 @@ from pandas_ta import Imports from pandas_ta.utils import get_offset, verify_series -def t3(close, length=None, a=None, offset=None, **kwargs): +def t3(close, length=None, a=None, talib=None, offset=None, **kwargs): """Indicator: T3""" # Validate Arguments length = int(length) if length and length > 0 else 10 a = float(a) if a and a > 0 and a < 1 else 0.7 close = verify_series(close, length) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if close is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import T3 t3 = T3(close, length, a) else: @@ -77,6 +78,8 @@ Args: close (pd.Series): Series of 'close's length (int): It's period. Default: 10 a (float): 0 < a < 1. Default: 0.7 + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/overlap/tema.py b/pandas_ta/overlap/tema.py index 833cae5..dfd043a 100644 --- a/pandas_ta/overlap/tema.py +++ b/pandas_ta/overlap/tema.py @@ -4,17 +4,18 @@ from pandas_ta import Imports from pandas_ta.utils import get_offset, verify_series -def tema(close, length=None, offset=None, **kwargs): +def tema(close, length=None, talib=None, offset=None, **kwargs): """Indicator: Triple Exponential Moving Average (TEMA)""" # Validate Arguments length = int(length) if length and length > 0 else 10 close = verify_series(close, length) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if close is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import TEMA tema = TEMA(close, length) else: @@ -60,6 +61,8 @@ Calculation: Args: close (pd.Series): Series of 'close's length (int): It's period. Default: 10 + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/overlap/trima.py b/pandas_ta/overlap/trima.py index e424e59..f7a3672 100644 --- a/pandas_ta/overlap/trima.py +++ b/pandas_ta/overlap/trima.py @@ -4,17 +4,18 @@ from pandas_ta import Imports from pandas_ta.utils import get_offset, verify_series -def trima(close, length=None, offset=None, **kwargs): +def trima(close, length=None, talib=None, offset=None, **kwargs): """Indicator: Triangular Moving Average (TRIMA)""" # Validate Arguments length = int(length) if length and length > 0 else 10 close = verify_series(close, length) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if close is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import TRIMA trima = TRIMA(close, length) else: @@ -61,6 +62,8 @@ Calculation: Args: close (pd.Series): Series of 'close's length (int): It's period. Default: 10 + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/overlap/wcp.py b/pandas_ta/overlap/wcp.py index 5d92ce8..fa78170 100644 --- a/pandas_ta/overlap/wcp.py +++ b/pandas_ta/overlap/wcp.py @@ -3,16 +3,17 @@ from pandas_ta import Imports from pandas_ta.utils import get_offset, verify_series -def wcp(high, low, close, offset=None, **kwargs): +def wcp(high, low, close, talib=None, offset=None, **kwargs): """Indicator: Weighted Closing Price (WCP)""" # Validate Arguments high = verify_series(high) low = verify_series(low) close = verify_series(close) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import WCLPRICE wcp = WCLPRICE(high, low, close) else: @@ -51,6 +52,8 @@ Args: high (pd.Series): Series of 'high's low (pd.Series): Series of 'low's close (pd.Series): Series of 'close's + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/overlap/wma.py b/pandas_ta/overlap/wma.py index a5cfe60..6f8dcb6 100644 --- a/pandas_ta/overlap/wma.py +++ b/pandas_ta/overlap/wma.py @@ -4,18 +4,19 @@ from pandas_ta import Imports from pandas_ta.utils import get_offset, verify_series -def wma(close, length=None, asc=None, offset=None, **kwargs): +def wma(close, length=None, asc=None, talib=None, offset=None, **kwargs): """Indicator: Weighted Moving Average (WMA)""" # Validate Arguments length = int(length) if length and length > 0 else 10 asc = asc if asc else True close = verify_series(close, length) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if close is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import WMA wma = WMA(close, length) else: @@ -78,6 +79,8 @@ Args: close (pd.Series): Series of 'close's length (int): It's period. Default: 10 asc (bool): Recent values weigh more. Default: True + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/statistics/stdev.py b/pandas_ta/statistics/stdev.py index 9fff928..13a8bb6 100644 --- a/pandas_ta/statistics/stdev.py +++ b/pandas_ta/statistics/stdev.py @@ -5,18 +5,19 @@ from pandas_ta import Imports from pandas_ta.utils import get_offset, verify_series -def stdev(close, length=None, ddof=None, offset=None, **kwargs): +def stdev(close, length=None, ddof=None, talib=None, offset=None, **kwargs): """Indicator: Standard Deviation""" # Validate Arguments length = int(length) if length and length > 0 else 30 ddof = int(ddof) if ddof and ddof >= 0 and ddof < length else 1 close = verify_series(close, length) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if close is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import STDDEV stdev = STDDEV(close, length) else: @@ -56,6 +57,8 @@ Args: ddof (int): Delta Degrees of Freedom. The divisor used in calculations is N - ddof, where N represents the number of elements. Default: 1 + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/statistics/variance.py b/pandas_ta/statistics/variance.py index ffa6c99..6630941 100644 --- a/pandas_ta/statistics/variance.py +++ b/pandas_ta/statistics/variance.py @@ -3,7 +3,7 @@ from pandas_ta import Imports from pandas_ta.utils import get_offset, verify_series -def variance(close, length=None, ddof=None, offset=None, **kwargs): +def variance(close, length=None, ddof=None, talib=None, offset=None, **kwargs): """Indicator: Variance""" # Validate Arguments length = int(length) if length and length > 1 else 30 @@ -11,11 +11,12 @@ def variance(close, length=None, ddof=None, offset=None, **kwargs): min_periods = int(kwargs["min_periods"]) if "min_periods" in kwargs and kwargs["min_periods"] is not None else length close = verify_series(close, max(length, min_periods)) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if close is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import VAR variance = VAR(close, length) else: @@ -54,6 +55,8 @@ Args: ddof (int): Delta Degrees of Freedom. The divisor used in calculations is N - ddof, where N represents the number of elements. Default: 0 + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/trend/adx.py b/pandas_ta/trend/adx.py index aace7c2..9906324 100644 --- a/pandas_ta/trend/adx.py +++ b/pandas_ta/trend/adx.py @@ -5,7 +5,7 @@ from pandas_ta.volatility import atr from pandas_ta.utils import get_drift, get_offset, verify_series, zero -def adx(high, low, close, length=None, lensig=None, mamode=None, scalar=None, drift=None, offset=None, **kwargs): +def adx(high, low, close, length=None, lensig=None, scalar=None, mamode=None, drift=None, offset=None, **kwargs): """Indicator: ADX""" # Validate Arguments length = length if length and length > 0 else 14 @@ -138,6 +138,7 @@ Args: length (int): It's period. Default: 14 lensig (int): Signal Length. Like TradingView's default ADX. Default: length scalar (float): How much to magnify. Default: 100 + mamode (str): See ```help(ta.ma)```. Default: 'rma' drift (int): The difference period. Default: 1 offset (int): How many periods to offset the result. Default: 0 diff --git a/pandas_ta/trend/amat.py b/pandas_ta/trend/amat.py index aba60f0..42f903b 100644 --- a/pandas_ta/trend/amat.py +++ b/pandas_ta/trend/amat.py @@ -6,7 +6,7 @@ from pandas_ta.overlap import ma from pandas_ta.utils import get_offset, verify_series -def amat(close=None, fast=None, slow=None, mamode=None, lookback=None, offset=None, **kwargs): +def amat(close=None, fast=None, slow=None, lookback=None, mamode=None, offset=None, **kwargs): """Indicator: Archer Moving Averages Trends (AMAT)""" # Validate Arguments fast = int(fast) if fast and fast > 0 else 8 diff --git a/pandas_ta/trend/aroon.py b/pandas_ta/trend/aroon.py index d74317c..9e13917 100644 --- a/pandas_ta/trend/aroon.py +++ b/pandas_ta/trend/aroon.py @@ -5,7 +5,7 @@ from pandas_ta.utils import get_offset, verify_series from pandas_ta.utils import recent_maximum_index, recent_minimum_index -def aroon(high, low, length=None, scalar=None, offset=None, **kwargs): +def aroon(high, low, length=None, scalar=None, talib=None, offset=None, **kwargs): """Indicator: Aroon & Aroon Oscillator""" # Validate Arguments length = length if length and length > 0 else 14 @@ -13,11 +13,12 @@ def aroon(high, low, length=None, scalar=None, offset=None, **kwargs): high = verify_series(high, length) low = verify_series(low, length) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if high is None or low is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import AROON, AROONOSC aroon_down, aroon_up = AROON(high, low, length) aroon_osc = AROONOSC(high, low, length) @@ -94,6 +95,8 @@ Args: close (pd.Series): Series of 'close's length (int): It's period. Default: 14 scalar (float): How much to magnify. Default: 100 + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/trend/cksp.py b/pandas_ta/trend/cksp.py index 3646171..ff484a1 100644 --- a/pandas_ta/trend/cksp.py +++ b/pandas_ta/trend/cksp.py @@ -4,7 +4,7 @@ from pandas_ta.volatility import atr from pandas_ta.utils import get_offset, verify_series -def cksp(high, low, close, p=None, x=None, q=None, offset=None, tvmode=None, **kwargs): +def cksp(high, low, close, p=None, x=None, q=None, tvmode=None, offset=None, **kwargs): """Indicator: Chande Kroll Stop (CKSP)""" # Validate Arguments # TV defaults=(10,1,9), book defaults = (10,3,20) @@ -23,7 +23,7 @@ def cksp(high, low, close, p=None, x=None, q=None, offset=None, tvmode=None, **k mamode = "rma" if tvmode is True else "sma" # Calculate Result - atr_ = atr(high=high, low=low, close=close, length=p, mamode = mamode) + atr_ = atr(high=high, low=low, close=close, length=p, mamode=mamode) long_stop_ = high.rolling(p).max() - x * atr_ long_stop = long_stop_.rolling(q).max() @@ -90,8 +90,8 @@ Args: p (int): ATR and first stop period. Default: 10 in both modes x (float): ATR scalar. Default: 1 in TV mode, 3 otherwise q (int): Second stop period. Default: 9 in TV mode, 20 otherwise - offset (int): How many periods to offset the result. Default: 0 tvmode (bool): Trading View or book implementation mode. Default: True + offset (int): How many periods to offset the result. Default: 0 Kwargs: fillna (value, optional): pd.DataFrame.fillna(value) diff --git a/pandas_ta/trend/decay.py b/pandas_ta/trend/decay.py index f4b57fb..65fd968 100644 --- a/pandas_ta/trend/decay.py +++ b/pandas_ta/trend/decay.py @@ -63,7 +63,7 @@ Calculation: Args: close (pd.Series): Series of 'close's length (int): It's period. Default: 1 - mamode (str): Option "exponential" ("exp"). Default: 'linear' or None + mode (str): If 'exp' then "exponential" decay. Default: 'linear' offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/volatility/accbands.py b/pandas_ta/volatility/accbands.py index 1ee5045..920986b 100644 --- a/pandas_ta/volatility/accbands.py +++ b/pandas_ta/volatility/accbands.py @@ -93,7 +93,7 @@ Args: close (pd.Series): Series of 'close's length (int): It's period. Default: 10 c (int): Multiplier. Default: 4 - mamode (str): Two options: None or 'ema'. Default: 'ema' + mamode (str): See ```help(ta.ma)```. Default: 'sma' drift (int): The difference period. Default: 1 offset (int): How many periods to offset the result. Default: 0 diff --git a/pandas_ta/volatility/atr.py b/pandas_ta/volatility/atr.py index 7cc2ae7..d29cf20 100644 --- a/pandas_ta/volatility/atr.py +++ b/pandas_ta/volatility/atr.py @@ -5,7 +5,7 @@ from pandas_ta.overlap import ma from pandas_ta.utils import get_drift, get_offset, verify_series -def atr(high, low, close, length=None, mamode=None, drift=None, offset=None, **kwargs): +def atr(high, low, close, length=None, mamode=None, talib=None, drift=None, offset=None, **kwargs): """Indicator: Average True Range (ATR)""" # Validate arguments length = int(length) if length and length > 0 else 14 @@ -15,11 +15,12 @@ def atr(high, low, close, length=None, mamode=None, drift=None, offset=None, **k close = verify_series(close, length) drift = get_drift(drift) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if high is None or low is None or close is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import ATR atr = ATR(high, low, close, length) else: @@ -83,7 +84,9 @@ Args: low (pd.Series): Series of 'low's close (pd.Series): Series of 'close's length (int): It's period. Default: 14 - mamode (str): "sma", "ema", "wma" or "rma". Default: "rma" + mamode (str): See ```help(ta.ma)```. Default: 'rma' + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True drift (int): The difference period. Default: 1 offset (int): How many periods to offset the result. Default: 0 diff --git a/pandas_ta/volatility/bbands.py b/pandas_ta/volatility/bbands.py index ad72652..e142a5e 100644 --- a/pandas_ta/volatility/bbands.py +++ b/pandas_ta/volatility/bbands.py @@ -6,7 +6,7 @@ from pandas_ta.statistics import stdev from pandas_ta.utils import get_offset, non_zero_range, tal_ma, verify_series -def bbands(close, length=None, std=None, mamode=None, ddof=0, offset=None, **kwargs): +def bbands(close, length=None, std=None, ddof=0, mamode=None, talib=None, offset=None, **kwargs): """Indicator: Bollinger Bands (BBANDS)""" # Validate arguments length = int(length) if length and length > 0 else 5 @@ -15,11 +15,12 @@ def bbands(close, length=None, std=None, mamode=None, ddof=0, offset=None, **kwa ddof = int(ddof) if ddof >= 0 and ddof < length else 1 close = verify_series(close, length) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if close is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import BBANDS upper, mid, lower = BBANDS(close, length, std, std, tal_ma(mamode)) else: @@ -108,8 +109,10 @@ Args: close (pd.Series): Series of 'close's length (int): The short period. Default: 5 std (int): The long period. Default: 2 - mamode (str): Two options: "sma" or "ema". Default: "sma" ddof (int): Degrees of Freedom to use. Default: 0 + mamode (str): See ```help(ta.ma)```. Default: 'sma' + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/volatility/kc.py b/pandas_ta/volatility/kc.py index 31a8115..ba8e43c 100644 --- a/pandas_ta/volatility/kc.py +++ b/pandas_ta/volatility/kc.py @@ -100,7 +100,7 @@ Args: close (pd.Series): Series of 'close's length (int): The short period. Default: 20 scalar (float): A positive float to scale the bands. Default: 2 - mamode (str): Two options: "sma" or "ema". Default: "ema" + mamode (str): See ```help(ta.ma)```. Default: 'ema' offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/volatility/natr.py b/pandas_ta/volatility/natr.py index dd6ad1b..be4993f 100644 --- a/pandas_ta/volatility/natr.py +++ b/pandas_ta/volatility/natr.py @@ -4,7 +4,7 @@ from pandas_ta import Imports from pandas_ta.utils import get_drift, get_offset, verify_series -def natr(high, low, close, length=None, mamode=None, scalar=None, drift=None, offset=None, **kwargs): +def natr(high, low, close, length=None, scalar=None, mamode=None, talib=None, drift=None, offset=None, **kwargs): """Indicator: Normalized Average True Range (NATR)""" # Validate arguments length = int(length) if length and length > 0 else 14 @@ -15,11 +15,12 @@ def natr(high, low, close, length=None, mamode=None, scalar=None, drift=None, of close = verify_series(close, length) drift = get_drift(drift) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if high is None or low is None or close is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import NATR natr = NATR(high, low, close, length) else: @@ -63,6 +64,9 @@ Args: close (pd.Series): Series of 'close's length (int): The short period. Default: 20 scalar (float): How much to magnify. Default: 100 + mamode (str): See ```help(ta.ma)```. Default: 'ema' + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/volatility/rvi.py b/pandas_ta/volatility/rvi.py index 29225c2..7df6538 100644 --- a/pandas_ta/volatility/rvi.py +++ b/pandas_ta/volatility/rvi.py @@ -101,10 +101,10 @@ Args: close (pd.Series): Series of 'close's length (int): The short period. Default: 14 scalar (float): A positive float to scale the bands. Default: 100 - mamode (str): Options: 'sma' or 'ema'. Default: 'sma' refined (bool): Use 'refined' calculation which is the average of RVI(high) and RVI(low) instead of RVI(close). Default: False thirds (bool): Average of high, low and close. Default: False + mamode (str): See ```help(ta.ma)```. Default: 'ema' offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/volatility/thermo.py b/pandas_ta/volatility/thermo.py index d1e539e..b628033 100644 --- a/pandas_ta/volatility/thermo.py +++ b/pandas_ta/volatility/thermo.py @@ -112,8 +112,8 @@ Args: long(int): The buy factor short(float): The sell factor length (int): The period. Default: 20 + mamode (str): See ```help(ta.ma)```. Default: 'ema' drift (int): The diff period. Default: 1 - mamode (str): Three options: "ema", "sma", or "hma". Default: "ema" offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/volatility/true_range.py b/pandas_ta/volatility/true_range.py index 687b630..f2c0331 100644 --- a/pandas_ta/volatility/true_range.py +++ b/pandas_ta/volatility/true_range.py @@ -5,7 +5,7 @@ from pandas_ta import Imports from pandas_ta.utils import get_drift, get_offset, non_zero_range, verify_series -def true_range(high, low, close, drift=None, offset=None, **kwargs): +def true_range(high, low, close, talib=None, drift=None, offset=None, **kwargs): """Indicator: True Range""" # Validate arguments high = verify_series(high) @@ -13,9 +13,10 @@ def true_range(high, low, close, drift=None, offset=None, **kwargs): close = verify_series(close) drift = get_drift(drift) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import TRANGE true_range = TRANGE(high, low, close) else: @@ -63,6 +64,8 @@ Args: high (pd.Series): Series of 'high's low (pd.Series): Series of 'low's close (pd.Series): Series of 'close's + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True drift (int): The shift period. Default: 1 offset (int): How many periods to offset the result. Default: 0 diff --git a/pandas_ta/volume/ad.py b/pandas_ta/volume/ad.py index 557acde..4c0e975 100644 --- a/pandas_ta/volume/ad.py +++ b/pandas_ta/volume/ad.py @@ -3,7 +3,7 @@ from pandas_ta import Imports from pandas_ta.utils import get_offset, non_zero_range, verify_series -def ad(high, low, close, volume, open_=None, offset=None, **kwargs): +def ad(high, low, close, volume, open_=None, talib=None, offset=None, **kwargs): """Indicator: Accumulation/Distribution (AD)""" # Validate Arguments high = verify_series(high) @@ -11,9 +11,10 @@ def ad(high, low, close, volume, open_=None, offset=None, **kwargs): close = verify_series(close) volume = verify_series(volume) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import AD ad = AD(high, low, close, volume) else: @@ -70,6 +71,8 @@ Args: close (pd.Series): Series of 'close's volume (pd.Series): Series of 'volume's open (pd.Series): Series of 'open's + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/volume/adosc.py b/pandas_ta/volume/adosc.py index 48f443a..b315579 100644 --- a/pandas_ta/volume/adosc.py +++ b/pandas_ta/volume/adosc.py @@ -5,7 +5,7 @@ from pandas_ta.overlap import ema from pandas_ta.utils import get_offset, verify_series -def adosc(high, low, close, volume, open_=None, fast=None, slow=None, offset=None, **kwargs): +def adosc(high, low, close, volume, open_=None, fast=None, slow=None, talib=None, offset=None, **kwargs): """Indicator: Accumulation/Distribution Oscillator""" # Validate Arguments fast = int(fast) if fast and fast > 0 else 3 @@ -17,11 +17,12 @@ def adosc(high, low, close, volume, open_=None, fast=None, slow=None, offset=Non volume = verify_series(volume, _length) offset = get_offset(offset) if "length" in kwargs: kwargs.pop("length") + mode_tal = bool(talib) if isinstance(talib, bool) else True if high is None or low is None or close is None or volume is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import ADOSC adosc = ADOSC(high, low, close, volume, fast, slow) else: @@ -74,6 +75,8 @@ Args: volume (pd.Series): Series of 'volume's fast (int): The short period. Default: 12 slow (int): The long period. Default: 26 + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/volume/aobv.py b/pandas_ta/volume/aobv.py index a2c0699..70c3539 100644 --- a/pandas_ta/volume/aobv.py +++ b/pandas_ta/volume/aobv.py @@ -6,7 +6,7 @@ from pandas_ta.trend import long_run, short_run from pandas_ta.utils import get_offset, verify_series -def aobv(close, volume, fast=None, slow=None, mamode=None, max_lookback=None, min_lookback=None, offset=None, **kwargs): +def aobv(close, volume, fast=None, slow=None, max_lookback=None, min_lookback=None, mamode=None, offset=None, **kwargs): """Indicator: Archer On Balance Volume (AOBV)""" # Validate arguments fast = int(fast) if fast and fast > 0 else 4 diff --git a/pandas_ta/volume/efi.py b/pandas_ta/volume/efi.py index 6364345..79d567e 100644 --- a/pandas_ta/volume/efi.py +++ b/pandas_ta/volume/efi.py @@ -3,7 +3,7 @@ from pandas_ta.overlap import ma from pandas_ta.utils import get_drift, get_offset, verify_series -def efi(close, volume, length=None, drift=None, mamode=None, offset=None, **kwargs): +def efi(close, volume, length=None, mamode=None, drift=None, offset=None, **kwargs): """Indicator: Elder's Force Index (EFI)""" # Validate arguments length = int(length) if length and length > 0 else 13 @@ -63,7 +63,7 @@ Args: volume (pd.Series): Series of 'volume's length (int): The short period. Default: 13 drift (int): The diff period. Default: 1 - mamode (str): Two options: None or "sma". Default: None + mamode (str): See ```help(ta.ma)```. Default: 'ema' offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/volume/kvo.py b/pandas_ta/volume/kvo.py index ea20609..927dd04 100644 --- a/pandas_ta/volume/kvo.py +++ b/pandas_ta/volume/kvo.py @@ -82,7 +82,7 @@ Args: fast (int): The fast period. Default: 34 long (int): The long period. Default: 55 length_sig (int): The signal period. Default: 13 - mamode (str): "sma", "ema", "wma" or "rma". Default: "ema" + mamode (str): See ```help(ta.ma)```. Default: 'ema' offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/pandas_ta/volume/mfi.py b/pandas_ta/volume/mfi.py index 86a9d92..1363b00 100644 --- a/pandas_ta/volume/mfi.py +++ b/pandas_ta/volume/mfi.py @@ -5,7 +5,7 @@ from pandas_ta.overlap import hlc3 from pandas_ta.utils import get_drift, get_offset, verify_series -def mfi(high, low, close, volume, length=None, drift=None, offset=None, **kwargs): +def mfi(high, low, close, volume, length=None, talib=None, drift=None, offset=None, **kwargs): """Indicator: Money Flow Index (MFI)""" # Validate arguments length = int(length) if length and length > 0 else 14 @@ -15,11 +15,12 @@ def mfi(high, low, close, volume, length=None, drift=None, offset=None, **kwargs volume = verify_series(volume, length) drift = get_drift(drift) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True if high is None or low is None or close is None or volume is None: return # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import MFI mfi = MFI(high, low, close, volume, length) else: @@ -84,6 +85,8 @@ Args: close (pd.Series): Series of 'close's volume (pd.Series): Series of 'volume's length (int): The sum period. Default: 14 + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True drift (int): The difference period. Default: 1 offset (int): How many periods to offset the result. Default: 0 diff --git a/pandas_ta/volume/obv.py b/pandas_ta/volume/obv.py index 539b09b..ec15be1 100644 --- a/pandas_ta/volume/obv.py +++ b/pandas_ta/volume/obv.py @@ -3,15 +3,16 @@ from pandas_ta import Imports from pandas_ta.utils import get_offset, signed_series, verify_series -def obv(close, volume, offset=None, **kwargs): +def obv(close, volume, talib=None, offset=None, **kwargs): """Indicator: On Balance Volume (OBV)""" # Validate arguments close = verify_series(close) volume = verify_series(volume) offset = get_offset(offset) + mode_tal = bool(talib) if isinstance(talib, bool) else True # Calculate Result - if Imports["talib"]: + if Imports["talib"] and mode_tal: from talib import OBV obv = OBV(close, volume) else: @@ -53,6 +54,8 @@ Calculation: Args: close (pd.Series): Series of 'close's volume (pd.Series): Series of 'volume's + talib (bool): If TA Lib is installed and talib is True, Returns the TA Lib + version. Default: True offset (int): How many periods to offset the result. Default: 0 Kwargs: diff --git a/setup.py b/setup.py index fdc7b35..3cc5b90 100644 --- a/setup.py +++ b/setup.py @@ -19,7 +19,7 @@ setup( "pandas_ta.volatility", "pandas_ta.volume" ], - version=".".join(("0", "3", "06b")), + version=".".join(("0", "3", "07b")), description=long_description, long_description=long_description, author="Kevin Johnson", diff --git a/tests/test_indicator_candle.py b/tests/test_indicator_candle.py index 083ef67..619bc6e 100644 --- a/tests/test_indicator_candle.py +++ b/tests/test_indicator_candle.py @@ -58,7 +58,7 @@ class TestCandle(TestCase): try: expected = tal.CDLDOJI(self.open, self.high, self.low, self.close) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) diff --git a/tests/test_indicator_momentum.py b/tests/test_indicator_momentum.py index 2374944..edefa7c 100644 --- a/tests/test_indicator_momentum.py +++ b/tests/test_indicator_momentum.py @@ -65,60 +65,72 @@ class TestMomentum(TestCase): self.assertEqual(result.name, "AO_5_34") def test_apo(self): - result = pandas_ta.apo(self.close) + result = pandas_ta.apo(self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "APO_12_26") try: expected = tal.APO(self.close) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.apo(self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "APO_12_26") + def test_bias(self): result = pandas_ta.bias(self.close) self.assertIsInstance(result, Series) self.assertEqual(result.name, "BIAS_SMA_26") def test_bop(self): - result = pandas_ta.bop(self.open, self.high, self.low, self.close) + result = pandas_ta.bop(self.open, self.high, self.low, self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "BOP") try: expected = tal.BOP(self.open, self.high, self.low, self.close) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.bop(self.open, self.high, self.low, self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "BOP") + def test_brar(self): result = pandas_ta.brar(self.open, self.high, self.low, self.close) self.assertIsInstance(result, DataFrame) self.assertEqual(result.name, "BRAR_26") def test_cci(self): - result = pandas_ta.cci(self.high, self.low, self.close) + result = pandas_ta.cci(self.high, self.low, self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "CCI_14_0.015") try: expected = tal.CCI(self.high, self.low, self.close) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.cci(self.high, self.low, self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "CCI_14_0.015") + def test_cfo(self): result = pandas_ta.cfo(self.close) self.assertIsInstance(result, Series) @@ -137,19 +149,16 @@ class TestMomentum(TestCase): try: expected = tal.CMO(self.close) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) - def test_cmo_no_talib(self): result = pandas_ta.cmo(self.close, talib=False) - - talib_result = tal.CMO(self.close) - corr = pandas_ta.utils.df_error_analysis(result, talib_result, col=CORRELATION) - self.assertLess(corr, CORRELATION_THRESHOLD) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "CMO_14") def test_coppock(self): result = pandas_ta.coppock(self.close) @@ -167,7 +176,7 @@ class TestMomentum(TestCase): self.assertEqual(result.name, "ER_10") def test_dm(self): - result = pandas_ta.dm(self.high, self.low) + result = pandas_ta.dm(self.high, self.low, talib=False) self.assertIsInstance(result, DataFrame) self.assertEqual(result.name, "DM_14") @@ -176,7 +185,7 @@ class TestMomentum(TestCase): expected_neg = tal.MINUS_DM(self.high, self.low) expecteddf = DataFrame({"DMP_14": expected_pos, "DMN_14": expected_neg}) pdt.assert_frame_equal(result, expecteddf) - except AssertionError as ae: + except AssertionError: try: dmp = pandas_ta.utils.df_error_analysis(result.iloc[:,0], expecteddf.iloc[:,0], col=CORRELATION) self.assertGreater(dmp, CORRELATION_THRESHOLD) @@ -189,6 +198,10 @@ class TestMomentum(TestCase): except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.dm(self.high, self.low) + self.assertIsInstance(result, DataFrame) + self.assertEqual(result.name, "DM_14") + def test_eri(self): result = pandas_ta.eri(self.high, self.low, self.close) self.assertIsInstance(result, DataFrame) @@ -223,7 +236,7 @@ class TestMomentum(TestCase): self.assertEqual(result.name, "KST_10_15_20_30_10_10_10_15_9") def test_macd(self): - result = pandas_ta.macd(self.close) + result = pandas_ta.macd(self.close, talib=False) self.assertIsInstance(result, DataFrame) self.assertEqual(result.name, "MACD_12_26_9") @@ -231,7 +244,7 @@ class TestMomentum(TestCase): expected = tal.MACD(self.close) expecteddf = DataFrame({"MACD_12_26_9": expected[0], "MACDh_12_26_9": expected[2], "MACDs_12_26_9": expected[1]}) pdt.assert_frame_equal(result, expecteddf) - except AssertionError as ae: + except AssertionError: try: macd_corr = pandas_ta.utils.df_error_analysis(result.iloc[:, 0], expecteddf.iloc[:, 0], col=CORRELATION) self.assertGreater(macd_corr, CORRELATION_THRESHOLD) @@ -250,46 +263,58 @@ class TestMomentum(TestCase): except Exception as ex: error_analysis(result.iloc[:, 2], CORRELATION, ex, newline=False) + result = pandas_ta.macd(self.close) + self.assertIsInstance(result, DataFrame) + self.assertEqual(result.name, "MACD_12_26_9") + def test_macdas(self): result = pandas_ta.macd(self.close, asmode=True) self.assertIsInstance(result, DataFrame) self.assertEqual(result.name, "MACDAS_12_26_9") def test_mom(self): - result = pandas_ta.mom(self.close) + result = pandas_ta.mom(self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "MOM_10") try: expected = tal.MOM(self.close) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.mom(self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "MOM_10") + def test_pgo(self): result = pandas_ta.pgo(self.high, self.low, self.close) self.assertIsInstance(result, Series) self.assertEqual(result.name, "PGO_14") def test_ppo(self): - result = pandas_ta.ppo(self.close) + result = pandas_ta.ppo(self.close, talib=False) self.assertIsInstance(result, DataFrame) self.assertEqual(result.name, "PPO_12_26_9") try: expected = tal.PPO(self.close) pdt.assert_series_equal(result["PPO_12_26_9"], expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result["PPO_12_26_9"], expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result["PPO_12_26_9"], CORRELATION, ex) + result = pandas_ta.ppo(self.close) + self.assertIsInstance(result, DataFrame) + self.assertEqual(result.name, "PPO_12_26_9") + def test_psl(self): result = pandas_ta.psl(self.close) self.assertIsInstance(result, Series) @@ -306,35 +331,43 @@ class TestMomentum(TestCase): self.assertEqual(result.name, "QQE_14_5_4.236") def test_roc(self): - result = pandas_ta.roc(self.close) + result = pandas_ta.roc(self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "ROC_10") try: expected = tal.ROC(self.close) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.roc(self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "ROC_10") + def test_rsi(self): - result = pandas_ta.rsi(self.close) + result = pandas_ta.rsi(self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "RSI_14") try: expected = tal.RSI(self.close) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.rsi(self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "RSI_14") + def test_rsx(self): result = pandas_ta.rsx(self.close) self.assertIsInstance(result, Series) @@ -418,10 +451,10 @@ class TestMomentum(TestCase): self.assertEqual(result.name, "STOCH_14_3_3") try: - expected = tal.STOCH(self.high, self.low, self.close, 14, 3, 0, 3) - expecteddf = DataFrame({"STOCHk_14_3_0_3": expected[0], "STOCHd_14_3_0_3": expected[1]}) + expected = tal.STOCH(self.high, self.low, self.close, 14, 3, 0, 3, 0) + expecteddf = DataFrame({"STOCHk_14_3_0_3_0": expected[0], "STOCHd_14_3_0_3": expected[1]}) pdt.assert_frame_equal(result, expecteddf) - except AssertionError as ae: + except AssertionError: try: stochk_corr = pandas_ta.utils.df_error_analysis(result.iloc[:, 0], expecteddf.iloc[:, 0], col=CORRELATION) self.assertGreater(stochk_corr, CORRELATION_THRESHOLD) @@ -444,7 +477,7 @@ class TestMomentum(TestCase): expected = tal.STOCHRSI(self.close, 14, 14, 3, 0) expecteddf = DataFrame({"STOCHRSIk_14_14_0_3": expected[0], "STOCHRSId_14_14_3_0": expected[1]}) pdt.assert_frame_equal(result, expecteddf) - except AssertionError as ae: + except AssertionError: try: stochrsid_corr = pandas_ta.utils.df_error_analysis(result.iloc[:, 0], expecteddf.iloc[:, 1], col=CORRELATION) self.assertGreater(stochrsid_corr, CORRELATION_THRESHOLD) @@ -469,31 +502,39 @@ class TestMomentum(TestCase): self.assertEqual(result.name, "TSI_13_25") def test_uo(self): - result = pandas_ta.uo(self.high, self.low, self.close) + result = pandas_ta.uo(self.high, self.low, self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "UO_7_14_28") try: expected = tal.ULTOSC(self.high, self.low, self.close) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.uo(self.high, self.low, self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "UO_7_14_28") + def test_willr(self): - result = pandas_ta.willr(self.high, self.low, self.close) + result = pandas_ta.willr(self.high, self.low, self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "WILLR_14") try: expected = tal.WILLR(self.high, self.low, self.close) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + + result = pandas_ta.willr(self.high, self.low, self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "WILLR_14") diff --git a/tests/test_indicator_overlap.py b/tests/test_indicator_overlap.py index b8bf9dc..726449b 100644 --- a/tests/test_indicator_overlap.py +++ b/tests/test_indicator_overlap.py @@ -40,20 +40,24 @@ class TestOverlap(TestCase): self.assertEqual(result.name, "ALMA_10_6.0_0.85") def test_dema(self): - result = pandas_ta.dema(self.close) + result = pandas_ta.dema(self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "DEMA_10") try: expected = tal.DEMA(self.close, 10) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.dema(self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "DEMA_10") + def test_ema(self): result = pandas_ta.ema(self.close, presma=False) self.assertIsInstance(result, Series) @@ -62,13 +66,30 @@ class TestOverlap(TestCase): try: expected = tal.EMA(self.close, 10) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.ema(self.close, talib=False) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "EMA_10") + + try: + pdt.assert_series_equal(result, expected, check_names=False) + except AssertionError: + try: + corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) + self.assertGreater(corr, CORRELATION_THRESHOLD) + except Exception as ex: + error_analysis(result, CORRELATION, ex) + + result = pandas_ta.ema(self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "EMA_10") + def test_fwma(self): result = pandas_ta.fwma(self.close) self.assertIsInstance(result, Series) @@ -85,20 +106,24 @@ class TestOverlap(TestCase): self.assertEqual(result.name, "HL2") def test_hlc3(self): - result = pandas_ta.hlc3(self.high, self.low, self.close) + result = pandas_ta.hlc3(self.high, self.low, self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "HLC3") try: expected = tal.TYPPRICE(self.high, self.low, self.close) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.hlc3(self.high, self.low, self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "HLC3") + def test_hma(self): result = pandas_ta.hma(self.close) self.assertIsInstance(result, Series) @@ -122,70 +147,86 @@ class TestOverlap(TestCase): self.assertEqual(span.name, "ICHISPAN_9_26") def test_linreg(self): - result = pandas_ta.linreg(self.close) + result = pandas_ta.linreg(self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "LR_14") try: expected = tal.LINEARREG(self.close) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.linreg(self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "LR_14") + def test_linreg_angle(self): - result = pandas_ta.linreg(self.close, angle=True) + result = pandas_ta.linreg(self.close, angle=True, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "LRa_14") try: expected = tal.LINEARREG_ANGLE(self.close) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.linreg(self.close, angle=True) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "LRa_14") + def test_linreg_intercept(self): - result = pandas_ta.linreg(self.close, intercept=True) + result = pandas_ta.linreg(self.close, intercept=True, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "LRb_14") try: expected = tal.LINEARREG_INTERCEPT(self.close) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.linreg(self.close, intercept=True) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "LRb_14") + def test_linreg_r(self): result = pandas_ta.linreg(self.close, r=True) self.assertIsInstance(result, Series) self.assertEqual(result.name, "LRr_14") def test_linreg_slope(self): - result = pandas_ta.linreg(self.close, slope=True) + result = pandas_ta.linreg(self.close, slope=True, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "LRm_14") try: expected = tal.LINEARREG_SLOPE(self.close) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.linreg(self.close, slope=True) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "LRm_14") + def test_ma(self): result = pandas_ta.ma() self.assertIsInstance(result, list) @@ -205,35 +246,43 @@ class TestOverlap(TestCase): self.assertEqual(result.name, "MCGD_10") def test_midpoint(self): - result = pandas_ta.midpoint(self.close) + result = pandas_ta.midpoint(self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "MIDPOINT_2") try: expected = tal.MIDPOINT(self.close, 2) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.midpoint(self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "MIDPOINT_2") + def test_midprice(self): - result = pandas_ta.midprice(self.high, self.low) + result = pandas_ta.midprice(self.high, self.low, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "MIDPRICE_2") try: expected = tal.MIDPRICE(self.high, self.low, 2) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.midprice(self.high, self.low) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "MIDPRICE_2") + def test_ohlc4(self): result = pandas_ta.ohlc4(self.open, self.high, self.low, self.close) self.assertIsInstance(result, Series) @@ -255,20 +304,24 @@ class TestOverlap(TestCase): self.assertEqual(result.name, "SINWMA_14") def test_sma(self): - result = pandas_ta.sma(self.close) + result = pandas_ta.sma(self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "SMA_10") try: expected = tal.SMA(self.close, 10) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.sma(self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "SMA_10") + def test_ssf(self): result = pandas_ta.ssf(self.close, poles=2) self.assertIsInstance(result, Series) @@ -289,50 +342,62 @@ class TestOverlap(TestCase): self.assertEqual(result.name, "SUPERT_7_3.0") def test_t3(self): - result = pandas_ta.t3(self.close) + result = pandas_ta.t3(self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "T3_10_0.7") try: expected = tal.T3(self.close, 10) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.t3(self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "T3_10_0.7") + def test_tema(self): - result = pandas_ta.tema(self.close) + result = pandas_ta.tema(self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "TEMA_10") try: expected = tal.TEMA(self.close, 10) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.tema(self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "TEMA_10") + def test_trima(self): - result = pandas_ta.trima(self.close) + result = pandas_ta.trima(self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "TRIMA_10") try: expected = tal.TRIMA(self.close, 10) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.trima(self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "TRIMA_10") + def test_vidya(self): result = pandas_ta.vidya(self.close) self.assertIsInstance(result, Series) @@ -349,35 +414,43 @@ class TestOverlap(TestCase): self.assertEqual(result.name, "VWMA_10") def test_wcp(self): - result = pandas_ta.wcp(self.high, self.low, self.close) + result = pandas_ta.wcp(self.high, self.low, self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "WCP") try: expected = tal.WCLPRICE(self.high, self.low, self.close) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.wcp(self.high, self.low, self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "WCP") + def test_wma(self): - result = pandas_ta.wma(self.close) + result = pandas_ta.wma(self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "WMA_10") try: expected = tal.WMA(self.close, 10) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.wma(self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "WMA_10") + def test_zlma(self): result = pandas_ta.zlma(self.close) self.assertIsInstance(result, Series) diff --git a/tests/test_indicator_statistics.py b/tests/test_indicator_statistics.py index d580a5c..b572b57 100644 --- a/tests/test_indicator_statistics.py +++ b/tests/test_indicator_statistics.py @@ -65,20 +65,24 @@ class TestStatistics(TestCase): self.assertEqual(result.name, "SKEW_30") def test_stdev(self): - result = pandas_ta.stdev(self.close) + result = pandas_ta.stdev(self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "STDEV_30") try: expected = tal.STDDEV(self.close, 30) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.stdev(self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "STDEV_30") + def test_tos_sdtevall(self): result = pandas_ta.tos_stdevall(self.close) self.assertIsInstance(result, DataFrame) @@ -96,20 +100,24 @@ class TestStatistics(TestCase): self.assertEqual(len(result.columns), 5) def test_variance(self): - result = pandas_ta.variance(self.close) + result = pandas_ta.variance(self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "VAR_30") try: expected = tal.VAR(self.close, 30) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.variance(self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "VAR_30") + def test_zscore(self): result = pandas_ta.zscore(self.close) self.assertIsInstance(result, Series) diff --git a/tests/test_indicator_trend.py b/tests/test_indicator_trend.py index 8541934..cf01c73 100644 --- a/tests/test_indicator_trend.py +++ b/tests/test_indicator_trend.py @@ -35,27 +35,31 @@ class TestTrend(TestCase): def test_adx(self): - result = pandas_ta.adx(self.high, self.low, self.close) + result = pandas_ta.adx(self.high, self.low, self.close, talib=False) self.assertIsInstance(result, DataFrame) self.assertEqual(result.name, "ADX_14") try: expected = tal.ADX(self.high, self.low, self.close) pdt.assert_series_equal(result.iloc[:, 0], expected) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result.iloc[:, 0], expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.adx(self.high, self.low, self.close) + self.assertIsInstance(result, DataFrame) + self.assertEqual(result.name, "ADX_14") + def test_amat(self): result = pandas_ta.amat(self.close) self.assertIsInstance(result, DataFrame) self.assertEqual(result.name, "AMATe_8_21_2") def test_aroon(self): - result = pandas_ta.aroon(self.high, self.low) + result = pandas_ta.aroon(self.high, self.low, talib=False) self.assertIsInstance(result, DataFrame) self.assertEqual(result.name, "AROON_14") @@ -63,7 +67,7 @@ class TestTrend(TestCase): expected = tal.AROON(self.high, self.low) expecteddf = DataFrame({"AROOND_14": expected[0], "AROONU_14": expected[1]}) pdt.assert_frame_equal(result, expecteddf) - except AssertionError as ae: + except AssertionError: try: aroond_corr = pandas_ta.utils.df_error_analysis(result.iloc[:, 0], expecteddf.iloc[:, 0], col=CORRELATION) self.assertGreater(aroond_corr, CORRELATION_THRESHOLD) @@ -76,13 +80,19 @@ class TestTrend(TestCase): except Exception as ex: error_analysis(result.iloc[:, 1], CORRELATION, ex, newline=False) + result = pandas_ta.aroon(self.high, self.low) + self.assertIsInstance(result, DataFrame) + self.assertEqual(result.name, "AROON_14") + def test_aroon_osc(self): result = pandas_ta.aroon(self.high, self.low) + self.assertIsInstance(result, DataFrame) + self.assertEqual(result.name, "AROON_14") try: expected = tal.AROONOSC(self.high, self.low) pdt.assert_series_equal(result.iloc[:, 2], expected) - except AssertionError as ae: + except AssertionError: try: aroond_corr = pandas_ta.utils.df_error_analysis(result.iloc[:,2], expected,col=CORRELATION) self.assertGreater(aroond_corr, CORRELATION_THRESHOLD) @@ -158,7 +168,7 @@ class TestTrend(TestCase): try: expected = tal.SAR(self.high, self.low) pdt.assert_series_equal(psar, expected) - except AssertionError as ae: + except AssertionError: try: psar_corr = pandas_ta.utils.df_error_analysis(psar, expected, col=CORRELATION) self.assertGreater(psar_corr, CORRELATION_THRESHOLD) diff --git a/tests/test_indicator_volatility.py b/tests/test_indicator_volatility.py index 39b149a..381a9d1 100644 --- a/tests/test_indicator_volatility.py +++ b/tests/test_indicator_volatility.py @@ -45,26 +45,26 @@ class TestVolatility(TestCase): self.assertEqual(result.name, "ACCBANDS_20") def test_atr(self): - result = pandas_ta.atr(self.high, self.low, self.close) + result = pandas_ta.atr(self.high, self.low, self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "ATRr_14") try: expected = tal.ATR(self.high, self.low, self.close) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) - def test_bbands(self): - result = pandas_ta.bbands(self.close, ddof=0) - self.assertIsInstance(result, DataFrame) - self.assertEqual(result.name, "BBANDS_5_2.0") + result = pandas_ta.atr(self.high, self.low, self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "ATRr_14") - result = pandas_ta.bbands(self.close, ddof=1) + def test_bbands(self): + result = pandas_ta.bbands(self.close, talib=False) self.assertIsInstance(result, DataFrame) self.assertEqual(result.name, "BBANDS_5_2.0") @@ -72,7 +72,7 @@ class TestVolatility(TestCase): expected = tal.BBANDS(self.close) expecteddf = DataFrame({"BBU_5_2.0": expected[0], "BBM_5_2.0": expected[1], "BBL_5_2.0": expected[2]}) pdt.assert_frame_equal(result, expecteddf) - except AssertionError as ae: + except AssertionError: try: bbl_corr = pandas_ta.utils.df_error_analysis(result.iloc[:, 0], expecteddf.iloc[:,0], col=CORRELATION) self.assertGreater(bbl_corr, CORRELATION_THRESHOLD) @@ -91,6 +91,14 @@ class TestVolatility(TestCase): except Exception as ex: error_analysis(result.iloc[:, 2], CORRELATION, ex, newline=False) + result = pandas_ta.bbands(self.close, ddof=0) + self.assertIsInstance(result, DataFrame) + self.assertEqual(result.name, "BBANDS_5_2.0") + + result = pandas_ta.bbands(self.close, ddof=1) + self.assertIsInstance(result, DataFrame) + self.assertEqual(result.name, "BBANDS_5_2.0") + def test_donchian(self): result = pandas_ta.donchian(self.high, self.low) self.assertIsInstance(result, DataFrame) @@ -115,20 +123,24 @@ class TestVolatility(TestCase): self.assertEqual(result.name, "MASSI_9_25") def test_natr(self): - result = pandas_ta.natr(self.high, self.low, self.close) + result = pandas_ta.natr(self.high, self.low, self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "NATR_14") try: expected = tal.NATR(self.high, self.low, self.close) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.natr(self.high, self.low, self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "NATR_14") + def test_pdist(self): result = pandas_ta.pdist(self.open, self.high, self.low, self.close) self.assertIsInstance(result, Series) @@ -153,20 +165,24 @@ class TestVolatility(TestCase): self.assertEqual(result.name, "THERMO_20_2_0.5") def test_true_range(self): - result = pandas_ta.true_range(self.high, self.low, self.close) + result = pandas_ta.true_range(self.high, self.low, self.close, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "TRUERANGE_1") try: expected = tal.TRANGE(self.high, self.low, self.close) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.true_range(self.high, self.low, self.close) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "TRUERANGE_1") + def test_ui(self): result = pandas_ta.ui(self.close) self.assertIsInstance(result, Series) diff --git a/tests/test_indicator_volume.py b/tests/test_indicator_volume.py index 6dda44a..dae1f54 100644 --- a/tests/test_indicator_volume.py +++ b/tests/test_indicator_volume.py @@ -35,40 +35,48 @@ class TestVolume(TestCase): def test_ad(self): - result = pandas_ta.ad(self.high, self.low, self.close, self.volume_) + result = pandas_ta.ad(self.high, self.low, self.close, self.volume_, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "AD") try: expected = tal.AD(self.high, self.low, self.close, self.volume_) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.ad(self.high, self.low, self.close, self.volume_) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "AD") + def test_ad_open(self): result = pandas_ta.ad(self.high, self.low, self.close, self.volume_, self.open) self.assertIsInstance(result, Series) self.assertEqual(result.name, "ADo") def test_adosc(self): - result = pandas_ta.adosc(self.high, self.low, self.close, self.volume_) + result = pandas_ta.adosc(self.high, self.low, self.close, self.volume_, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "ADOSC_3_10") try: expected = tal.ADOSC(self.high, self.low, self.close, self.volume_) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.adosc(self.high, self.low, self.close, self.volume_) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "ADOSC_3_10") + def test_aobv(self): result = pandas_ta.aobv(self.close, self.volume_) self.assertIsInstance(result, DataFrame) @@ -95,40 +103,48 @@ class TestVolume(TestCase): self.assertEqual(result.name, "KVO_34_55_13") def test_mfi(self): - result = pandas_ta.mfi(self.high, self.low, self.close, self.volume_) + result = pandas_ta.mfi(self.high, self.low, self.close, self.volume_, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "MFI_14") try: expected = tal.MFI(self.high, self.low, self.close, self.volume_) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.mfi(self.high, self.low, self.close, self.volume_) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "MFI_14") + def test_nvi(self): result = pandas_ta.nvi(self.close, self.volume_) self.assertIsInstance(result, Series) self.assertEqual(result.name, "NVI_1") def test_obv(self): - result = pandas_ta.obv(self.close, self.volume_) + result = pandas_ta.obv(self.close, self.volume_, talib=False) self.assertIsInstance(result, Series) self.assertEqual(result.name, "OBV") try: expected = tal.OBV(self.close, self.volume_) pdt.assert_series_equal(result, expected, check_names=False) - except AssertionError as ae: + except AssertionError: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex) + result = pandas_ta.obv(self.close, self.volume_) + self.assertIsInstance(result, Series) + self.assertEqual(result.name, "OBV") + def test_pvi(self): result = pandas_ta.pvi(self.close, self.volume_) self.assertIsInstance(result, Series)