BUG update missing talib parameters ENH TST tall_ma method

This commit is contained in:
Kevin Johnson
2021-07-09 10:21:48 -07:00
parent de0fcf6ce5
commit e6d1bb576c
14 changed files with 54 additions and 19 deletions
+1 -1
View File
@@ -114,7 +114,7 @@ $ pip install pandas_ta
Latest Version
--------------
Best choice! Version: *0.3.03b*
Best choice! Version: *0.3.04b*
* 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
+7 -6
View File
@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
from pandas_ta import Imports
from pandas_ta.overlap import sma
from pandas_ta.utils import get_offset, verify_series
from pandas_ta.overlap import ma
from pandas_ta.utils import get_offset, tal_ma, verify_series
def apo(close, fast=None, slow=None, offset=None, **kwargs):
def apo(close, fast=None, slow=None, mamode=None, offset=None, **kwargs):
"""Indicator: Absolute Price Oscillator (APO)"""
# Validate Arguments
fast = int(fast) if fast and fast > 0 else 12
@@ -12,6 +12,7 @@ def apo(close, fast=None, slow=None, offset=None, **kwargs):
if slow < fast:
fast, slow = slow, fast
close = verify_series(close, max(fast, slow))
mamode = mamode if isinstance(mamode, str) else "sma"
offset = get_offset(offset)
if close is None: return
@@ -19,10 +20,10 @@ def apo(close, fast=None, slow=None, offset=None, **kwargs):
# Calculate Result
if Imports["talib"]:
from talib import APO
apo = APO(close, fast, slow)
apo = APO(close, fast, slow, tal_ma(mamode))
else:
fastma = sma(close, length=fast)
slowma = sma(close, length=slow)
fastma = ma(mamode, close, length=fast)
slowma = ma(mamode, close, length=slow)
apo = fastma - slowma
# Offset
+2 -1
View File
@@ -20,7 +20,8 @@ def dm(high, low, length=None, mamode=None, drift=None, offset=None, **kwargs):
if Imports["talib"]:
from talib import MINUS_DM, PLUS_DM
pos, neg = PLUS_DM(high, low), MINUS_DM(high, low)
pos = PLUS_DM(high, low, length)
neg = MINUS_DM(high, low, length)
else:
up = high - high.shift(drift)
dn = low.shift(drift) - low
+1 -1
View File
@@ -21,7 +21,7 @@ def macd(close, fast=None, slow=None, signal=None, offset=None, **kwargs):
# Calculate Result
if Imports["talib"]:
from talib import MACD
macd, signalma, histogram = MACD(close, fast, slow)
macd, signalma, histogram = MACD(close, fast, slow, signal)
else:
fastma = ema(close, length=fast)
slowma = ema(close, length=slow)
+2 -2
View File
@@ -2,7 +2,7 @@
from pandas import DataFrame
from pandas_ta import Imports
from pandas_ta.overlap import ma
from pandas_ta.utils import get_offset, verify_series
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):
@@ -23,7 +23,7 @@ def ppo(close, fast=None, slow=None, signal=None, scalar=None, mamode=None, offs
# Calculate Result
if Imports["talib"]:
from talib import PPO
ppo = PPO(close, fast, slow)
ppo = PPO(close, fast, slow, tal_ma(mamode))
else:
fastma = ma(mamode, close, length=fast)
slowma = ma(mamode, close, length=slow)
+1 -1
View File
@@ -25,7 +25,7 @@ def uo(high, low, close, fast=None, medium=None, slow=None, fast_w=None, medium_
# Calculate Result
if Imports["talib"]:
from talib import ULTOSC
uo = ULTOSC(high, low, close)
uo = ULTOSC(high, low, close, fast, medium, slow)
else:
tdf = DataFrame({
"high": high,
+1 -1
View File
@@ -17,7 +17,7 @@ def t3(close, length=None, a=None, offset=None, **kwargs):
# Calculate Result
if Imports["talib"]:
from talib import T3
t3 = T3(close, length)
t3 = T3(close, length, a)
else:
c1 = -a * a**2
c2 = 3 * a**2 + 3 * a**3
+18
View File
@@ -5,6 +5,7 @@ from sys import float_info as sflt
from numpy import argmax, argmin
from pandas import DataFrame, Series
from pandas_ta import Imports
from pandas.api.types import is_datetime64_any_dtype
@@ -82,6 +83,23 @@ def signed_series(series: Series, initial: int = None) -> Series:
return sign
def tal_ma(name: str) -> int:
"""Helper Function that returns the Enum value for TA Lib's MA Type"""
if Imports["talib"] and isinstance(name, str) and len(name) > 1:
from talib import MA_Type
name = name.lower()
if name == "sma": return MA_Type.SMA # 0
elif name == "ema": return MA_Type.EMA # 1
elif name == "wma": return MA_Type.WMA # 2
elif name == "dema": return MA_Type.DEMA # 3
elif name == "tema": return MA_Type.TEMA # 4
elif name == "trima": return MA_Type.TRIMA # 5
elif name == "kama": return MA_Type.KAMA # 6
elif name == "mama": return MA_Type.MAMA # 7
elif name == "t3": return MA_Type.T3 # 8
return 0 # Default: SMA -> 0
def unsigned_differences(series: Series, amount: int = None, **kwargs) -> Series:
"""Unsigned Differences
Returns two Series, an unsigned positive and unsigned negative series based
+2 -2
View File
@@ -3,7 +3,7 @@ from pandas import DataFrame
from pandas_ta import Imports
from pandas_ta.overlap import ma
from pandas_ta.statistics import stdev
from pandas_ta.utils import get_offset, non_zero_range, verify_series
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):
@@ -21,7 +21,7 @@ def bbands(close, length=None, std=None, mamode=None, ddof=0, offset=None, **kwa
# Calculate Result
if Imports["talib"]:
from talib import BBANDS
upper, mid, lower = BBANDS(close, length)
upper, mid, lower = BBANDS(close, length, std, std, tal_ma(mamode))
else:
standard_deviation = stdev(close=close, length=length, ddof=ddof)
deviations = std * standard_deviation
+1 -1
View File
@@ -21,7 +21,7 @@ def natr(high, low, close, length=None, mamode=None, scalar=None, drift=None, of
# Calculate Result
if Imports["talib"]:
from talib import NATR
natr = NATR(high, low, close)
natr = NATR(high, low, close, length)
else:
natr = scalar / close
natr *= atr(high=high, low=low, close=close, length=length, mamode=mamode, drift=drift, offset=offset, **kwargs)
+1 -1
View File
@@ -23,7 +23,7 @@ def adosc(high, low, close, volume, open_=None, fast=None, slow=None, offset=Non
# Calculate Result
if Imports["talib"]:
from talib import ADOSC
adosc = ADOSC(high, low, close, volume)
adosc = ADOSC(high, low, close, volume, fast, slow)
else:
ad_ = ad(high=high, low=low, close=close, volume=volume, open_=open_)
fast_ad = ema(close=ad_, length=fast, **kwargs)
+1 -1
View File
@@ -21,7 +21,7 @@ def mfi(high, low, close, volume, length=None, drift=None, offset=None, **kwargs
# Calculate Result
if Imports["talib"]:
from talib import MFI
mfi = MFI(high, low, close, volume)
mfi = MFI(high, low, close, volume, length)
else:
typical_price = hlc3(high=high, low=low, close=close)
raw_money_flow = typical_price * volume
+1 -1
View File
@@ -19,7 +19,7 @@ setup(
"pandas_ta.volatility",
"pandas_ta.volume"
],
version=".".join(("0", "3", "03b")),
version=".".join(("0", "3", "04b")),
description=long_description,
long_description=long_description,
author="Kevin Johnson",
+15
View File
@@ -149,12 +149,15 @@ class TestUtilities(TestCase):
result = self.utils.df_dates(self.data, ["1999-11-01", "2020-08-15", "2020-08-24", "2020-08-25", "2020-08-26", "2020-08-27"])
self.assertEqual(5, result.shape[0])
@skip
def test_df_month_to_date(self):
result = self.utils.df_month_to_date(self.data)
@skip
def test_df_quarter_to_date(self):
result = self.utils.df_quarter_to_date(self.data)
@skip
def test_df_year_to_date(self):
result = self.utils.df_year_to_date(self.data)
@@ -274,6 +277,18 @@ class TestUtilities(TestCase):
npt.assert_array_equal(self.utils.symmetric_triangle(n=5), array_5)
npt.assert_array_equal(self.utils.symmetric_triangle(n=5, weighted=True), array_5w)
def test_tal_ma(self):
self.assertEqual(self.utils.tal_ma("sma"), 0)
self.assertEqual(self.utils.tal_ma("Sma"), 0)
self.assertEqual(self.utils.tal_ma("ema"), 1)
self.assertEqual(self.utils.tal_ma("wma"), 2)
self.assertEqual(self.utils.tal_ma("dema"), 3)
self.assertEqual(self.utils.tal_ma("tema"), 4)
self.assertEqual(self.utils.tal_ma("trima"), 5)
self.assertEqual(self.utils.tal_ma("kama"), 6)
self.assertEqual(self.utils.tal_ma("mama"), 7)
self.assertEqual(self.utils.tal_ma("t3"), 8)
def test_zero(self):
self.assertEqual(self.utils.zero(-0.0000000000000001), 0)
self.assertEqual(self.utils.zero(0), 0)