Skip to content

Chande Momentum Oscillator

Intuição

O Chande Momentum Oscillator (CMO) é um oscilador de momentum semelhante ao RSI, mas baseado em somas (não médias) de ganhos e perdas na janela.

Ele retorna valores em [-100, 100].

Definição

Para ΔP_t = P_t - P_{t-1} e janela n:

  • Gain_t = sum(max(ΔP, 0))
  • Loss_t = sum(max(-ΔP, 0))
  • CMO_t = 100 * (Gain_t - Loss_t) / (Gain_t + Loss_t)

Uso

from quantmaster.features.momentum import chande_momentum_oscillator

df["cmo_14"] = chande_momentum_oscillator(df, window=14)

API

Source code in src/quantmaster/features/momentum.py
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
def chande_momentum_oscillator(
    data: pd.DataFrame | pd.Series,
    *,
    window: int = 14,
    price_col: str = "close",
) -> pd.Series:
    window = validate_positive_int(window, name="window")

    price = get_price_series(data, price_col=price_col).astype(float)
    delta = price.diff()

    gain = delta.clip(lower=0.0)
    loss = (-delta).clip(lower=0.0)

    sum_gain = gain.rolling(window).sum()
    sum_loss = loss.rolling(window).sum()

    denom = sum_gain + sum_loss
    out = 100.0 * (sum_gain - sum_loss) / denom.where(denom > 0)
    out = out.clip(lower=-100.0, upper=100.0)
    out.name = f"chande_momentum_oscillator_{window}"
    return out