Skip to content

Risk Measures

This chapter defines the risk-averse SDDP formulation used in Novomodelo, based on Conditional Value-at-Risk (CVaR). It covers the CVaR definition, the convex combination risk measure, dual representations, the risk-averse subgradient theorem, modified Bellman equation with discount factor, risk-averse cut generation, and when the bounds are valid under a risk measure.

For notation conventions (index sets, parameters, decision variables, dual variables), see Notation Conventions.

Risk-neutral SDDP minimizes expected cost, which can lead to policies that perform poorly in adverse scenarios. Risk-averse SDDP incorporates a coherent risk measure (typically CVaR) to protect against tail risks while maintaining the convexity properties required for valid cut generation.

Cost distribution f(Z)f(Z) for a right-skewed Gamma law with E[Z]\mathbb{E}[Z], VaRα\mathrm{VaR}_\alpha and CVaRα\mathrm{CVaR}_\alpha marked and the worst α\alpha tail shaded. The convex-combination measure ρλ,α[Z]=(1−λ) E[Z]+λ CVaRα[Z]\rho^{\lambda,\alpha}[Z] = (1-\lambda)\,\mathbb{E}[Z] + \lambda\,\mathrm{CVaR}_\alpha[Z] interpolates between the risk-neutral mean and the tail. All three markers are derived numerically from the PDF.

For a random variable ZZ representing cost and tail fraction α∈(0,1]\alpha \in (0, 1]:

CVaRα(Z)=min⁡η∈R{η+1αE[(Z−η)+]}\text{CVaR}_\alpha(Z) = \min_{\eta \in \mathbb{R}} \left\{ \eta + \frac{1}{\alpha} \mathbb{E}\left[(Z - \eta)^+\right] \right\}

where (Z−η)+=max⁡(0,Z−η)(Z - \eta)^+ = \max(0, Z - \eta) captures the excess cost above threshold η\eta.

Interpretation: CVaRα_\alpha is the expected cost in the worst α\alpha-fraction of scenarios.

α\alphaRisk PostureMeaning
1.0Risk-neutralCVaR1_1 = E[Z]\mathbb{E}[Z] (expected value)
0.5Moderately risk-averseAverage of worst 50% of outcomes
0.2Risk-averseAverage of worst 20% of outcomes
0.05Highly risk-averseAverage of worst 5% of outcomes

Novomodelo uses a convex combination of expectation and CVaR, the structure of SDDP.jl’s EAVaR measure (Dowson & Kapelevich, 2021), with λ\lambda weighting the CVaR term:

ρλ,α[Z]=(1−λ)E[Z]+λ⋅CVaRα[Z]\rho^{\lambda, \alpha}[Z] = (1 - \lambda) \mathbb{E}[Z] + \lambda \cdot \text{CVaR}_\alpha[Z]

where:

  • λ∈[0,1]\lambda \in [0, 1]: Risk aversion weight (0 = risk-neutral, 1 = pure CVaR)
  • α∈(0,1]\alpha \in (0, 1]: CVaR tail fraction

This is sometimes called the EAVaR (Expectation + Average Value-at-Risk) risk measure.

4 Dual Representation of Convex Risk Measures

Section titled “4 Dual Representation of Convex Risk Measures”

Convex risk measures have a dual representation that is essential for computing risk-averse cuts:

F[Z]=sup⁡μ∈M(p)Eμ[Z]−ψ(p,μ)\mathbb{F}[Z] = \sup_{\mu \in \mathcal{M}(p)} \mathbb{E}_\mu[Z] - \psi(p, \mu)

where:

  • M(p)⊆P\mathcal{M}(p) \subseteq \mathcal{P} is a convex subset of the probability simplex
  • ψ(p,μ)\psi(p, \mu) is a convex penalty function (the minimal penalty)
  • P={p≥0:∑ωpω=1}\mathcal{P} = \{p \geq 0 : \sum_{\omega} p_\omega = 1\}

