Skip to content

Variance Ratio

Intuição

O Variance Ratio (Lo & MacKinlay) mede a relação entre a variância de retornos em um horizonte maior e a variância de retornos de 1 período. Em geral:

  • Valores > 1 sugerem persistência/momentum.
  • Valores < 1 sugerem reversão à média.

Definição

Para um holding period q e janela n:

  • VR(q) = Var(r_t(q)) / (q * Var(r_t))

onde r_t(q) é o retorno em q períodos (usando apenas dados passados).

Uso

from quantmaster.features.regime import variance_ratio

df["vr_120_5"] = variance_ratio(df, window=120, holding_period=5)

API

Source code in src/quantmaster/features/regime.py
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
def variance_ratio(
    data: pd.DataFrame | pd.Series,
    *,
    window: int = 120,
    holding_period: int = 5,
    price_col: str = "close",
) -> pd.Series:
    window = validate_positive_int(window, name="window")
    holding_period = validate_positive_int(holding_period, name="holding_period")

    price = get_price_series(data, price_col=price_col).astype(float)
    price = price.where(price > 0)
    r1 = np.log(price).diff()
    rq = np.log(price).diff(holding_period)

    var_1 = r1.rolling(window).var(ddof=1)
    var_q = rq.rolling(window).var(ddof=1)

    denom = float(holding_period) * var_1
    out = var_q / denom.where(denom != 0)
    out.name = f"variance_ratio_{window}_{holding_period}"
    return out