Lesson 0010

Duals Decay as Caps Relax

A cap dual is not a permanent price. It shrinks as the blocked portfolio weight gets closer to where the optimizer wanted to go anyway.

The One-Step Skill

In Lesson 0009, the A cap at 70% had upper dual 0.09. That dual predicted the value of a small cap relaxation.

cap_A = 0.70
upper dual_A = 0.09

increase cap_A by 0.01:
  predicted objective change = -0.09 * 0.01
                              = -0.0009

The new skill is predicting what happens to the dual itself as the cap moves from 70% toward the unconstrained target at 100%.

The Same Objective

Using the two-asset portfolio from Lesson 0007 and writing w_B = 1 - w_A, the objective is:

f(w_A) = 0.15 w_A^2 - 0.30 w_A + 0.08
f'(w_A) = 0.30 w_A - 0.30

The unconstrained minimum is where f'(w_A) = 0, so:

0.30 w_A - 0.30 = 0
w_A = 1.00

Until the cap reaches 1.00, the cap is still blocking the optimizer. But each relaxation blocks less.

The Dual Decay Table

For this minimization problem, the upper-cap dual is the blocked downward slope: lambda = -f'(cap) while the cap binds.

lambda = -(0.30 cap_A - 0.30)
       = 0.30(1 - cap_A)

70% cap

lambda = 0.09. The model is still far from its unconstrained target.

80% cap

lambda = 0.06. The cap binds, but less scarcity remains.

90% cap

lambda = 0.03. The cap binds, with weaker pressure.

100% cap

lambda = 0.00. The cap no longer blocks the unconstrained optimum.

Read the Geometry

Think of the cap as a vertical wall sliding right along a convex curve. At 70%, the curve is still sloping down steeply as you move right, so relaxing the wall is valuable. Near 100%, the curve is almost flat, so relaxing the wall has little value.

cap moves right:       0.70 -> 0.80 -> 0.90 -> 1.00
blocked slope shrinks: 0.09 -> 0.06 -> 0.03 -> 0.00
active status:         binds -> binds -> binds -> loose
Memory hook: a dual is scarcity. As the cap stops being scarce, the dual decays toward zero.

Where Old Sensitivity Fails

The 0.09 dual at 70% is a local slope, not a price tag for every future cap level. It works best for small changes near 70%.

small move:
  cap_A 0.70 -> 0.71
  old dual is useful

large move:
  cap_A 0.70 -> 1.00
  old dual overstates the total gain

active-set change:
  cap_A reaches 1.00
  cap stops binding and dual becomes 0

This is the active-set warning from Lesson 0009 made concrete: when the set of binding constraints changes, the old dual no longer describes the new local problem.

Retrieval Practice

If cap_A moves from 0.70 to 0.80, what happens to the upper dual?

At cap_A = 1.00, what is the active-set status of the A cap?

Should the 0.09 dual at 70% be trusted for a move all the way to 100%?

Portfolio Reading

In real portfolio reports, a large dual on a cap means the model is pressing hard against that limit now. It does not mean the same cap will stay valuable after a large policy change. Relaxing a sector, asset, turnover, or risk limit can change the optimum enough that a new set of constraints becomes binding.

Primary Source

For the formal version, use chapter 5 of Boyd and Vandenberghe's Convex Optimization on dual variables and sensitivity. For solver practice, use CVXPY's dual variables guide. Keep the active-set sensitivity reference open while reviewing.