Skip to content

GARMAN–KLASS VOLATILITY

Intuição

O estimador Garman–Klass combina open, high, low, close para estimar volatilidade diária com maior eficiência do que usar apenas retornos close-to-close.

Definição

Seja HL_t = ln(high_t/low_t) e CO_t = ln(close_t/open_t). A variância Garman–Klass é:

GK_t = 0.5 * HL_t^2 - (2*ln(2)-1) * CO_t^2

A série é agregada via média rolling em janela n, e a volatilidade é sqrt(max(GK, 0)).

Uso

from quantmaster.features.volatility import garman_klass_volatility

df["gk"] = garman_klass_volatility(df, window=20)

API

Source code in src/quantmaster/features/volatility.py
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
def garman_klass_volatility(
    data: pd.DataFrame,
    *,
    window: int = 20,
    open_col: str = "open",
    high_col: str = "high",
    low_col: str = "low",
    close_col: str = "close",
) -> pd.Series:
    window = validate_positive_int(window, name="window")
    validate_columns(data, required=(open_col, high_col, low_col, close_col))

    o = pd.to_numeric(data[open_col], errors="coerce").astype(float)
    h = pd.to_numeric(data[high_col], errors="coerce").astype(float)
    l = pd.to_numeric(data[low_col], errors="coerce").astype(float)
    c = pd.to_numeric(data[close_col], errors="coerce").astype(float)

    o = o.where(o > 0)
    h = h.where(h > 0)
    l = l.where(l > 0)
    c = c.where(c > 0)

    log_hl = np.log(h / l)
    log_co = np.log(c / o)
    gk_var = 0.5 * log_hl.pow(2) - (2.0 * np.log(2.0) - 1.0) * log_co.pow(2)
    var = gk_var.rolling(window).mean()

    out = np.sqrt(var.clip(lower=0.0))
    out.name = f"garman_klass_volatility_{window}"
    return out