1 Learning Objectives

By the end of this chapter, the student should be able to:

  1. explain the meaning of dynamic risk management;
  2. distinguish static and dynamic risk measurement;
  3. explain why volatility changes over time in financial return series;
  4. describe the role of conditional volatility in risk measurement;
  5. explain why one-day, five-day, and ten-day risk horizons may produce different risk estimates;
  6. compute rolling volatility and rolling VaR;
  7. compute EWMA volatility and dynamic VaR;
  8. compare static VaR with dynamic VaR;
  9. explain how dynamic VaR can respond to changing market conditions;
  10. discuss the limitations of dynamic risk models.

2 Introduction

Previous chapters introduced extreme risk measurement using VaR, Expected Shortfall, Extreme Value Theory, the Peaks Over Threshold method, the Generalized Pareto Distribution, threshold selection, and stress testing. These methods are very important, but many of them were first presented in a relatively static way. A static risk estimate assumes that the distribution of returns or losses is stable over the period being analysed.

In real financial markets, risk is not constant. Volatility changes over time. Calm periods are often followed by calm periods, while turbulent periods are often followed by further turbulence. This behaviour is called volatility clustering. Because of this, a risk estimate based on the full historical sample may not reflect current market conditions.

Dynamic risk management deals with the measurement and management of risk when market conditions change over time. Instead of producing one fixed risk estimate for the whole sample, dynamic risk management updates risk estimates as new data arrive. This is especially important for short-horizon market risk, where the current volatility environment can strongly affect the next one-day, five-day, or ten-day loss distribution.

Dynamic risk management is therefore concerned with conditional risk. A conditional risk measure is based on information available at the current time. For example, the one-day VaR for tomorrow should depend on what is known today, including recent volatility.

3 Static and Dynamic Risk Measurement

A static risk measure uses one set of assumptions or one historical sample to estimate risk. For example, if we calculate the 99% historical VaR from five years of daily losses, we obtain one number. This number is useful, but it treats the full sample as if all observations are equally relevant to the current risk environment.

A dynamic risk measure changes over time. It is updated as new observations become available. For example, a rolling historical VaR uses only the most recent observations, such as the previous 250 trading days. When a new day arrives, the oldest observation is dropped and the newest observation is added. The VaR estimate therefore changes through time.

The difference can be stated simply. Static risk measurement asks:

What is the risk based on the whole sample or a fixed model?

Dynamic risk measurement asks:

What is the risk today, given the information currently available?

Dynamic risk measurement is especially important during crises. If volatility rises suddenly, a static VaR estimate based on many years of data may adjust slowly. A dynamic model should respond more quickly to changing conditions.

4 Volatility Clustering and Conditional Risk

Financial returns often show volatility clustering. Large changes tend to be followed by large changes, and small changes tend to be followed by small changes. This does not necessarily mean that the direction of returns is easy to predict. Rather, it means that the magnitude of returns changes over time.

If returns are denoted by \(R_t\), a simple model may write

\[ R_t = \mu_t + \sigma_t Z_t, \]

where \(\mu_t\) is the conditional mean, \(\sigma_t\) is the conditional volatility, and \(Z_t\) is a standardized innovation.

The key object for risk management is often \(\sigma_t\), the conditional volatility. If \(\sigma_t\) is large, the distribution of tomorrow’s return is more spread out, and the potential loss is larger. If \(\sigma_t\) is small, the distribution is less spread out, and the potential loss is smaller.

For short-horizon financial risk measurement, the conditional mean is often small relative to volatility. Because of this, many introductory market-risk calculations assume \(\mu_t\approx0\). The risk estimate is then driven mainly by the conditional volatility.

set.seed(2426)

n <- 1500
volatility <- c(rep(0.008, 500), rep(0.025, 400), rep(0.012, 600))
returns <- rnorm(n, mean = 0, sd = volatility)

dynamic_data <- tibble(
  Time = 1:n,
  Return = returns,
  Loss = -returns,
  True_Volatility = volatility
)

dynamic_data %>%
  summarise(
    Mean_Return = mean(Return),
    Return_Standard_Deviation = sd(Return),
    Minimum_Return = min(Return),
    Maximum_Return = max(Return),
    Skewness = skewness(Return),
    Kurtosis = kurtosis(Return)
  )
dynamic_plot_data <- dynamic_data %>%
  mutate(Return_Percent = Return * 100)

ggplot(dynamic_plot_data, aes(x = Time, y = Return_Percent)) +
  geom_line() +
  scale_y_continuous(labels = label_number(suffix = "%")) +
  labs(
    title = "Simulated Return Series with Changing Volatility",
    x = "Time",
    y = "Return"
  )

