Risk Measures
Purpose
Section titled “Purpose”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.
1 Motivation
Section titled “1 Motivation”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 for a right-skewed Gamma law with , and marked and the worst tail shaded. The convex-combination measure interpolates between the risk-neutral mean and the tail. All three markers are derived numerically from the PDF.
2 Conditional Value-at-Risk (CVaR)
Section titled “2 Conditional Value-at-Risk (CVaR)”For a random variable representing cost and tail fraction :
where captures the excess cost above threshold .
Interpretation: CVaR is the expected cost in the worst -fraction of scenarios.
| Risk Posture | Meaning | |
|---|---|---|
| 1.0 | Risk-neutral | CVaR = (expected value) |
| 0.5 | Moderately risk-averse | Average of worst 50% of outcomes |
| 0.2 | Risk-averse | Average of worst 20% of outcomes |
| 0.05 | Highly risk-averse | Average of worst 5% of outcomes |
3 Convex Combination Risk Measure
Section titled “3 Convex Combination Risk Measure”Novomodelo uses a convex combination of expectation and CVaR, the structure of SDDP.jl’s EAVaR measure (Dowson & Kapelevich, 2021), with weighting the CVaR term:
where:
- : Risk aversion weight (0 = risk-neutral, 1 = pure CVaR)
- : 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:
where:
- is a convex subset of the probability simplex
- is a convex penalty function (the minimal penalty)
Interpretation: The dual computes the expectation with respect to the worst probability vector within the set , less a penalty term .
4.1 CVaR Dual Representation
Section titled “4.1 CVaR Dual Representation”For CVaR, the dual representation is:
where the risk set is:
The penalty for CVaR (no penalty term).
Interpretation: CVaR puts more probability weight on the worst outcomes, with each scenario receiving at most probability mass. For small , only the worst scenarios receive significant weight.
4.2 EAVaR Dual Representation
Section titled “4.2 EAVaR Dual Representation”For the convex combination :
Equivalently, is the set of with : the expectation contributes the fixed share , and the CVaR term the share .
5 Risk-Averse Subgradient Theorem
Section titled “5 Risk-Averse Subgradient Theorem”The key theorem for computing risk-averse cuts:
Application to Cut Generation: In SDDP, the subgradients are the cut coefficients obtained from LP duals (see Cut Management §2). The risk-averse cut coefficients are computed by replacing the nominal probabilities with the risk-adjusted probabilities :
where is the optimal dual probability vector computed from the scenario costs .
6 Risk-Averse Bellman Equation
Section titled “6 Risk-Averse Bellman Equation”The risk-averse value function with discount factor satisfies, for :
The measure of stage aggregates the openings of stage . The cuts that approximate are stored at stage , 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 has no later openings to aggregate, so it enters no value function. The first stage’s measure also aggregates the first stage’s own openings : the equation holds at with as the aggregating measure, and is the nested value that the lower bound of §9 bounds from below.
This modifies the standard Bellman recursion in two ways:
- Risk measure replaces expectation: replaces
- Discount factor on future cost: discounts the cost-to-go (see Discount Rate Formulation §2)
In the LP subproblem at stage , the future cost variable appears in the objective as (see Discount Rate Formulation §4). Cuts bound (not ), so the discount factor multiplies only in the objective — exactly as in the risk-neutral case.
7 Cut Generation with Risk Measures
Section titled “7 Cut Generation with Risk Measures”For each visited state , compute the risk-averse cut as follows:
Step 1: Solve subproblems for all realizations :
Extract dual solutions and compute per-scenario cut coefficients:
- Intercept:
- Coefficients: — derived from LP duals (see Cut Management §2)
Step 2: Compute risk-adjusted scenario weights with the measure of stage , the stage that owns the cut (§6), .
Each scenario has a probability upper bound:
Since when and , the total capacity , so not every opening reaches its cap. The weights are built from the tail weights , the weights: the probability vector in (§4.1) that maximizes the expected opening cost, found greedily:
- Sort the openings by cost in descending order
- Walk down the sorted list, giving each opening
- When the cumulative mass reaches 1, the current opening receives the remainder, and every cheaper opening gets
The risk-adjusted weights mix the tail weights with the nominal probabilities:
is the cap of : attains it, , on every opening that fills fully.
Four equiprobable openings with costs 10, 20, 30 and 40 at : every opening keeps the floor in its risk-adjusted weight , the two costliest openings reach the cap , and the weights value the openings at .
Step 3: Compute risk-averse cut coefficients using (justified by the theorem in §5):
Step 4: Add cut to stage :
8 Upper Bound with Risk Measures
Section titled “8 Upper Bound with Risk Measures”Monte Carlo simulation cannot directly estimate the upper bound for CVaR problems because:
- CVaR is computed over the entire distribution, not sample averages
- The optimal (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 and tail fraction ) 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.
9 Lower Bound Validity with Risk Measures
Section titled “9 Lower Bound Validity with Risk Measures”Under a coherent stage measure, which is monotone and convex, such as of §3, every aggregated cut lies below the nested risk-adjusted cost-to-go of §6. By the theorem of §5, the cut of §7 is a supporting hyperplane, at its trial point, of the measure of stage applied to the opening costs of stage , 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 at every incoming state. The training lower bound , 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 , 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 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 that value is at least the expected cost, so the sampled mean can fall below 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).
Recommendations
Section titled “Recommendations”| Purpose | Method |
|---|---|
| Convergence monitoring | Bound stalling on , a lower bound valid under the Tier 1 hypotheses — see Stopping Rules |
| Certified optimality | The gap rule against the exact nested bound of an enumerated forward pass under a uniform measure — see Upper Bound Evaluation |
| Policy evaluation | Simulation reports the cost distribution of the policy; it bounds no risk-adjusted value |
10 References
Section titled “10 References”Implementation in Novomodelo
Section titled “Implementation in Novomodelo”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, , 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.
stages[].risk_measure — Risk Measure
Section titled “stages[].risk_measure — Risk Measure”| Value | Meaning |
|---|---|
"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.
| Field | Type | Range | Description |
|---|---|---|---|
alpha | number | (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. |
lambda | number | [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.
Example
Section titled “Example”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" } ]}Effective measure and stage mapping
Section titled “Effective measure and stage mapping”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.
Non-normative software behavior for risk measures — what Novomodelo computes, beyond the equations above. This tab states the weighting Novomodelo applies and references the methodology body (§7) for the weights it derives rather than restating them.
Applied CVaR weights
Section titled “Applied CVaR weights”Novomodelo applies the weights of Risk Measures §7 to the cuts of every backward pass, to the first stage’s openings in the training lower bound, and to every node of the exact nested upper bound of an enumerated forward pass.
Cross-References
Section titled “Cross-References”- 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 with (§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 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