From 11cb7da4254fc20311ad6dce6e821bd6d5c284c9 Mon Sep 17 00:00:00 2001 From: r Date: Wed, 18 May 2022 16:15:21 -0500 Subject: [PATCH 1/2] feat(Stochastic): Add Histogram column like `STOCHh_14_3_3` --- pandas_ta/momentum/stoch.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pandas_ta/momentum/stoch.py b/pandas_ta/momentum/stoch.py index b7aae96..144c33a 100644 --- a/pandas_ta/momentum/stoch.py +++ b/pandas_ta/momentum/stoch.py @@ -53,7 +53,7 @@ def stoch( fill_method (value, optional): Type of fill method Returns: - pd.DataFrame: %K, %D columns. + pd.DataFrame: %K, %D, Histogram columns. """ # Validate k = v_pos_default(k, 14) @@ -78,6 +78,7 @@ def stoch( high, low, close, k, d, tal_ma(mamode), d, tal_ma(mamode) ) stoch_k, stoch_d = stoch_[0], stoch_[1] + histogram = stoch_k - stoch_d else: lowest_low = low.rolling(k).min() highest_high = high.rolling(k).max() @@ -93,6 +94,7 @@ def stoch( stochk_fvi = stoch_k.loc[stoch_k.first_valid_index():, ] stoch_d = ma(mamode, stochk_fvi, length=d) + histogram = stoch_k - stoch_d # Offset if offset != 0: @@ -103,18 +105,21 @@ def stoch( if "fillna" in kwargs: stoch_k.fillna(kwargs["fillna"], inplace=True) stoch_d.fillna(kwargs["fillna"], inplace=True) + histogram.fillna(kwargs["fillna"], inplace=True) if "fill_method" in kwargs: stoch_k.fillna(method=kwargs["fill_method"], inplace=True) stoch_d.fillna(method=kwargs["fill_method"], inplace=True) + histogram.fillna(method=kwargs["fill_method"], inplace=True) # Name and Category _name = "STOCH" _props = f"_{k}_{d}_{smooth_k}" stoch_k.name = f"{_name}k{_props}" stoch_d.name = f"{_name}d{_props}" + histogram.name = f"STOCHh{_props}" stoch_k.category = stoch_d.category = "momentum" - data = {stoch_k.name: stoch_k, stoch_d.name: stoch_d} + data = {stoch_k.name: stoch_k, stoch_d.name: stoch_d, histogram.name: histogram} df = DataFrame(data, index=close.index) df.name = f"{_name}{_props}" df.category = stoch_k.category From 3c7862d2f4996b4452f8740c2d57a99a3d407132 Mon Sep 17 00:00:00 2001 From: Kevin Johnson Date: Thu, 19 May 2022 17:53:27 -0700 Subject: [PATCH 2/2] ENH #533 stoch histogram added --- pandas_ta/momentum/stoch.py | 19 ++++++++++++------- pandas_ta/momentum/stochf.py | 5 ++++- pandas_ta/momentum/stochrsi.py | 5 ++++- pandas_ta/utils/data/yahoofinance.py | 9 +++++---- tests/test_ext_indicator_momentum.py | 2 +- 5 files changed, 26 insertions(+), 14 deletions(-) diff --git a/pandas_ta/momentum/stoch.py b/pandas_ta/momentum/stoch.py index 144c33a..b0c53bc 100644 --- a/pandas_ta/momentum/stoch.py +++ b/pandas_ta/momentum/stoch.py @@ -78,7 +78,6 @@ def stoch( high, low, close, k, d, tal_ma(mamode), d, tal_ma(mamode) ) stoch_k, stoch_d = stoch_[0], stoch_[1] - histogram = stoch_k - stoch_d else: lowest_low = low.rolling(k).min() highest_high = high.rolling(k).max() @@ -94,32 +93,38 @@ def stoch( stochk_fvi = stoch_k.loc[stoch_k.first_valid_index():, ] stoch_d = ma(mamode, stochk_fvi, length=d) - histogram = stoch_k - stoch_d + + stoch_h = stoch_k - stoch_d # Histogram # Offset if offset != 0: stoch_k = stoch_k.shift(offset) stoch_d = stoch_d.shift(offset) + stoch_h = stoch_h.shift(offset) # Fill if "fillna" in kwargs: stoch_k.fillna(kwargs["fillna"], inplace=True) stoch_d.fillna(kwargs["fillna"], inplace=True) - histogram.fillna(kwargs["fillna"], inplace=True) + stoch_h.fillna(kwargs["fillna"], inplace=True) if "fill_method" in kwargs: stoch_k.fillna(method=kwargs["fill_method"], inplace=True) stoch_d.fillna(method=kwargs["fill_method"], inplace=True) - histogram.fillna(method=kwargs["fill_method"], inplace=True) + stoch_h.fillna(method=kwargs["fill_method"], inplace=True) # Name and Category _name = "STOCH" _props = f"_{k}_{d}_{smooth_k}" stoch_k.name = f"{_name}k{_props}" stoch_d.name = f"{_name}d{_props}" - histogram.name = f"STOCHh{_props}" - stoch_k.category = stoch_d.category = "momentum" + stoch_h.name = f"{_name}h{_props}" + stoch_k.category = stoch_d.category = stoch_h.category = "momentum" - data = {stoch_k.name: stoch_k, stoch_d.name: stoch_d, histogram.name: histogram} + data = { + stoch_k.name: stoch_k, + stoch_d.name: stoch_d, + stoch_h.name: stoch_h + } df = DataFrame(data, index=close.index) df.name = f"{_name}{_props}" df.category = stoch_k.category diff --git a/pandas_ta/momentum/stochf.py b/pandas_ta/momentum/stochf.py index 99dbb8d..cfa4f9b 100644 --- a/pandas_ta/momentum/stochf.py +++ b/pandas_ta/momentum/stochf.py @@ -97,7 +97,10 @@ def stochf( stochf_d.name = f"{_name}d{_props}" stochf_k.category = stochf_d.category = "momentum" - data = {stochf_k.name: stochf_k, stochf_d.name: stochf_d} + data = { + stochf_k.name: stochf_k, + stochf_d.name: stochf_d + } df = DataFrame(data, index=close.index) df.name = f"{_name}{_props}" df.category = stochf_k.category diff --git a/pandas_ta/momentum/stochrsi.py b/pandas_ta/momentum/stochrsi.py index eaf544e..171fd06 100644 --- a/pandas_ta/momentum/stochrsi.py +++ b/pandas_ta/momentum/stochrsi.py @@ -94,7 +94,10 @@ def stochrsi( stochrsi_d.name = f"{_name}d{_props}" stochrsi_k.category = stochrsi_d.category = "momentum" - data = {stochrsi_k.name: stochrsi_k, stochrsi_d.name: stochrsi_d} + data = { + stochrsi_k.name: stochrsi_k, + stochrsi_d.name: stochrsi_d + } df = DataFrame(data) df.name = f"{_name}{_props}" df.category = stochrsi_k.category diff --git a/pandas_ta/utils/data/yahoofinance.py b/pandas_ta/utils/data/yahoofinance.py index 20da3d2..e42bc3c 100644 --- a/pandas_ta/utils/data/yahoofinance.py +++ b/pandas_ta/utils/data/yahoofinance.py @@ -91,10 +91,11 @@ def yf(ticker: str, **kwargs) -> DataFrame: df = DataFrame() try: df = yfd.history( - period=period, - interval=interval, - proxy=proxy, - **kwargs) + period=period, + interval=interval, + proxy=proxy, + **kwargs + ) except BaseException: if yfra.__version__ == "0.1.60": _yfv1_60 = f"[!] If history is not downloading, see yfinance Issue #760 by user djl0.\n" + \ diff --git a/tests/test_ext_indicator_momentum.py b/tests/test_ext_indicator_momentum.py index 7039d5a..6512fdb 100644 --- a/tests/test_ext_indicator_momentum.py +++ b/tests/test_ext_indicator_momentum.py @@ -222,7 +222,7 @@ class TestMomentumExtension(TestCase): def test_stoch_ext(self): self.data.ta.stoch(append=True) self.assertIsInstance(self.data, DataFrame) - self.assertEqual(list(self.data.columns[-2:]), ["STOCHk_14_3_3", "STOCHd_14_3_3"]) + self.assertEqual(list(self.data.columns[-3:]), ["STOCHk_14_3_3", "STOCHd_14_3_3", "STOCHh_14_3_3"]) def test_stochf_ext(self): self.data.ta.stochf(append=True)