Table consistency, VolDep progress

This commit is contained in:
2025-05-25 20:25:24 +02:00
parent e4021df6d2
commit bf246e2713
2 changed files with 107 additions and 87 deletions

189
index.qmd
View File

@@ -44,24 +44,23 @@ $$
$$
:::
::: {style="font-size: 150%;"}
<br/>
:::: {style="font-size: 150%;"}
<i class="fa fa-fw fa-rocket" style="color:var(--col_grey_9);"></i> &ensp; [Research Motivation](#motivation)
<i class="fa fa-fw fa-book" style="color:var(--col_grey_9);"></i> &ensp; Overview of the Thesis
<i class="fa fa-fw fa-code-merge" style="color:var(--col_grey_9);"></i> &ensp; Online Aggregation
<i class="fa fa-fw fa-fire-flame-simple" style="color:var(--col_grey_9);"></i> &ensp; Probabilistic Forecasting of European Carbon and Energy Prices
<i class="fa fa-fw fa-newspaper" style="color:var(--col_grey_9);"></i> &ensp; Contributions & Outlook
:::
<br>
[{{< fa bars-staggered >}}]{style="color: #404040;"} &ensp; [Introduction & Research Motivation](#motivation)
[{{< fa bars-staggered >}}]{style="color: #404040;"} &ensp; Overview of the Thesis
[{{< fa table >}}]{style="color: #404040;"} &ensp; Online Learning
[{{< fa circle-nodes >}}]{style="color: #404040;"} &ensp; Probabilistic Forecasting of European Carbon and Energy Prices
[{{< fa lightbulb >}}]{style="color: #404040;"} &ensp; Limitations
[{{< fa binoculars >}}]{style="color: #404040;"} &ensp; Contributions & Outlook
```{r, setup, include=FALSE}
# Compile with: rmarkdown::render("crps_learning.Rmd")
library(latex2exp)
@@ -538,7 +537,7 @@ Using the CRPS, we can calculate time-adaptive weights $w_{t,k}$. However, what
\label{eq_boa_opt_conv}
\end{equation}
`r fontawesome::fa("arrow-right", fill ="#000000")` Almost optimal w.r.t *convex aggregation* \eqref{eq_optp_conv} @wintenberger2017optimal.
`r fontawesome::fa("arrow-right", fill ="#000000")` Almost optimal w.r.t. *convex aggregation* \eqref{eq_optp_conv} @wintenberger2017optimal.
The same algorithm satisfies that there exist a $C>0$ such that for $x>0$ it holds that
\begin{equation}
@@ -550,7 +549,7 @@ The same algorithm satisfies that there exist a $C>0$ such that for $x>0$ it hol
if $Y_t$ is bounded, the considered loss $\ell$ is convex $G$-Lipschitz and weak exp-concave in its first coordinate.
`r fontawesome::fa("arrow-right", fill ="#000000")` Almost optimal w.r.t *selection* \eqref{eq_optp_select} @gaillard2018efficient.
`r fontawesome::fa("arrow-right", fill ="#000000")` Almost optimal w.r.t. *selection* \eqref{eq_optp_select} @gaillard2018efficient.
`r fontawesome::fa("arrow-right", fill ="#000000")` We show that this holds for QL under feasible conditions.
@@ -579,7 +578,7 @@ for all $x_1,x_2 \in \mathbb{R}$ and $t>0$ that
\mathbb{E}\left[ \left. \left( \alpha(\ell'(x_1, Y_t)(x_1 - x_2))^{2}\right)^{1/\beta} \right|\mathcal{F}_{t-1}\right]
\end{align*}
`r fontawesome::fa("arrow-right", fill ="#000000")` Almost optimal w.r.t *selection* \eqref{eq_optp_select} @gaillard2018efficient.
`r fontawesome::fa("arrow-right", fill ="#000000")` Almost optimal w.r.t. *selection* \eqref{eq_optp_select} @gaillard2018efficient.
:::
@@ -1247,12 +1246,8 @@ TTinit <- 1 ## without first, as all comb. are uniform
RQL <- apply(QL[1:KK, -c(1:TTinit), ], c(1, 3), mean)
dimnames(RQL) <- list(mnames, Qgrid)
RQLm <- apply(RQL, c(1), mean, na.rm = TRUE)
# sort(RQLm - RQLm[K + 1])
##
qq <- apply(QL[1:KK, -c(1:TTinit), ], c(1, 2), mean)
# t.test(qq[K + 1, ] - qq[K + 3, ])
# t.test(qq[K + 1, ] - qq[K + 4, ])
library(xtable)
Pall <- numeric(KK)
@@ -1290,12 +1285,13 @@ for (i.p in 1:MO) {
fblue <- round(approxfun(seq(crange[1], crange[2], length = length(cblue)), cblue)(pmin(xxx[, i.p], xmax)), 3)
tmp <- format(round(xxx[, i.p], 3), nsmall = 3)
xxxx[, i.p] <- paste("\\cellcolor[rgb]{", fred, ",", fgreen, ",", fblue, "}", tmp, " {\\footnotesize (", Pallout[IDX[i.p]], ")}", sep = "")
table[, i.p] <- paste0(tmp, " (", Pallout[i.p], ")")
table[, i.p] <- paste0(tmp, " (", Pallout[i.p], ")") # TODO: Improve here?
table_col[, i.p] <- rgb(fred, fgreen, fblue, maxColorValue = 1)
} # i.p
table_out <- kbl(table, align = rep("c", ncol(table)), bootstrap_options = c("condensed")) %>%
kable_paper(full_width = TRUE)
kable_paper(full_width = TRUE) %>%
row_spec(0:nrow(table), color = cols[9, "grey"])
for (j in 1:ncol(table)) {
table_out <- table_out %>%
@@ -1333,7 +1329,8 @@ for (i.p in 1:MO) {
} # i.p
table_out2 <- kableExtra::kbl(table2, align = rep("c", ncol(table2)), bootstrap_options = c("condensed")) %>%
kable_paper(full_width = TRUE)
kable_paper(full_width = TRUE) %>%
row_spec(0:nrow(table2), color = cols[9, "grey"])
for (j in 1:ncol(table2)) {
table_out2 <- table_out2 %>%
@@ -1623,7 +1620,7 @@ table_naive <- naive_table_df %>%
align = c("c", rep("c", ncol(naive_table_df) - 1))
) %>%
kable_paper(full_width = TRUE) %>%
row_spec(0:1, color = cols[10, "grey"]) %>%
row_spec(0:1, color = cols[9, "grey"]) %>%
kable_styling(font_size = 16)
@@ -1694,7 +1691,7 @@ table_performance <- performance_loss_tibble %>%
align = c("l", "l", rep("c", ncol(performance_loss_tibble)-2))
) %>%
kable_paper(full_width = TRUE) %>%
row_spec(0:nrow(performance_loss_tibble), color = cols[10, "grey"])
row_spec(0:nrow(performance_loss_tibble), color = cols[9, "grey"])
# %%
@@ -2214,23 +2211,33 @@ Berrisch, J., Pappert, S., Ziel, F., & Arsova, A. (2023). *Finance Research Lett
---
## Motivation
## &nbsp;
:::: {.columns}
::: {.column width="48%"}
- Understanding European Allowances (EUA) dynamics is important
### Motivation
Understanding European Allowances (EUA) dynamics is important
for several fields:
- - Portfolio & Risk Management,
- - Sustainability Planing
- - Political decisions
- - ...
<i class="fa fa-fw fa-chart-pie" style="color:var(--col_grey_9);"></i> Portfolio & Risk Management,
<i class="fa fa-fw fa-timeline" style="color:var(--col_grey_9);"></i> Sustainability Planing
<i class="fa fa-fw fa-handshake" style="color:var(--col_grey_9);"></i> Political decisions
EUA prices are obviously connected to the energy market
How can the dynamics be characterized?
Several Questions arise:
- Data (Pre)processing
- Modeling Approach
- Evaluation
:::
::: {.column width="2%"}
@@ -2239,13 +2246,25 @@ How can the dynamics be characterized?
::: {.column width="48%"}
</br>
### Data
- Several Questions arise:
EUA, natural gas, Brent crude oil, coal
- - Data (Pre)processing
- - Modeling Approach
- - Evaluation
March 15, 2010, until October 14, 2022
Data was normalized w.r.t. $\text{CO}_2$ emissions
Emission-adjusted prices reflects one tonne of $\text{CO}_2$
We adjusted for inflation by Eurostat's HICP, excluding energy
Log transformation of the data to stabilize the variance
ADF Test: All series are stationary in first differences
Johansens likelihood ratio trace test suggests two cointegrating relationships (levels)
Johansens likelihood ratio trace test suggests no cointegrating relationships (logs)
:::
@@ -2253,24 +2272,6 @@ How can the dynamics be characterized?
## Data
- EUA, natural gas, Brent crude oil, coal
- March 15, 2010, until October 14, 2022
- Data was normalized w.r.t. $\text{CO}_2$ emissions
- Emission-adjusted prices reflects one tonne of $\text{CO}_2$
- We adjusted for inflation by Eurostat's HICP, excluding energy
- Log transformation of the data to stabilize the variance
- ADF Test: All series are stationary in first differences
- Johansens likelihood ratio trace test suggests two cointegrating relationships (levels)
- Johansens likelihood ratio trace test suggests no cointegrating relationships (logs)
## Data
```{r, echo=FALSE, fig.width = 12, fig.height = 6, fig.align="center", cache = TRUE}
readr::read_csv("assets/voldep/2022_10_14_eur_ref_co2_adj_hvpi_ex_nrg.csv") %>%
select(-EUR_USD, -hvpi_x_nrg) %>%
@@ -2339,15 +2340,17 @@ readr::read_csv("assets/voldep/2022_10_14_eur_ref_co2_adj_hvpi_ex_nrg.csv") %>%
### GARCH: Generalized Autoregressive Conditional Heteroscedasticity
- Captures the variance dynamics
- Captures dynamics in conditional variance
### Copula: Captures the dependence structure
- Captures: conditional cross-sectional dependence structure
- Captures: conditional cross-sectional dependencies
- Dependence allowed to vary over time
## Modeling Approach: Overview
## Modeling Approach: Notation
<br/>
:::: {.columns}
@@ -2400,15 +2403,17 @@ We take $C$ as the $t$-copula
## Modeling Approach: Mean and Variance
<br/>
:::: {.columns}
::: {.column width="48%"}
#### Individual marginal distributions:
### Individual marginal distributions:
$$\mathbf{F} = (F_1, \ldots, F_K)^{\intercal}$$
#### Generalized non-central t-distributions
### Generalized non-central t-distributions
- To account for heavy tails
- Time varying
- expectation: $\boldsymbol{\mu}_t = (\mu_{1,t}, \ldots, \mu_{K,t})^{\intercal}$
@@ -2425,7 +2430,7 @@ $$\mathbf{F} = (F_1, \ldots, F_K)^{\intercal}$$
::: {.column width="48%"}
#### VECM Model
### VECM Model
\begin{align}
\Delta \boldsymbol{\mu}_t = \Pi \boldsymbol{x}_{t-1} + \Gamma \Delta \boldsymbol{x}_{t-1} \nonumber
@@ -2433,7 +2438,7 @@ $$\mathbf{F} = (F_1, \ldots, F_K)^{\intercal}$$
where $\Pi = \alpha \beta^{\intercal}$ is the cointegrating matrix of rank $r$, $0 \leq r\leq K$.
#### GARCH model
### GARCH model
\begin{align}
\sigma_{i,t}^2 = & \omega_i + \alpha^+_{i} (\epsilon_{i,t-1}^+)^2 + \alpha^-_{i} (\epsilon_{i,t-1}^-)^2 + \beta_i \sigma_{i,t-1}^2 \nonumber
@@ -2449,11 +2454,13 @@ Separate coefficients for positive and negative innovations to capture leverage
## Modeling Approach: Dependence
<br/>
:::: {.columns}
::: {.column width="48%"}
#### Time-varying dependence parameters
### Time-varying dependence parameters
\begin{align*}
\Xi_{t} = & \Lambda\left(\boldsymbol{\xi}_{t}\right)
@@ -2479,7 +2486,7 @@ $\Lambda(\cdot)$ is a link function
::: {.column width="48%"}
#### Maximum Likelihood Estimation
### Maximum Likelihood Estimation
All parameters can be estimated jointly. Using conditional independence:
\begin{align*}
@@ -2498,11 +2505,13 @@ The copula density $c$ can be derived analytically.
## Study Design and Evaluation
<br/>
:::: {.columns}
::: {.column width="48%"}
#### Rolling-window forecasting study
### Rolling-window forecasting study
- 3257 observations total
- Window size: 1000 days (~ four years)
@@ -2516,18 +2525,18 @@ We draw $2^{12}= 2048$ trajectories from the joint predictive distribution
:::
::: {.column width="2%"}
::: {.column width="4%"}
:::
::: {.column width="48%"}
#### Evaluation
### Evaluation
Forecasts are evaluated by the energy score (ES)
\begin{align*}
\text{ES}_t(F, \mathbf{x}_t) = \mathbb{E}_{F} \left(||\tilde{\mathbf{X}}_t - \mathbf{x}_t||_2\right) - \frac{1}{2} \mathbb{E}_F \left(||\tilde{\mathbf{X}}_t - \tilde{\mathbf{X}}_t'||_2 \right)
\text{ES}_t(F, \mathbf{x}_t) = \mathbb{E}_{F} \left(||\tilde{\mathbf{X}}_t - \mathbf{x}_t||_2\right) - \\ \frac{1}{2} \mathbb{E}_F \left(||\tilde{\mathbf{X}}_t - \tilde{\mathbf{X}}_t'||_2 \right)
\end{align*}
where $\mathbf{x}_t$ is the observed $K$-dimensional realization and $\tilde{\mathbf{X}}_t$, respectively $\tilde{\mathbf{X}}_t'$ are independent random vectors distributed according to $F$
@@ -2538,17 +2547,21 @@ For univariate cases the Energy Score becomes the Continuous Ranked Probability
::::
## Results
::: {.panel-tabset}
## Energy Scores
:::: {.columns}
::: {.column width="48%"}
::: {.column width="55%"}
Relative improvement in ES compared to $\text{RW}^{\sigma, \rho}$
Cellcolor: w.r.t test statistic of Diebold-Mariano test (testing wether the model outperformes the benchmark, greener = better).
Cellcolor: w.r.t. test statistic of Diebold-Mariano test (testing wether the model outperformes the benchmark, greener = better).
```{r, echo=FALSE, results='asis', cache = TRUE}
```{r, echo=FALSE, results='asis', width = 'revert-layer', cache = TRUE}
load("assets/voldep/energy_df.Rdata")
table_energy <- energy %>%
kbl(
@@ -2571,8 +2584,8 @@ table_energy <- energy %>%
format = "html",
align = c("l", rep("r", ncol(energy) - 1))
) %>%
kable_paper(full_width = FALSE) %>%
row_spec(0:nrow(energy), color = cols[10, "grey"])
kable_paper(full_width = TRUE) %>%
row_spec(0:nrow(energy), color = cols[9, "grey"])
for (i in 2:ncol(energy)) {
bold_cells <- rep(FALSE, times = nrow(energy))
@@ -2598,18 +2611,17 @@ for (i in 2:ncol(energy)) {
table_energy %>%
kable_styling(
bootstrap_options = c("condensed"),
full_width = TRUE,
font_size = 14
)
```
:::
::: {.column width="2%"}
::: {.column width="4%"}
:::
::: {.column width="48%"}
::: {.column width="41%"}
- Benchmarks:
- $\text{RW}^{\sigma, \rho}$: Random walk with constant volatility and correlation
@@ -2640,7 +2652,7 @@ table_energy %>%
:::
::: {.column width="2%"}
::: {.column width="4%"}
:::
@@ -2659,7 +2671,7 @@ table_crps <- crps %>%
# Dont replace any string, dataframe has to be valid latex code ...
escape = FALSE,
format = "html",
booktabs = TRUE,
booktabs = FALSE,
align = c("l", rep("r", ncol(crps) - 1))
) %>%
kable_paper(full_width = FALSE)
@@ -2683,7 +2695,8 @@ for (i in 2:ncol(crps)) {
}
table_crps <- table_crps %>%
add_header_above(c(" ", "EUA" = 3, "Oil" = 3, "NGas" = 3, "Coal" = 3))
add_header_above(c(" ", "EUA" = 3, "Oil" = 3, "NGas" = 3, "Coal" = 3)) %>%
row_spec(0:nrow(crps), color = cols[9, "grey"])
table_crps %>%
kable_styling(
@@ -2718,13 +2731,12 @@ Conclusion: the Improvements seen before must be attributed to other parts of th
:::
::: {.column width="2%"}
::: {.column width="4%"}
:::
::: {.column width="68%"}
Improvement in RMSE score of selected models relative to $\textrm{RW}^{\sigma, \rho}_{}$ in % (higher = better). Colored according to the test statistic of a DM-Test comparing to $\textrm{RW}^{\sigma, \rho}_{}$ (greener means lower test statistic i.e., better performance compared to $\textrm{RW}^{\sigma, \rho}_{}$).
```{r, echo=FALSE, results = 'asis', cache = TRUE}
@@ -2761,7 +2773,8 @@ for (i in 2:ncol(rmsq)) {
}
table_rmsq <- table_rmsq %>%
add_header_above(c(" ", "EUA" = 3, "Oil" = 3, "NGas" = 3, "Coal" = 3))
add_header_above(c(" ", "EUA" = 3, "Oil" = 3, "NGas" = 3, "Coal" = 3)) %>%
row_spec(0:nrow(rmsq), color = cols[9, "grey"])
table_rmsq %>%
kable_styling(
@@ -2777,7 +2790,7 @@ table_rmsq %>%
## Evolution of Linear Dependence $\Xi$
```{r, echo=FALSE, fig.width = 12, fig.height = 6, fig.align="center", cache = TRUE}
```{r, echo=FALSE, fig.width = 12, fig.height = 5.5, fig.align="center", cache = TRUE}
load("assets/voldep/plot_rho_df.Rdata")
ggplot() +
geom_line(
@@ -2860,9 +2873,9 @@ ggplot() +
)
```
## Predictive Quantiles (Russian Invasion)
## Predictive Quantiles
```{r, echo=FALSE, fig.width = 12, fig.height = 6, fig.align="center", cache = TRUE}
```{r, echo=FALSE, fig.width = 12, fig.height = 5.5, fig.align="center", cache = TRUE}
load("assets/voldep/plot_quant_df.Rdata")
plot_quant_data %>% ggplot(aes(x = date, y = value)) +
@@ -2922,6 +2935,8 @@ plot_quant_data %>% ggplot(aes(x = date, y = value)) +
```
::::
## Conclusion
:::: {.columns}
@@ -2938,7 +2953,7 @@ Accounting for heteroscedasticity or stabilizing the variance via log transforma
:::
::: {.column width="2%"}
::: {.column width="4%"}
:::