KDJ Source Code
class KDJIndicator(object):
def __init__(self,
low: pd.Series,
high: pd.Series,
close: pd.Series,
n: int = 9,
m1: int = 3,
m2: int = 3,
):
self._low = low.copy()
self._high = high.copy()
self._close = close.copy()
self._N = n
self._M1 = m1
self._M2 = m2
self._run()
def _run(self):
low_list = self._low.rolling(self._N).min()
low_list.fillna(value=self._low.expanding().min(), inplace=True)
high_list = self._high.rolling(self._N).max()
high_list.fillna(value=self._high.expanding().max(), inplace=True)
rsv = (self._close - low_list) / (high_list - low_list) * 100
self.K = rsv.ewm(com=self._M1-1).mean()
self.D = self.K.ewm(com=self._M2-1).mean()
self.J = 3 * self.K - 2 * self.D
def k(self):
return pd.Series(self.K, name='K')
def d(self):
return pd.Series(self.D, name='D')
def j(self):
return pd.Series(self.J, name='J')
欢迎关注~ SandQuant 专注于全球金融数据和量化投资策略