Interpretation: The dual computes the expectation with respect to the worst probability vector μ\mu within the set M\mathcal{M}, less a penalty term ψ(p,μ)\psi(p, \mu).

For CVaRα_\alpha, the dual representation is:

CVaRα[Z]=sup⁡μ∈Mα(p)Eμ[Z]\text{CVaR}_\alpha[Z] = \sup_{\mu \in \mathcal{M}_\alpha(p)} \mathbb{E}_\mu[Z]

where the risk set Mα(p)\mathcal{M}_\alpha(p) is:

Mα(p)={μ≥0:∑ωμω=1,  μω≤pωα  ∀ω}\mathcal{M}_\alpha(p) = \left\{\mu \geq 0 : \sum_\omega \mu_\omega = 1, \; \mu_\omega \leq \frac{p_\omega}{\alpha} \; \forall \omega \right\}

The penalty ψ(p,μ)=0\psi(p, \mu) = 0 for CVaR (no penalty term).

Interpretation: CVaR puts more probability weight on the worst outcomes, with each scenario receiving at most pω/αp_\omega / \alpha probability mass. For small α\alpha, only the worst scenarios receive significant weight.

For the convex combination ρλ,α[Z]=(1−λ)E[Z]+λ⋅CVaRα[Z]\rho^{\lambda, \alpha}[Z] = (1-\lambda)\mathbb{E}[Z] + \lambda \cdot \text{CVaR}_\alpha[Z]:

MEAVaR(p)={μ:∑ωμω=1,  (1−λ) pω≤μω≤(1−λ) pω+λ pωα    ∀ω}\mathcal{M}^{EAVaR}(p) = \left\{\mu : \sum_\omega \mu_\omega = 1,\; (1-\lambda)\, p_\omega \leq \mu_\omega \leq (1-\lambda)\, p_\omega + \frac{\lambda\, p_\omega}{\alpha} \;\; \forall \omega \right\}

Equivalently, MEAVaR(p)\mathcal{M}^{EAVaR}(p) is the set of μ=(1−λ) p+λ q\mu = (1-\lambda)\, p + \lambda\, q with q∈Mα(p)q \in \mathcal{M}_\alpha(p): the expectation contributes the fixed share (1−λ) p(1-\lambda)\, p, and the CVaR term the share λ q\lambda\, q.

The key theorem for computing risk-averse cuts:

Application to Cut Generation: In SDDP, the subgradients β(x~,ω)\beta(\tilde{x}, \omega) are the cut coefficients βt(ω)\beta_t(\omega) obtained from LP duals (see Cut Management §2). The risk-averse cut coefficients are computed by replacing the nominal probabilities p(ω)p(\omega) with the risk-adjusted probabilities μ∗\mu^*:

βˉt−1,h=∑ω∈Ωtμω∗⋅βt,h(ω)\bar{\beta}_{t-1,h} = \sum_{\omega \in \Omega_t} \mu^*_\omega \cdot \beta_{t,h}(\omega)

where μ∗\mu^* is the optimal dual probability vector computed from the scenario costs {Qt(x^,ω)}ω∈Ωt\{Q_t(\hat{x}, \omega)\}_{\omega \in \Omega_t}.

The risk-averse value function with discount factor dd satisfies, for t=2,…,Tt = 2, \ldots, T:

Vt(xt−1)=ρλt−1,αt−1[min⁡xt,ut{ct(xt,ut)+dt→t+1⋅Vt+1(xt):(xt,ut)∈Xt(xt−1,ω)}]V_t(x_{t-1}) = \rho^{\lambda_{t-1}, \alpha_{t-1}}\left[\min_{x_t, u_t} \left\{ c_t(x_t, u_t) + d_{t \to t+1} \cdot V_{t+1}(x_t) : (x_t, u_t) \in \mathcal{X}_t(x_{t-1}, \omega) \right\}\right]

