Ta-Lib源码解析(二):动量指标 (Momentum Indicator) #(附Python重构代码)

本文详细介绍了技术分析中用于衡量动量和趋势的多个指标,包括MACD、RSI、CCI、TRIX、MFI、AROON、DX系列、MOM、WILLR以及KDJ系列。每个指标的计算公式、应用方法和源码实现均有涉及,帮助投资者理解和运用这些工具来判断市场趋势和强度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2.(动量指标)Momentum Indicator

2.1 趋势强弱,对方向不敏感

MACD(异同移动平均线)

python函数原型:

macd, macdsignal, macdhist = MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)

公式(fmlabs.com):

移动平均收敛散度 (MACD) 是两个指数移动平均线之间的差异。信号线是 MACD 的指数移动平均线。
MACD 指示趋势变化并指示新趋势方向的开始。高值表示超买情况,低值表示超卖情况。与价格的背离表明当前趋势的结束,尤其是当 MACD 处于极高或极低值时。当 MACD 线穿过信号线上方时,就会产生买入信号。当 MACD 低于信号线时,会产生卖出信号。为了确认信号,买入时 MACD 应高于零,卖出时应低于零。
MACD 的时间段通常以 26 和 12 给出。然而,该函数实际上使用指数常数 0.075 和 0.15,它们更接近于 25.6667 和 12.3333 周期。要使用 MACD 内置的时间段以外的时间段创建类似的指标,请使用价格振荡器功能。

短均线: s h o r t m a = 0.15 × p r i c e + 0.85 × s h o r t m a − 1 shortma = 0.15 \times price + 0.85 \times shortma_{-1} shortma=0.15×price+0.85×shortma1
长均线: l o n g m a = 0.075 × p r i c e + 0.925 × l o n g m a − 1 longma = 0.075 \times price + 0.925 \times longma_{-1} longma=0.075×price+0.925×longma1
M A C D = s h o r t m a − l o n g m a MACD = shortma - longma MACD=shortmalongma
M A C D s i g n a l = E M A ( M A C D , s i g n a l p e r i o d ) MACDsignal = EMA(MACD, signalperiod) MACDsignal=EMA(MACD,signalperiod)
M A C D h i s t = M A C D − M A C D s i g n a l MACDhist = MACD - MACDsignal MACDhist=MACDMACDsignal

源码(来自ta_MACD.c, 有修改, 只保留逻辑):

def MACD(close, fastperiod=12, slowperiod=26, signalperiod=9):
    lookback_slow = slowperiod - 1
    lookback_sign = signalperiod - 1
    lookback_total = lookback_sign + lookback_slow
    startIdx = lookback_total
    t = startIdx - lookback_sign
    shortma = EMA_(close, fastperiod, startIdx = t)
    longma = EMA_(close, slowperiod, startIdx = t)
    macd = shortma - longma
    macdsignal = np.zeros(len(close))
    macdsignal[t:] = EMA(macd[t:], signalperiod)
    macdsignal[:t] = np.nan
    macd[:startIdx] = np.nan
    macdhist = macd - macdsignal
    return macd, macdsignal, macdhist
   
#用于计算MACD的EMA_函数, 与overlap中的EMA不同的是新加入了startIdx参数   
def EMA_(close, timeperiod = 30, startIdx = 0):
    k = 2 / (timeperiod + 1)
    lookback_ema = timeperiod - 1
    if startIdx < lookback_ema:
        startIdx = lookback_ema
    endIdx = len(close) - 1
    if lookback_ema >= len(close):
        exit('too short')
    output_ema = np.zeros(len(close))
    output_ema[startIdx] = np.mean(close[startIdx - lookback_ema:startIdx + 1])
    t = startIdx + 1
    while(t <= endIdx):
        output_ema[t] =  k * close[t] + (1 - k) * output_ema[t - 1]
        t += 1
    output_ema[:startIdx] = np.nan
    return output_ema

MACDEXT(异同移动平均线拓展)

python函数原型:

macd, macdsignal, macdhist = MACDEXT(close, fastperiod=12, fastmatype=0, slowperiod=26, slowmatype=0, signalperiod=9, signalmatype=0)

公式(官网无公式):

M A C D = M A f a s t m a t y p e ( c l o s e , f a s t p e r i o d ) − M A s l o w m a t y p e ( c l o s e , s l o w p e r i o d ) MACD = MA_{fastmatype}(close, fastperiod) - MA_{slowmatype}(close, slowperiod) MACD=MAfastmatype(close,fastperiod)MAslowmatype(close,slowperiod)
M A C D s i g n a l = M A s i g n a l m a t y p e ( m a c d , s i g n a l p e r i o d ) MACDsignal = MA_{signalmatype}(macd, signalperiod) MACDsignal=MAsignalmatype(macd,signalperiod)
M A C D h i s t = M A C D − M A C D s i g n a l MACDhist = MACD - MACDsignal MACDhist=MACDMACDsignal