The middle part of the simulated series has higher volatility than the beginning and ending parts. A static risk estimate may fail to represent this changing risk environment properly.

5 Rolling Volatility

One simple way to make risk measurement dynamic is to use rolling windows. A rolling window uses only the most recent observations to estimate current risk.

For example, a 250-day rolling standard deviation estimates current volatility using the previous 250 daily returns. If the window is short, the estimate responds quickly to new market information but may be noisy. If the window is long, the estimate is smoother but responds more slowly.

Let \(m\) be the rolling window size. The rolling volatility at time \(t\) can be written as

\[ \hat{\sigma}_t = \sqrt{ \frac{1}{m-1} \sum_{j=t-m+1}^{t} (R_j-\bar{R}_{t,m})^2 }, \]

where \(\bar{R}_{t,m}\) is the average return inside the rolling window.

window_size <- 100

dynamic_data <- dynamic_data %>%
  mutate(
    Rolling_Volatility = rollapply(
      Return,
      width = window_size,
      FUN = sd,
      fill = NA,
      align = "right"
    )
  )

rolling_vol_plot <- dynamic_data %>%
  mutate(
    Rolling_Volatility_Percent = Rolling_Volatility * 100,
    True_Volatility_Percent = True_Volatility * 100
  )

ggplot(rolling_vol_plot, aes(x = Time)) +
  geom_line(aes(y = Rolling_Volatility_Percent)) +
  geom_line(aes(y = True_Volatility_Percent), linetype = "dashed") +
  scale_y_continuous(labels = label_number(suffix = "%")) +
  labs(
    title = "Rolling Volatility and True Simulated Volatility",
    x = "Time",
    y = "Volatility"
  )

The rolling volatility follows the changes in the simulated volatility, but it adjusts gradually. This is because it averages information over a window of past returns.

6 Rolling Historical VaR

Rolling historical VaR is another simple dynamic method. Instead of estimating one VaR from the entire sample, the analyst estimates VaR repeatedly using a moving window of recent losses.

If the rolling window has length \(m\), the rolling historical VaR at level \(q\) is the \(q\)-quantile of the losses inside the current window:

\[ \widehat{VaR}_{q,t} = \widehat{F}^{-1}_{t,m}(q), \]

where \(\widehat{F}_{t,m}\) is the empirical distribution function of losses in the rolling window ending at time \(t\).

rolling_var <- function(x, width, q) {
  rollapply(
    x,
    width = width,
    FUN = function(z) as.numeric(quantile(z, probs = q, na.rm = TRUE)),
    fill = NA,
    align = "right"
  )
}

dynamic_data <- dynamic_data %>%
  mutate(
    Rolling_VaR_95 = rolling_var(Loss, window_size, 0.95),
    Rolling_VaR_99 = rolling_var(Loss, window_size, 0.99)
  )

rolling_var_plot <- dynamic_data %>%
  mutate(
    VaR_95_Percent = Rolling_VaR_95 * 100,
    VaR_99_Percent = Rolling_VaR_99 * 100
  )

ggplot(rolling_var_plot, aes(x = Time)) +
  geom_line(aes(y = VaR_95_Percent)) +
  geom_line(aes(y = VaR_99_Percent), linetype = "dashed") +
  scale_y_continuous(labels = label_number(suffix = "%")) +
  labs(
    title = "Rolling Historical VaR",
    x = "Time",
    y = "Loss threshold"
  )

The 99% rolling VaR is generally larger than the 95% rolling VaR because it looks further into the loss tail. Both estimates rise during the high-volatility period.

7 EWMA Volatility

Another common dynamic volatility method is Exponentially Weighted Moving Average, abbreviated as EWMA. EWMA gives more weight to recent returns and less weight to older returns.

A common EWMA variance recursion is

\[ \hat{\sigma}_t^2 = \lambda \hat{\sigma}_{t-1}^2 + (1-\lambda)R_{t-1}^2, \]

where \(0<\lambda<1\) is the decay factor. A value commonly used in daily market risk is \(\lambda=0.94\). A larger value of \(\lambda\) makes volatility smoother and slower to react. A smaller value makes volatility more responsive to recent shocks.

The EWMA model is useful because it captures the idea that recent large returns should increase current risk estimates.

ewma_volatility <- function(r, lambda = 0.94) {
  n <- length(r)
  sigma2 <- numeric(n)
  sigma2[1] <- var(r, na.rm = TRUE)

  for (t in 2:n) {
    sigma2[t] <- lambda * sigma2[t - 1] + (1 - lambda) * r[t - 1]^2
  }

  sqrt(sigma2)
}

