Week 06 — Phase 2: QT Specialization

Portfolio
Construction

QT Pillars 1, 2, 3 — Risk · Limits · Fit

Given N approved strategies, decide how much capital each one gets — without over-trusting any single Sharpe estimate.

What this week covers

Five analysts each defended an Investment Proposal this semester. Each backtest passed. Each Sharpe is positive. Now QT has to deploy a single dollar of fund capital across all five.

By Friday you should be able to:

Construction, sizing, limits. The reading is Palomar Chapters 6, 7, and 10 (skim 8 and 9); Thorp (2006) on the Kelly criterion.

The portfolio construction problem

Let \( N \) be the number of approved strategies. Each strategy \( i \) has a return time-series \( r_i(t) \) with sample mean \( \hat{\mu}_i \) and variance \( \hat{\sigma}_i^2 \). Across strategies, the sample covariance is \( \hat{\boldsymbol{\Sigma}} \). A portfolio is a weight vector \( \mathbf{w} \). The portfolio return is:

\[ R_p(t) = \mathbf{w}^\top \mathbf{r}(t), \qquad \mathbf{1}^\top \mathbf{w} = 1 \]

Every construction method below is a different choice of objective and constraints over this same \( \mathbf{w} \).

Three constraints AlgoGators always enforces:

Constraint Math Why
Capital budget \( \mathbf{1}^\top \mathbf{w} = 1 \) Deploy exactly the capital the fund has.
Per-strategy cap \( w_i \leq 0.35 \) No single analyst's strategy can dominate the fund.
Turnover cap \( \|\mathbf{w}_t - \mathbf{w}_{t-1}\|_1 \leq 0.25 \) Rebalancing costs eat alpha. Cap weight movement per period.

Three measures Sharpe doesn't catch

You already know Sharpe from W1 — \( (\mathbb{E}[R_p] - r_f)/\sigma_p \), symmetric, treats a 5% gain and a 5% loss as equivalent "vol". For a student fund with a drawdown mandate, that symmetry is the problem. Three measures fix it.

Sortino Ratio

\[ \mathrm{SortR} = \frac{\mathbb{E}[R_p] - r_f}{\sigma_p^{-}} \]

Same numerator as Sharpe, but \( \sigma_p^{-} \) is the std-dev of only the negative returns. Reward per unit of downside.

Conditional VaR

\[ \mathrm{CVaR}_\alpha = \mathbb{E}[L \mid L \geq \mathrm{VaR}_\alpha] \]

Expected loss given you're in the worst \( \alpha \) of outcomes (usually \( \alpha = 5\% \)). The number the GP actually asks about in a bad month.

Max Drawdown

Peak-to-trough loss on the NAV curve. A strategy with 1.5 Sharpe and 40% max drawdown ends student funds.

Calmar ratio = annual return / MDD. Track it explicitly.

Three practical construction methods

Start here. These three cover most of what real CTAs deploy.

1/N (Equal Weight)

\[ w_i = \frac{1}{N} \]

The no-information prior. Hard to beat out-of-sample (DeMiguel, Garlappi & Uppal, 2009) because it ignores estimation noise entirely.

When it fails: when strategy vols differ wildly. A 6%-vol calendar spread and an 18%-vol satellite strategy each at 20% gives the satellite roughly 3× the actual risk contribution.

Inverse Volatility

\[ w_i = \frac{1/\hat{\sigma}_i}{\sum_j 1/\hat{\sigma}_j} \]

Each strategy contributes the same standalone volatility. Ignores correlation — that's its blind spot.

When it fails: two strategies with correlation 0.8 still get separate vol budgets. You end up double-loaded on the same factor.

Risk Parity

Every strategy contributes the same dollar of risk to the portfolio:

\[ w_i \cdot (\boldsymbol{\Sigma} \mathbf{w})_i = w_j \cdot (\boldsymbol{\Sigma} \mathbf{w})_j \quad \forall\, i, j \]

Uses \( \boldsymbol{\Sigma} \) but not \( \boldsymbol{\mu} \). That's the point — it avoids the noisiest input. This is what Bridgewater All Weather, AQR Risk Parity, and most large CTAs run as their default.

When it fails: in crisis regimes when correlations spike to 1. The covariance estimate from a calm regime doesn't predict the panic regime.

Markowitz — and why it disappoints

