Source code for pandas_ta.momentum.psl
# -*- coding: utf-8 -*-
from numpy import sign as npSign
from pandas_ta.utils import get_drift, get_offset, verify_series
[docs]def psl(close, open_=None, length=None, scalar=None, drift=None, offset=None, **kwargs):
"""Indicator: Psychological Line (PSL)"""
# Validate Arguments
length = int(length) if length and length > 0 else 12
scalar = float(scalar) if scalar and scalar > 0 else 100
close = verify_series(close, length)
drift = get_drift(drift)
offset = get_offset(offset)
if close is None: return
# Calculate Result
if open_ is not None:
open_ = verify_series(open_)
diff = npSign(close - open_)
else:
diff = npSign(close.diff(drift))
diff.fillna(0, inplace=True)
diff[diff <= 0] = 0 # Zero negative values
psl = scalar * diff.rolling(length).sum()
psl /= length
# Offset
if offset != 0:
psl = psl.shift(offset)
# Handle fills
if "fillna" in kwargs:
psl.fillna(kwargs["fillna"], inplace=True)
if "fill_method" in kwargs:
psl.fillna(method=kwargs["fill_method"], inplace=True)
# Name and Categorize it
_props = f"_{length}"
psl.name = f"PSL{_props}"
psl.category = "momentum"
return psl
psl.__doc__ = \
"""Psychological Line (PSL)
The Psychological Line is an oscillator-type indicator that compares the
number of the rising periods to the total number of periods. In other
words, it is the percentage of bars that close above the previous
bar over a given period.
Sources:
https://www.quantshare.com/item-851-psychological-line
Calculation:
Default Inputs:
length=12, scalar=100, drift=1
IF NOT open:
DIFF = SIGN(close - close[drift])
ELSE:
DIFF = SIGN(close - open)
DIFF.fillna(0)
DIFF[DIFF <= 0] = 0
PSL = scalar * SUM(DIFF, length) / length
Args:
close (pd.Series): Series of 'close's
open_ (pd.Series, optional): Series of 'open's
length (int): It's period. Default: 12
scalar (float): How much to magnify. Default: 100
drift (int): The difference period. Default: 1
offset (int): How many periods to offset the result. Default: 0
Kwargs:
fillna (value, optional): pd.DataFrame.fillna(value)
fill_method (value, optional): Type of fill method
Returns:
pd.Series: New feature generated.
"""