dynamic_data <- dynamic_data %>%
  mutate(
    EWMA_Volatility = ewma_volatility(Return, lambda = 0.94)
  )

ewma_vol_plot <- dynamic_data %>%
  mutate(
    EWMA_Volatility_Percent = EWMA_Volatility * 100,
    True_Volatility_Percent = True_Volatility * 100
  )

ggplot(ewma_vol_plot, aes(x = Time)) +
  geom_line(aes(y = EWMA_Volatility_Percent)) +
  geom_line(aes(y = True_Volatility_Percent), linetype = "dashed") +
  scale_y_continuous(labels = label_number(suffix = "%")) +
  labs(
    title = "EWMA Volatility and True Simulated Volatility",
    x = "Time",
    y = "Volatility"
  )

The EWMA estimate reacts to changes in volatility while still smoothing random noise. It is a convenient bridge between simple rolling volatility and more formal GARCH-type models.

8 Dynamic VaR and Expected Shortfall Under Conditional Normality

Once conditional volatility has been estimated, it can be used to calculate dynamic VaR. Under the conditional normality assumption and assuming a zero conditional mean, the one-day VaR at confidence level \(q\) for a portfolio with value \(V\) is

\[ VaR_{q,t} = V z_q \hat{\sigma}_t, \]

where \(z_q\) is the \(q\)-quantile of the standard normal distribution.

For Expected Shortfall under conditional normality,

\[ ES_{q,t} = V \hat{\sigma}_t \frac{\phi(z_q)}{1-q}, \]

where \(\phi(z_q)\) is the standard normal density evaluated at \(z_q\).

These formulas are dynamic because \(\hat{\sigma}_t\) changes over time. When volatility rises, VaR and Expected Shortfall rise. When volatility falls, VaR and Expected Shortfall fall.

portfolio_value <- 100000000
q <- 0.99
z_q <- qnorm(q)

dynamic_data <- dynamic_data %>%
  mutate(
    Dynamic_VaR_99 = portfolio_value * z_q * EWMA_Volatility,
    Dynamic_ES_99 = portfolio_value * EWMA_Volatility * dnorm(z_q) / (1 - q)
  )

dynamic_risk_plot <- dynamic_data %>%
  mutate(
    VaR_Millions = Dynamic_VaR_99 / 1000000,
    ES_Millions = Dynamic_ES_99 / 1000000
  )

ggplot(dynamic_risk_plot, aes(x = Time)) +
  geom_line(aes(y = VaR_Millions)) +
  geom_line(aes(y = ES_Millions), linetype = "dashed") +
  scale_y_continuous(labels = label_number()) +
  labs(
    title = "Dynamic 99% VaR and Expected Shortfall Using EWMA Volatility",
    x = "Time",
    y = "Loss (KSh millions)"
  )

Expected Shortfall is larger than VaR because it estimates the average loss beyond the VaR threshold. Both risk measures increase during high-volatility periods.

9 Static VaR Compared with Dynamic VaR

A useful way to understand dynamic risk management is to compare static VaR with dynamic VaR. Static VaR produces a single number based on the full sample. Dynamic VaR produces a time series of risk estimates.

static_sigma <- sd(dynamic_data$Return)
static_var_99 <- portfolio_value * qnorm(0.99) * static_sigma

static_dynamic_plot <- dynamic_data %>%
  mutate(
    Dynamic_VaR_Millions = Dynamic_VaR_99 / 1000000,
    Static_VaR_Millions = static_var_99 / 1000000
  )

ggplot(static_dynamic_plot, aes(x = Time)) +
  geom_line(aes(y = Dynamic_VaR_Millions)) +
  geom_hline(aes(yintercept = Static_VaR_Millions), linetype = "dashed") +
  scale_y_continuous(labels = label_number()) +
  labs(
    title = "Static VaR Compared with Dynamic VaR",
    x = "Time",
    y = "VaR (KSh millions)"
  )

The static VaR is constant. The dynamic VaR changes over time. During high-volatility periods, dynamic VaR may rise above static VaR. During calm periods, it may fall below static VaR. This illustrates why dynamic models are useful for changing market conditions.

10 One-Day, Five-Day, and Ten-Day Horizons

Risk managers often need VaR over more than one horizon. Common horizons include one day, five days, and ten days. A one-day horizon is useful for daily market monitoring. A five-day horizon may correspond approximately to one trading week. A ten-day horizon is important in regulatory market risk frameworks.