Markowitz's 1952 framework formalized the trade-off between expected return and variance:

\[ \max_{\mathbf{w}} \; \boldsymbol{\mu}^\top \mathbf{w} - \tfrac{\lambda}{2}\, \mathbf{w}^\top \boldsymbol{\Sigma} \mathbf{w} \quad \text{s.t.} \quad \mathbf{1}^\top \mathbf{w} = 1 \]

On paper this is the right answer. In practice it almost always disappoints live. The reason has a name: error maximizer (Michaud, 1989).

W1 showed the intuition: backtest Sharpe is biased upward. Here's the statistical version. The Sharpe estimate on \( T \) daily observations has standard error \( \sqrt{(1 + \hat{S}^2/2)/T} \). For \( T = 252 \) and \( \hat{S} = 1.5 \), \( \mathrm{SE} \approx 0.08 \). The optimizer treats 1.5 and 1.3 as distinguishable. They're not. Tiny differences in \( \hat{\boldsymbol{\mu}} \) flip the "optimal" allocation from balanced to all-in on one strategy. Out-of-sample, you've concentrated on noise.

Practical fixes:

Tail-aware construction: CVaR & drawdown

Variance is symmetric. Returns aren't — W5's fat-tail residuals are exactly why variance underweights tail risk. The AlgoGators IPS caps drawdown explicitly. Use a construction method that bakes the constraint into the math.

CVaR Portfolio

Minimize expected loss in the worst \( \alpha \) of outcomes. Rockafellar & Uryasev (2000) showed this is convex — solvable as a linear program when returns are sample-based. Fast, stable, asymmetric-by-design.

Drawdown-Constrained

\[ \max_{\mathbf{w}} \; \boldsymbol{\mu}^\top \mathbf{w} \;\;\text{s.t.}\;\; \mathrm{MDD}(\mathbf{w}) \leq D \]

Maximize return subject to a cap on max drawdown — the constraint is the mandate. Non-convex in general but tractable as a stochastic program.

Sizing the book: volatility targeting and Kelly

Every method above gives relative weights \( \mathbf{w} \) — how to split risk across strategies. None sets the book's overall risk level: a 100% risk-parity portfolio can run at 5% or 25% annualized vol depending on the capital and leverage behind it. Two questions are left — what level, and how to hold it.

Volatility targeting — holding the level

Scale gross exposure each period so realized portfolio vol tracks a target \( \sigma^{\text{target}} \):

\[ k_t = \frac{\sigma^{\text{target}}}{\hat{\sigma}_{p,t}}, \qquad \text{position}_t = k_t \, \mathbf{w}\,(\text{capital}) \]

\( \hat{\sigma}_{p,t} \) is a trailing vol estimate (an EWMA over ~20–60 days). Below target you lever up; when a vol spike hits — the crisis regimes of W8 — the same formula scales the book down automatically, before a human decides to. The two axes don't conflict: inverse-vol and risk parity size across strategies at a point in time; vol targeting sizes the whole book through time. You do both.

Kelly — choosing the level

What should \( \sigma^{\text{target}} \) actually be? The Kelly criterion answers the question the mandate keeps asking — how large a bet does the edge warrant? For a Gaussian return stream, the growth-optimal fraction and the vol target it implies are:

\[ f^{*} = \frac{\mu}{\sigma^{2}} \qquad\Longleftrightarrow\qquad \sigma^{\text{target}}_{\text{Kelly}} = \mathrm{Sharpe} \]

Full Kelly targets an annualized vol equal to the strategy's Sharpe — a Sharpe-1 book at full Kelly runs ~100% vol, far too hot, because \( \mu \) is estimated with enormous error (the Markowitz error-maximizer again). So desks run fractional Kelly, \( f = c\,f^{*} \) with \( c \in [0.25, 0.5] \): half-Kelly keeps ~75% of the long-run growth at ~half the vol and a quarter of the drawdown. Fractional Kelly is just a principled way to set the target — \( \sigma^{\text{target}} = c \cdot \mathrm{Sharpe} \).

Rule of thumb

Full Kelly on an estimated edge is a ruin machine. Half-Kelly is the desk default — most of the compounding at a fraction of the drawdown. When in doubt, size lower; you can't compound back from zero.

Position limits and leverage

