{% load humanize %}{% with r=results %}

{{ r.headline }}

{{ r.long_run_note }}

Forecasts of the volatility over the next {% if r.horizon == 1 %}trading day{% else %}{{ r.horizon }} trading days{% endif %}, made on each of {{ r.origins }} trading days, to . Prices to the close of .

The stock's realized volatility over this period was {{ r.realized }} a year.

Hansen's SPA test of whether any model beats naive: p = {{ r.spa_p_value }}. Whether any beats the long-run average: p = {{ r.long_run_p_value }}.

Leaderboard

{% for row in r.rows %} {% endfor %}
Model QLIKE vs naive Days won Average forecast p-value
{{ row.name }} {{ row.family }}{% if row.best %} ยท best model{% endif %} {{ row.qlike }} {{ row.gain.text }} {{ row.win_rate }} {{ row.volatility }} {{ row.p_value }}{% if row.significant %}*{% endif %}
QLIKE
The average loss of the variance forecasts against the realized variance, the sum of the squared daily returns. Lower is better. Only differences between models mean anything, not the level.
vs naive
The model's QLIKE minus naive's. Negative is better. A difference of 0.1 is large: it is the extra loss from forecasting volatility about 18% too low, or 26% too high, every day.
Days won
Share of the {{ r.origins }} forecasts where the model's loss was lower than naive's.
Average forecast
The model's average forecast as annualized volatility. The realized volatility was {{ r.realized }}.
p-value
Diebold-Mariano test against naive, allowing for overlapping forecasts and adjusted for testing {{ r.rivals|apnumber }} models (Holm). An asterisk marks p below {{ r.significance }}.

Forecasts

Compare with naive
{% for row in r.rows %}{% if row.key != 'naive' %} {% endif %}{% endfor %}

Forecast and realized volatility

Each day's forecast of the next {% if r.horizon == 1 %}trading day{% else %}{{ r.horizon }} trading days{% endif %}, against what came, all annualized. {% if r.horizon == 1 %}One day's realized volatility is a single move, so the dots scatter widely; that noise is why the losses are averaged over every day.{% else %}The dots are the volatility that came.{% endif %} The largest moves are cut off at the top so the forecasts stay readable; the table has every day.

Show the data

Running total against naive

Each day adds how much lower the model's QLIKE loss was than naive's. The line rises while the model is winning and falls while it is losing, so a steady climb is a lasting edge and a jump is one stretch.

Show the data
{{ r.chart|json_script:"chart-data" }} {% endwith %}