If returns are independent and identically distributed with constant volatility, a simple square-root-of-time scaling rule may be used:

\[ VaR_{q,h} \approx VaR_{q,1}\sqrt{h}, \]

where \(h\) is the number of days. The same logic is often applied to volatility:

\[ \sigma_h\approx \sigma_1\sqrt{h}. \]

However, this rule depends on strong assumptions. It assumes that returns are independent, volatility is constant, and the return distribution behaves well across horizons. These assumptions may fail under heavy tails, volatility clustering, autocorrelation, and market stress.

This chapter introduces the horizons because they are central to dynamic risk management. The next chapter treats square-root-of-time scaling in more detail.

latest_var_1_day <- tail(dynamic_data$Dynamic_VaR_99, 1)

horizon_table <- tibble(
  Horizon_Days = c(1, 5, 10),
  Approximate_VaR = latest_var_1_day * sqrt(Horizon_Days),
  Approximate_VaR_Millions = Approximate_VaR / 1000000
)

horizon_table
ggplot(horizon_table, aes(x = factor(Horizon_Days), y = Approximate_VaR_Millions)) +
  geom_col() +
  scale_y_continuous(labels = label_number()) +
  labs(
    title = "Approximate VaR Across Risk Horizons",
    x = "Risk horizon (days)",
    y = "VaR (KSh millions)"
  )

The ten-day VaR is larger than the one-day VaR because the portfolio is exposed to risk over a longer period. The square-root rule provides a simple approximation, but it should not be applied blindly.

11 Dynamic Risk Management Workflow

A practical dynamic risk management process may follow these steps.

First, collect recent return or loss data for the portfolio or risk factor. Second, check the data for outliers, missing values, and changes in market conditions. Third, estimate current volatility using a rolling window, EWMA, GARCH-type model, or another suitable method. Fourth, compute current VaR and Expected Shortfall using the estimated conditional distribution. Fifth, compare current risk estimates with risk limits and capital availability. Sixth, back-test the model by comparing realized losses with previous VaR forecasts. Seventh, update the model as new data arrive.

The important point is that dynamic risk management is an ongoing process. It is not a one-time calculation. A risk estimate that was appropriate last month may be inappropriate today if market conditions have changed.

12 Limitations of Dynamic Risk Models

Dynamic risk models are useful, but they have limitations.

First, they depend on modelling assumptions. EWMA assumes a particular way of updating volatility. GARCH-type models impose a specific volatility structure. If the assumptions are wrong, risk estimates may be misleading.

Second, dynamic models may react slowly to sudden regime changes. If a crisis begins abruptly, a model based on recent data may still underestimate risk at the beginning of the crisis.

Third, dynamic models can become too sensitive if the updating method gives too much weight to recent observations. This may produce unstable risk estimates.

Fourth, conditional normal models may still underestimate tail risk if the standardized innovations are heavy-tailed. A dynamic volatility model can capture changing volatility, but it does not automatically solve the problem of heavy-tailed shocks.

Fifth, dynamic risk measures require regular back-testing and validation. A model that produces elegant-looking forecasts may still perform poorly when compared with realized losses.

For these reasons, dynamic risk management should be combined with EVT, stress testing, scenario analysis, and back-testing.

13 Chapter R Application

This application uses a simulated return series with changing volatility. We estimate rolling volatility, EWMA volatility, rolling historical VaR, dynamic normal VaR, and dynamic normal Expected Shortfall.

set.seed(2027)

n <- 2000
volatility <- c(rep(0.007, 600), rep(0.030, 500), rep(0.012, 900))
returns <- rnorm(n, mean = 0, sd = volatility)
losses <- -returns
portfolio_value <- 75000000

chapter_data <- tibble(
  Time = 1:n,
  Return = returns,
  Loss = losses
) %>%
  mutate(
    Rolling_Volatility = rollapply(Return, width = 100, FUN = sd, fill = NA, align = "right"),
    EWMA_Volatility = ewma_volatility(Return, lambda = 0.94),
    Rolling_VaR_99 = rolling_var(Loss, width = 100, q = 0.99),
    Dynamic_VaR_99 = portfolio_value * qnorm(0.99) * EWMA_Volatility,
    Dynamic_ES_99 = portfolio_value * EWMA_Volatility * dnorm(qnorm(0.99)) / 0.01
  )

chapter_summary <- chapter_data %>%
  summarise(
    Static_Return_SD = sd(Return),
    Latest_EWMA_Volatility = last(EWMA_Volatility),
    Latest_Dynamic_VaR_99 = last(Dynamic_VaR_99),
    Latest_Dynamic_ES_99 = last(Dynamic_ES_99)
  )