Sizing is the model's answer. Limits are the hard caps bolted on top of it — independent of any estimate, because every \( \hat{\mu} \), \( \hat{\sigma} \), and correlation can be wrong at exactly the moment it matters (W8). They bound the damage when vol targeting under-reads a regime break or Kelly over-bets a decayed edge.

LimitTypical capGuards against
Per-strategy weight≤ 35%one analyst's model dominating the fund
Sector / asset-classgross ≤ 40%a concentrated factor bet hiding across strategies
Gross exposure≤ 2× capitalvol targeting quietly levering the book up in calm markets
Net exposure|net| ≤ 20%an unintended directional tilt
Margin-to-equity≤ 25%futures leverage / margin-call risk
Daily loss limithalt at −5%a tail day or an outright model failure

The per-strategy 35% and turnover caps from the construction problem earlier are two of these; the rest bound leverage and concentration at the book level. On a futures book margin-to-equity is the leverage number that matters — vol targeting can push gross exposure well past 100% when realized vol is low, and the margin cap is the backstop that stops it.

Where limits sit

Limits are not the optimizer's objective — they are the constraint set it runs inside. When the sizing model and a limit disagree, the limit wins: each one is a line the fund won't cross no matter how good the backtest looks.

Backtest the construction itself

The weights themselves can overfit. If you optimize \( \mathbf{w} \) on the full sample and then report in-sample performance, you've data-mined the allocation. The fix is walk-forward construction:

  1. Pick a lookback window (e.g., 12 months).
  2. At each rebalance date \( t \), estimate \( \hat{\boldsymbol{\mu}}_t \) and \( \hat{\boldsymbol{\Sigma}}_t \) from data only in \( [t - 12\mathrm{m},\, t] \).
  3. Solve for \( \mathbf{w}_t \). Hold until the next rebalance. The realized return is out-of-sample.

Two traps to avoid: look-ahead bias (using \( t+k \) data to choose \( \mathbf{w}_t \)) and turnover cost (high rebalance frequency turns a 1.5 backtest Sharpe into a 0.4 live Sharpe).

Full backtesting (Palomar Ch 8) gets its own QT week later. For now: every weight vector you produce is walk-forward, period.

Worked example: five AlgoGators strategies

Five hypothetical approved strategies. Backtest statistics over the prior 24 months:

Strategy Description Sharpe Vol Max DD
ATrend-following, commodities0.8614%22%
BCalendar spread, energy0.836%8%
CCross-asset momentum (corr 0.65 with A)0.899%14%
DMacro mean-reversion, rates0.6411%18%
ESatellite-data corn yield (the W1 NasaPowerCouncil example; uncorrelated with A–D)0.7818%25%

Four construction methods on the same five strategies produce dramatically different weights:

Reading the chart

Example solution

Given the five strategies above, one defensible answer: deploy with Risk Parity, capped at 35% per strategy, re-derived monthly using a 12-month rolling window with a 25% turnover cap per rebalance. After 6+ months of live (non-backtest) data, evaluate switching to drawdown-constrained CVaR.

Why this fits the problem: Risk parity handles the A/C correlation cluster better than inverse vol (which double-counts that exposure), ignores the noisy \( \hat{\boldsymbol{\mu}} \) that drives Markowitz to put 50% in C, and still gives E meaningful weight for the diversification it offers despite its 25% standalone drawdown. The per-strategy cap prevents any allocation from running away if estimation noise tilts the weights from one rebalance to the next.

Common mistakes

Four ways portfolio construction goes wrong

  • Optimizing portfolio weights on backtest Sharpe. W1 warned about overfit single-strategy Sharpe; the same problem now hits cross-strategy weights. Sample Sharpe with 6–12 months of data has SE 0.2–0.4. Markowitz treats those estimates as known; out-of-sample, the optimizer's "best" pick reverts.
  • Ignoring transaction costs. Monthly Markowitz can have turnover above 60%. At 5 bps per side that's 60 bps annual cost — a 0.6 Sharpe haircut on a 10% vol portfolio.
  • Letting correlation regimes drift. Correlations estimated in calm markets understate crisis correlations. Risk parity assuming \( \rho = 0.2 \) blows up when \( \rho \to 0.8 \) in a sell-off.
  • Treating drawdown as a metric, not a constraint. "We had a 30% drawdown but recovered" is a story the GP doesn't want to hear. Bake the mandate into the optimization.
← QT Hub Week 7: Factor Modeling →