Static optimization picks weights once. Dynamic portfolio choice adjusts allocations over time as wealth, market conditions, and the investment horizon change. The Bellman equation turns a T-period problem into T one-period problems, each informed by the future.
Multi-period optimization
A myopic (single-period) investor maximizes E[U(W1)]. A dynamic investor maximizes E[U(WT)] by choosing a sequence of allocations w0, w1, ..., wT-1. With CRRA utility and i.i.d. returns, the myopic solution happens to be optimal. But when returns are predictable or the horizon matters (as with labor income), the dynamic solution differs.
Drift pushes the portfolio away from target weights. Calendar rebalancing resets weights on a fixed schedule (monthly, quarterly). Threshold rebalancing triggers only when a weight deviates beyond a band (e.g., +/-5%). Threshold rebalancing trades less often but captures larger mispricings. Transaction costs determine which rule dominates.
The Bellman equation decomposes a T-period problem into nested one-period problems: V(W,t) = maxw E[V(W', t+1)]. Solve backwards from the terminal condition V(W,T) = U(W). At each step, the optimal weight depends on current wealth and time remaining. This is the fundamental tool of dynamic optimization.
Merton (1969) solved the portfolio problem in continuous time. With CRRA utility and a single risky asset following geometric Brownian motion, the optimal stock allocation is w* = (μ − r) / (γ σ²). The result is constant over time and independent of wealth—a striking simplicity. It says: the more risk-averse you are (higher γ), or the more volatile the asset (higher σ), the less you hold.
Young investors have more human capital (future labor income), which acts like a bond. So they should hold more stocks. As retirement approaches, the bond-like human capital shrinks, and the portfolio should shift toward bonds. This is the theoretical basis for target-date funds. The glide path is not arbitrary—it follows from the Bellman equation with labor income as a state variable.
Scheme
; Lifecycle glide path: stock allocation vs. years to retirement; Human capital decays, so stock allocation decreases
(define (glide-path years-to-retire total-wealth annual-income discount-rate)
; PV of human capital ~ income * annuity factor
(let* ((hc (if (= years-to-retire 0) 0
(* annual-income
(/ (- 1 (expt (+ 1 discount-rate) (- years-to-retire)))
discount-rate))))
(total (+ total-wealth hc))
; Target: 60% of total wealth in stocks; But stocks come only from financial wealth
(stock-target (* 0.60 total))
(stock-weight (min 1.0 (/ stock-target total-wealth))))
stock-weight))
(define income 75000)
(define rate 0.03)
(display "=== Lifecycle Glide Path ===") (newline)
(display "Years Financial Human Cap Stock%") (newline)
(for-each
(lambda (pair)
(let* ((yrs (car pair))
(fin-wealth (cadr pair))
(w (glide-path yrs fin-wealth income rate)))
(display " ") (display yrs)
(display " $") (display fin-wealth)
(display " ") (display (* (round (* w 1000)) 0.1))
(display "%") (newline)))
'((3050000) (20200000) (10500000) (5800000) (01000000)))
Python
# Lifecycle glide pathdef glide_path(years, fin_wealth, income, r):
if years == 0:
hc = 0else:
hc = income * (1 - (1 + r)**(-years)) / r
total = fin_wealth + hc
stock_target = 0.60 * total
returnmin(1.0, stock_target / fin_wealth)
income, rate = 75_000, 0.03print("=== Lifecycle Glide Path ===")
print(f"{'Years':>5} {'Financial':>10} {'Human Cap':>10} {'Stock%':>6}")
for yrs, fw in [(30, 50000), (20, 200000), (10, 500000), (5, 800000), (0, 1000000)]:
w = glide_path(yrs, fw, income, rate)
hc = income * (1 - (1+rate)**(-yrs)) / rate if yrs > 0else0print(f"{yrs:>5} ${fw:>9,} ${hc:>9,.0f} {w*100:>5.1f}%")
Neighbors
๐ Finance II Ch.11 — VaR constraints shape the feasible set for dynamic optimization
๐ Finance II Ch.4 — mean-variance optimization is the single-period special case