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
|