源码(来自ta_MACDEXT.c, 有修改, 只保留逻辑):
源码逻辑与MACD相同, 只是设置了使用不同均线的接口

MACDFIX(异同移动平均线(固定窗口大小))

python函数原型:

macd, macdsignal, macdhist = MACDFIX(close, signalperiod=9)

与MACD逻辑相同,只是fast和slow的长度都是用来默认值

CCI(顺势指标)

python函数原型:

real = CCI(high, low, close, timeperiod=14)

公式:

CCI 旨在检测开始和结束的市场趋势。 100 到 -100 的范围是正常的交易范围。 超出此范围的 CCI 值表示超买或超卖情况。 您还可以在 CCI 中寻找价格差异。 如果价格创出新高,而 CCI 没有,则可能会出现价格调整。

T P = h i g h e s t ( t − n : t ) + l o w e s t ( t − n , t ) + c l o s e t 3 TP=\frac{highest(t-n:t) + lowest(t-n,t) + close_{t}}{3} TP=3highest(tn:t)+lowest(tn,t)+closet
C C 1 = 1 0.015 × T P − S M A ( T P , n , 1 ) s t d ( T P ) CC1 = \frac{1}{0.015} \times \frac{TP - SMA(TP,n,1)}{std(TP)} CC1=0.0151×std(TP)TPSMA(TP,n,1)

源码(来自ta_CCI.c,源码与公式不同):

源码中的逻辑跟公式不一样,high和close的选择当时的值而不是滞后窗口中的最值

#python
lookback = timeperiod - 1
TP = (high + close + low) / 3
SMA = TP.rolling(timeperiod).mean()[lookback:]
std = TP.rolling(timeperiod).std()[lookback:]
CCI[:] = 0.0
CCI[:lookback] = np.nan
CCI[lookback:] = 1/0.015 * (TP[lookback:] - SMA) / std

TRIX(三重指数平滑平均线)

python函数原型:

real = TRIX(close, timeperiod=30)

公式(官网公式):

TRIX 指标计算三重指数移动平均线的变化率。 值在零附近振荡。 当 TRIX 交叉高于/低于零时,会产生买入/卖出信号。 TRIX 的(通常)9 周期指数移动平均线可用作信号线。 当 TRIX 穿过信号线上方/下方并且也高于/低于零时,会产生买入/卖出信号。

M = E M A ( E M A ( E M A ( p r i c e ) ) ) M = EMA(EMA(EMA(price))) M=EMA(EMA(EMA(price)))
T R I X = 100 × M − M − 1 M TRIX = 100 \times \frac{M - M_{-1}}{M} TRIX=100×MMM1

源码(来自ta_TRIX.c, 有修改, 只保留逻辑):
源码中只是调用了EMA和ROC方法
EMA 源码见上篇

def TRIX(close, timeperiod=30):
    EMA_lookback = timeperiod - 1
    ROC_lookback = 1
    lookback_total = 3 * EMA_lookback + ROC_lookback
    
    temp_1 = EMA(close[startIdx - 3 * timeperiod - 1, endIdx], timeperiod)
    temp_2 = EMA(temp_1[startIdx - 2 * timeperiod - 1, endIdx], timeperiod)
    temp_3 = EMA(temp_1[startIdx -  timeperiod - 1, endIdx], timeperiod)
    TRIX =  (temp_3[startIdx : endIdx] / temp_3[startIdx - 1: endIdx - 1]) - 1

2.2 多空力量强弱对比

BOP(力量均衡指标)

python函数原型:

real = BOP(open, high, low, close)

公式(官网公式):
( c l o s e − o p e n ) / ( h i g h − l o w ) (close - open) / (high - low) (closeopen)/(highlow)
源码(来自ta_BOP.c, 有修改, 只保留逻辑):

#python
lookback = 0
BOP = (close - open) / (high - low)

RSI(相对强弱指标)

python函数原型

real = RSI(close, timeperiod=14)

官网公式

相对强弱指数 (RSI) 计算近期价格上涨走势与绝对价格走势的比率。 RSI 范围从 0 到 100。当值超过 70/低于 30 时,RSI 被解释为超买/超卖指标。您还可以寻找与价格的背离。 如果价格创出新高/新低,而 RSI 没有,则表明反转。

 Formula:  \text { Formula: }  Formula: 
 If  c l o s e > c l o s e − 1  then  \text{ If } close > close_{-1} \text{ then }  If close>close1 then 
u p = c l o s e − c l o s e − 1 \quad up=close - close_{-1} up=closeclose1
d n = 0 \quad dn=0 dn=0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

量化就是探索生活

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值