The measure ρt−1=ρλt−1,αt−1\rho_{t-1} = \rho^{\lambda_{t-1}, \alpha_{t-1}} of stage t−1t-1 aggregates the openings ω∈Ωt\omega \in \Omega_t of stage tt. The cuts that approximate VtV_t are stored at stage t−1t-1, and the measure of the stage that owns a cut aggregates the openings of the next stage into it (Cut Management §3). This indexing has two ends. The last stage’s measure ρT\rho_T has no later openings to aggregate, so it enters no value function. The first stage’s measure ρ1\rho_1 also aggregates the first stage’s own openings ω∈Ω1\omega \in \Omega_1: the equation holds at t=1t = 1 with ρλ1,α1\rho^{\lambda_1, \alpha_1} as the aggregating measure, and V1(x0)V_1(x_0) is the nested value that the lower bound of §9 bounds from below.

This modifies the standard Bellman recursion in two ways:

  1. Risk measure replaces expectation: ρλt−1,αt−1[⋅]\rho^{\lambda_{t-1}, \alpha_{t-1}}[\cdot] replaces E[⋅]\mathbb{E}[\cdot]
  2. Discount factor on future cost: dt→t+1⋅Vt+1(xt)d_{t \to t+1} \cdot V_{t+1}(x_t) discounts the cost-to-go (see Discount Rate Formulation §2)

In the LP subproblem at stage tt, the future cost variable θ\theta appears in the objective as dt→t+1⋅θd_{t \to t+1} \cdot \theta (see Discount Rate Formulation §4). Cuts bound θ\theta (not d⋅θd \cdot \theta), so the discount factor multiplies θ\theta only in the objective — exactly as in the risk-neutral case.

For each visited state x^t−1\hat{x}_{t-1}, compute the risk-averse cut as follows:

Step 1: Solve subproblems for all realizations ω∈Ωt\omega \in \Omega_t:

Qt(x^t−1,ω)=min⁡xt,ut{ct(xt,ut)+dt→t+1⋅θt:constraints}Q_t(\hat{x}_{t-1}, \omega) = \min_{x_t, u_t} \left\{ c_t(x_t, u_t) + d_{t \to t+1} \cdot \theta_t : \text{constraints} \right\}

Extract dual solutions βt(ω)\beta_t(\omega) and compute per-scenario cut coefficients:

  • Intercept: β0,t(ω)=Qt(x^t−1,ω)−βt(ω)⊤x^t−1\beta_{0,t}(\omega) = Q_t(\hat{x}_{t-1}, \omega) - \beta_t(\omega)^\top \hat{x}_{t-1}
  • Coefficients: βt(ω)\beta_t(\omega) — derived from LP duals (see Cut Management §2)

Step 2: Compute risk-adjusted scenario weights μω∗\mu^*_\omega with the measure of stage t−1t-1, the stage that owns the cut (§6), (λ,α)=(λt−1,αt−1)(\lambda, \alpha) = (\lambda_{t-1}, \alpha_{t-1}).

Each scenario ω\omega has a probability upper bound:

μˉω=(1−λ) pω+λ pωα\bar{\mu}_\omega = (1 - \lambda) \, p_\omega + \frac{\lambda \, p_\omega}{\alpha}

Since μˉω>pω\bar{\mu}_\omega > p_\omega when λ>0\lambda > 0 and α<1\alpha < 1, the total capacity ∑ωμˉω>1\sum_\omega \bar{\mu}_\omega > 1, so not every opening reaches its cap. The weights are built from the tail weights q∗q^*, the CVaRα\text{CVaR}_\alpha weights: the probability vector in Mα(p)\mathcal{M}_\alpha(p) (§4.1) that maximizes the expected opening cost, found greedily:

  1. Sort the openings by cost Qt(x^t−1,ω)Q_t(\hat{x}_{t-1}, \omega) in descending order
  2. Walk down the sorted list, giving each opening qω∗=pω/αq^*_\omega = p_\omega / \alpha
  3. When the cumulative mass reaches 1, the current opening receives the remainder, and every cheaper opening gets qω∗=0q^*_\omega = 0

The risk-adjusted weights mix the tail weights with the nominal probabilities:

μ∗=(1−λ) p+λ q∗\mu^* = (1-\lambda)\, p + \lambda\, q^*

