Skip to content

Time-Series Momentum

Intuição

O Time-Series Momentum (Moskowitz, Ooi & Pedersen) mede o momentum usando apenas o histórico do próprio ativo (não é cross-sectional).

Uma forma comum é escalar o retorno de lookback por uma estimativa de volatilidade (para comparar ativos/regimes distintos).

Definição

Usando preço P_t e retornos log:

  • r_total = ln(P_t) - ln(P_{t-lookback})
  • σ_t = std(Δln(P), window=volatility_window)
  • TSMOM_t = r_total / σ_t

Uso

from quantmaster.features.momentum import time_series_momentum

df["tsmom"] = time_series_momentum(df, lookback=252, volatility_window=60)

API

Source code in src/quantmaster/features/momentum.py
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
def time_series_momentum(
    data: pd.DataFrame | pd.Series,
    *,
    lookback: int = 252,
    volatility_window: int = 60,
    price_col: str = "close",
) -> pd.Series:
    lookback = validate_positive_int(lookback, name="lookback")
    volatility_window = validate_positive_int(volatility_window, name="volatility_window")

    price = get_price_series(data, price_col=price_col).astype(float)
    price = price.where(price > 0)

    log_p = np.log(price)
    r_total = log_p.diff(lookback)

    daily = log_p.diff()
    sigma = daily.rolling(volatility_window).std(ddof=1)

    out = r_total / sigma.where(sigma > 0)
    out.name = f"time_series_momentum_{lookback}_{volatility_window}"
    return out