mirror of
https://github.com/wassname/pandas-ta.git
synced 2026-06-27 16:10:07 +08:00
BUG update missing talib parameters ENH TST tall_ma method
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user