μˉω\bar{\mu}_\omega is the cap of μ∗\mu^*: μ∗\mu^* attains it, μω∗=μˉω\mu^*_\omega = \bar{\mu}_\omega, on every opening that q∗q^* fills fully.

Four equiprobable openings with costs 10, 20, 30 and 40 at α=λ=0.5\alpha = \lambda = 0.5: every opening keeps the floor (1−λ) pω=0.125(1-\lambda)\, p_\omega = 0.125 in its risk-adjusted weight μω∗\mu^*_\omega, the two costliest openings reach the cap μˉω=0.375\bar{\mu}_\omega = 0.375, and the weights value the openings at 3030.

Step 3: Compute risk-averse cut coefficients using μ∗\mu^* (justified by the theorem in §5):

βˉ0,t−1=∑ω∈Ωtμω∗⋅β0,t(ω)\bar{\beta}_{0,t-1} = \sum_{\omega \in \Omega_t} \mu^*_\omega \cdot \beta_{0,t}(\omega) βˉt−1=∑ω∈Ωtμω∗⋅βt(ω)\bar{\beta}_{t-1} = \sum_{\omega \in \Omega_t} \mu^*_\omega \cdot \beta_t(\omega)

Step 4: Add cut to stage t−1t-1:

θt−1≥βˉ0,t−1+βˉt−1⊤xt−1\theta_{t-1} \geq \bar{\beta}_{0,t-1} + \bar{\beta}_{t-1}^\top x_{t-1}

Monte Carlo simulation cannot directly estimate the upper bound for CVaR problems because:

  1. CVaR is computed over the entire distribution, not sample averages
  2. The optimal η\eta (VaR threshold) changes with the policy

The exact deterministic upper bound and the gap stopping rule that compares it against the lower bound (Stopping Rules §5) require an enumerated forward pass together with a risk measure that is uniform across all stages — either expectation at every stage, or one CVaR measure (the same risk-aversion weight λ\lambda and tail fraction α\alpha) at every stage. Under a uniform CVaR the exact bound is not a probability-weighted average of path costs but a nested, time-consistent risk recursion over the enumerated tree, aggregated with the study’s own CVaR weighting so that it brackets the risk-averse lower bound from above (see Upper Bound Evaluation §2). Stopping Rules §5 defines a stage-varying measure and states the setup rejection of a gap rule under one.

Under a sampled forward pass Novomodelo computes no exact upper bound. Under an enumerated forward pass with a stage-varying measure it reports the exact probability-weighted path cost, which is not an upper bound on the risk-averse objective. The inner approximation in the appendix of Upper Bound Evaluation is a reserved design.

Under a coherent stage measure, which is monotone and convex, such as ρλ,α\rho^{\lambda, \alpha} of §3, every aggregated cut lies below the nested risk-adjusted cost-to-go Vt(xt−1)V_t(x_{t-1}) of §6. By the theorem of §5, the cut of §7 is a supporting hyperplane, at its trial point, of the measure of stage t−1t-1 applied to the opening costs of stage tt, which is convex in the incoming state. Those opening costs carry the current cuts in place of the next stage’s cost-to-go, and those cuts lie below it by induction from the last stage, so the monotonicity of the measure keeps the new cut below Vt(xt−1)V_t(x_{t-1}) at every incoming state. The training lower bound z‾k\underline{z}^k, the first stage’s measure of its opening objectives with these cuts in place, is therefore a valid lower bound on the nested risk-adjusted optimal value of the model as trained, whether or not the measure varies across stages, and it does not decrease in kk, since the problem it is evaluated on keeps every cut once added.

The validity rests on the Tier 1 hypotheses (Philpott, de Matos & Finardi, 2013), among them a cost-to-go convex in the incoming state, which the truncation methods of Inflow Non-Negativity Solution Methods break in the inflow-lag components; cuts that span every state component the cost-to-go depends on; a non-negative cost-to-go, since the future-cost variable is bounded below by zero; and a fixed terminal function. Tier 2 establishes the convergence of z‾k\underline{z}^k to that optimal value for an expectation measure at every stage.