chapter_summary
chapter_plot_data <- chapter_data %>%
  mutate(
    Dynamic_VaR_Millions = Dynamic_VaR_99 / 1000000,
    Dynamic_ES_Millions = Dynamic_ES_99 / 1000000
  )

ggplot(chapter_plot_data, aes(x = Time)) +
  geom_line(aes(y = Dynamic_VaR_Millions)) +
  geom_line(aes(y = Dynamic_ES_Millions), linetype = "dashed") +
  scale_y_continuous(labels = label_number()) +
  labs(
    title = "Dynamic 99% VaR and Expected Shortfall",
    x = "Time",
    y = "Loss (KSh millions)"
  )

The chapter application shows how risk estimates rise during turbulent periods and fall during calmer periods. This is the key advantage of dynamic risk management.

14 Common Mistakes

Students often confuse dynamic risk measurement with simply recalculating one static number. A dynamic model produces a time series of risk estimates that changes as information changes.

Another common mistake is to ignore volatility clustering. If volatility changes over time, a constant-volatility model may underestimate risk during turbulent periods and overestimate risk during calm periods.

Students also sometimes apply square-root-of-time scaling without checking assumptions. This rule is convenient, but it relies on independence and constant volatility.

Another mistake is to assume that dynamic volatility modelling automatically solves tail risk. It does not. If shocks are heavy-tailed, conditional normal VaR may still underestimate extreme losses.

Students may also use very short rolling windows without realizing that the estimates can become noisy, or very long rolling windows without realizing that the estimates may respond too slowly.

Finally, students sometimes forget that dynamic risk models must be back-tested. A model should be judged by how well its forecasts compare with realized losses.

15 Exercises

15.1 Conceptual Questions

  1. Define dynamic risk management.
  2. Distinguish between static and dynamic risk measurement.
  3. Explain why volatility clustering matters for market risk.
  4. What is conditional volatility?
  5. Why is conditional volatility important for VaR estimation?
  6. Explain the idea of rolling volatility.
  7. What is the advantage of using a rolling window?
  8. What is one disadvantage of using a rolling window?
  9. Explain the EWMA volatility recursion.
  10. What is the role of the decay factor \(\lambda\) in EWMA?
  11. Explain why dynamic VaR changes over time.
  12. Explain why Expected Shortfall is usually larger than VaR.
  13. Why might static VaR underestimate risk during a crisis?
  14. Why might dynamic VaR fall during calm market periods?
  15. Explain the difference between one-day, five-day, and ten-day risk horizons.
  16. What assumptions are needed for square-root-of-time scaling?
  17. Why can square-root-of-time scaling fail?
  18. Why should dynamic risk models be back-tested?
  19. Explain how dynamic risk management complements EVT.
  20. Explain how dynamic risk management complements stress testing.

15.2 Computational Questions

  1. Simulate 1,500 daily returns with two volatility regimes. Plot the returns over time.
  2. Compute a 100-day rolling volatility estimate and plot it.
  3. Compute EWMA volatility using \(\lambda=0.94\) and plot it.
  4. Compare rolling volatility and EWMA volatility.
  5. Compute rolling 95% and 99% historical VaR using a 100-day window.
  6. For a portfolio worth KSh 100 million, compute dynamic 99% VaR using EWMA volatility and conditional normality.
  7. Compute dynamic 99% Expected Shortfall using EWMA volatility and conditional normality.
  8. Compare static 99% VaR with dynamic 99% VaR.
  9. Compute approximate one-day, five-day, and ten-day VaR using square-root-of-time scaling.
  10. Discuss whether the square-root rule is reasonable for your simulated data.

15.3 Exam-Style Question

A financial institution calculates a single 99% VaR estimate using five years of historical daily returns. During a period of market turbulence, management notices that daily losses have become much larger than usual. The risk manager proposes replacing the static VaR estimate with a dynamic VaR model based on conditional volatility.

Required:

  1. Explain the difference between static and dynamic risk measurement.
  2. Explain why volatility clustering creates problems for static VaR estimates.
  3. Define rolling volatility and explain how it is calculated.
  4. Explain the EWMA volatility model and interpret the decay factor \(\lambda\).
  5. Derive the conditional normal one-day VaR formula using conditional volatility.
  6. State the conditional normal Expected Shortfall formula.
  7. Explain why dynamic VaR may increase during periods of market stress.
  8. Explain the meaning of one-day, five-day, and ten-day risk horizons.
  9. State two assumptions behind square-root-of-time scaling.
  10. Explain two limitations of dynamic risk models.