What a risk-averse run lacks under a sampled forward pass is a valid upper-bound estimate. The mean of the sampled path costs estimates the policy’s expected cost, not its nested risk-adjusted value; under ρλ,α\rho^{\lambda, \alpha} that value is at least the expected cost, so the sampled mean can fall below z‾k\underline{z}^k and certifies nothing. The certificate is the exact nested bound of an enumerated tree under a measure uniform across stages (Tier 3; see Upper Bound Evaluation).

PurposeMethod
Convergence monitoringBound stalling on z‾k\underline{z}^k, a lower bound valid under the Tier 1 hypotheses — see Stopping Rules
Certified optimalityThe gap rule against the exact nested bound of an enumerated forward pass under a uniform measure — see Upper Bound Evaluation
Policy evaluationSimulation reports the cost distribution of the policy; it bounds no risk-adjusted value

The methodology above defines the risk measure, its weights and the bounds it leaves valid; the tabs below cover how Novomodelo configures the measure per stage and which weights it applies.

Novomodelo reads the risk measure of each stage from the risk_measure field of the stage’s entry in stages.json. This tab is the field-level configuration reference; the measure it selects, ρλ,α\rho^{\lambda,\alpha}, is defined in §3 Convex Combination Risk Measure; the weights Novomodelo applies to the openings are stated on the Implementation notes tab. The full file reference is stages.json.

ValueMeaning
"expectation"Risk-neutral: every opening is weighted by its probability. It is what an absent risk_measure resolves to; any other string is rejected at load.
{"cvar": {"alpha": α, "lambda": λ}}The convex combination of the expectation and the CVaR at tail fraction alpha, with weight lambda on the CVaR and 1 - lambda on the expectation.

The cvar object takes the two keys below, both required; an object missing either key is a ParseError.

FieldTypeRangeDescription
alphanumber(0, 1]The CVaR tail fraction: the worst alpha-fraction of outcomes enters the CVaR. 1 is the expectation: every opening then counts in the tail.
lambdanumber[0, 1]The weight of the CVaR term: 0 is the expectation and 1 is the pure CVaR.

Both ranges are checked at load: a value outside its range is a SchemaViolation on stages.json.

The measure may differ from stage to stage. This excerpt of stages.json lowers lambda from the first stage to the second and gives the third stage the expectation:

{
"stages": [
{
"id": 0,
"risk_measure": { "cvar": { "alpha": 0.5, "lambda": 0.5 } }
},
{
"id": 1,
"risk_measure": { "cvar": { "alpha": 0.5, "lambda": 0.25 } }
},
{
"id": 2,
"risk_measure": "expectation"
}
]
}

lambda: 0 weights every opening by its probability, as "expectation" does, whatever its alpha, and counts as "expectation" for the gap rule. The gap rule needs one effective measure at every stage (Optimality gap).

A stage’s risk_measure weights the openings of the next stage in the cuts that stage stores, and the first stage’s risk_measure also weights the first stage’s own openings in the lower bound. The last study stage’s risk_measure enters no cut, but it counts when the gap rule checks that the measure is the same at every stage.

  • Notation Conventions — Symbol definitions, dual variable notation, and sign conventions
  • SDDP Algorithm — Bellman recursion and forward/backward pass structure modified by risk measures
  • Cut Management — Dual extraction and cut coefficient computation; risk-averse aggregation replaces p(ω)p(\omega) with μω∗\mu^*_\omega (§7)
  • Stopping Rules — Bound stalling suits risk-averse convergence monitoring in general; the gap rule is available under a risk-averse measure only when that CVaR is uniform across stages and the forward pass is enumerated
  • Discount Rate Formulation — Discount factor dd convention and discounted Bellman equation
  • Horizon Modes — Interaction of risk measures with the reserved cyclic policy-graph design
  • Upper Bound Evaluation — the nested enumerated exact bound for a uniform CVaR, and the reserved inner approximation in its appendix