---
title: "Portfolio Construction I"
book: "Research Craft: Predictors, Backtests, Measurement, Portfolios"
subject: quant
language: en
chapter: 25
exercises: 8
source: https://one-course.com/books/quant/7/en/chapter/25-portfolio-construction-i
---

# Chapter 25 — Portfolio Construction I

An unconstrained mean–variance optimiser is given a hundred large stocks, an honest alpha forecast and the sample covariance of their last six months of daily returns. It builds a long–short book whose gross exposure averages sixty-one times its capital, forecasts it at 36 per cent annual volatility and an information ratio of 4.25, and rebuilds it every month for eight years. The book realises a volatility of 207 per cent and an information ratio of 0.92 before costs; it trades eighty-four times its capital a month, and after costs of ten basis points a trade its information ratio is 0.43. The same forecasts, through chapter 24’s risk model and the constraints a real book carries, realise 1.77 after costs. The optimiser did what it was told: it found the directions in which the inputs were most wrong. This chapter builds `firm.portcons`, a construction layer over Book 4’s `firm.portopt`, adds constraints one at a time, and prices each one with its shadow price.

## 25.1 Mean–variance with an alpha and a risk model

**Definition 25.1 (Mean–variance optimisation, risk-aversion parameter, efficient frontier).**

*Mean–variance optimisation* chooses the weights $w$ that maximise $\alpha^\top w - \frac{\gamma}{2} w^\top\Sigma w$ subject to constraints, for an alpha forecast $\alpha$ and a covariance forecast $\Sigma$ over the same horizon (Markowitz, 1952). The *risk-aversion parameter* $\gamma$ sets the trade between expected return and variance. The *efficient frontier* is the set of portfolios, over all $\gamma$, with the highest expected return for their risk.

**Proposition 25.2 (The unconstrained and the equality-constrained optimum).**

Without constraints the optimum is $w^* = \Sigma^{-1}\alpha/\gamma$, with ex-ante information ratio $\sqrt{\alpha^\top\Sigma^{-1}\alpha}$ whatever $\gamma$. With equality constraints $A^\top w = 0$ it is $w^* = \Sigma^{-1}(\alpha - A\lambda)/\gamma$, where $\lambda$, the shadow prices, solve $A^\top\Sigma^{-1}(\alpha - A\lambda) = 0$.

**Proof.** Setting the gradient of $\alpha^\top w - \frac\gamma2 w^\top\Sigma w - \lambda^\top A^\top w$ to zero gives $\gamma\Sigma w = \alpha - A\lambda$; the constraint fixes $\lambda$. At $w^* = \Sigma^{-1}\alpha/\gamma$, $\alpha^\top w^*/\sqrt{w^{*\top}\Sigma w^*} = \sqrt{\alpha^\top\Sigma^{-1}\alpha}$. ∎

The chapter’s book holds the hundred largest names of `firm.synthmkt`, rebuilt at 95 month-ends from year 3 to year 10 and held over the following month’s days. Its alpha is the simulation’s stock-specific expected return for the month (the persistent drift and the post-earnings drift), plus noise twice as large, standardised and scaled by chapter 15’s rule, $\alpha_i = \mathrm{IC}\,\sigma_i z_i$ with an [information coefficient](https://one-course.com/books/quant/7/en/chapter/6-anatomy-of-a-predictor#def-rs-anatomy-of-a-predictor-ic) of 0.05 and $\sigma_i$ the name’s residual volatility; the noise is new every month. The risk model is chapter 24’s at a monthly horizon; $\gamma = 12$; trades cost ten basis points of the weight traded. The alpha is the truth plus noise on purpose: the chapter studies what construction does to a given forecast, not the forecast.

## 25.2 The error maximiser

**Definition 25.3 (Error maximisation).**

*Error maximisation* is the tendency of an optimiser to load the directions in which its inputs are most in error: assets with overestimated returns, underestimated variances or understated correlations, which look like the best trades because they are the worst estimates (Michaud, 1989, who called mean–variance optimisers “estimation-error maximizers”).

The opening’s optimiser uses the forecast in return units (the same scale for every name, not divided by risk) and the sample covariance of 126 days for 100 names. With barely more days than names, the smallest eigenvalues of the sample covariance are far below the truth, and $\Sigma^{-1}$ amplifies them: the book takes enormous offsetting positions in combinations of stocks that happened to move together in the last six months. Its gross exposure averages 61, its forecast volatility 36% against 207% realised, and the two largest positions hold only 9% of the gross on average (16% at most): the errors are spread across hedged combinations rather than concentrated in a pair of names. The ex-ante information ratio of 4.25 is the optimiser’s measure of its own errors. Replacing the inputs, not constraining the output, is the first fix: alphas scaled by the risk the optimiser sees (chapter 15), and a factor risk model whose few parameters are estimated on many stocks (chapter 24). With nothing else changed but [dollar neutrality](#def-rs-portfolio-construction-i-constraints), the book’s forecast volatility becomes 13.7% against 14.0% realised, and its information ratio 1.39 after costs.

## 25.3 Realistic constraints

**Definition 25.4 (Dollar, beta and factor neutrality; name limit; liquidity constraint; 130/30 portfolio).**

A book has *dollar neutrality* when its long and short weights sum to zero, *beta neutrality* when its [market beta](https://one-course.com/books/quant/7/en/chapter/22-performance-measurement#def-rs-performance-measurement-beta) is zero, and satisfies a *factor-neutrality constraint* when its exposure to a risk-model factor is zero. A *name limit* bounds each position’s weight; a *liquidity constraint* bounds it by a fraction of the stock’s average daily traded value relative to the book’s capital. A *130/30 portfolio* is long 130% and short 30% of its capital: a long-only mandate given limited room to short.

Constraints enter in the order a desk meets them. Each is a line in `rs_portcons.build` ([Listing 25.1](#lst-rs-portfolio-construction-i-build)), and `firm.portcons` turns the set into one quadratic programme for `firm.portopt.qp`:

|  | information ratio |  |  |  | forecast / |
| --- | --- | --- | --- | --- | --- |
| cumulative setting | ex ante | realised | net | turnover | gross | TC | realised vol. |
| naive (sample covariance) | 4.25 | 0.92 | 0.43 | 84 | 61 | 0.44 | 36% / 207% |
| dollar neutral | 1.64 | 1.89 | 1.39 | 5.80 | 4.44 | 0.97 | 13.7% / 14.0% |
| + beta, industry, style neutral | 1.59 | 1.72 | 1.22 | 5.70 | 4.35 | 0.92 | 13.3% / 13.6% |
| + [name limits](#def-rs-portfolio-construction-i-constraints) of 3% | 1.41 | 1.29 | 0.83 | 2.50 | 2.21 | 0.82 | 6.4% / 6.6% |
| + gross at most 2 | 1.44 | 1.40 | 0.94 | 2.37 | 2.00 | 0.83 | 6.1% / 6.3% |
| + liquidity, 5% of daily value | 1.23 | 0.87 | 0.46 | 1.55 | 1.34 | 0.71 | 4.4% / 4.4% |
| + turnover at most 0.5 a month | 1.00 | 1.94 | 1.77 | 0.53 | 1.01 | 0.58 | 3.5% / 3.6% |

Turnover is one-way monthly, as a multiple of capital; TC is the [transfer coefficient](https://one-course.com/books/quant/7/en/chapter/15-from-signal-to-forecast#def-rs-from-signal-to-forecast-breadth) (chapter 15); the liquidity limit assumes $1 billion of capital. Each constraint lowers the ex-ante information ratio, by construction: the optimiser loses room. Realised information ratios over 7.9 years have standard errors of about 0.5, so most of the differences between neighbouring rows are noise; the robust facts are the first row, the effect of costs, and the last row. Neutrality to the risk model’s factors costs little ex ante (1.64 to 1.59) because the alpha is stock-specific; Jacobs, Levy and Starer showed that dollar and [beta neutrality](#def-rs-portfolio-construction-i-constraints) are in general suboptimal, and here they are nearly free. [Name limits](#def-rs-portfolio-construction-i-constraints) and the gross limit halve the book’s scale and its costs. The liquidity limit binds on 28 of the hundred names on average and lowers the ex-ante information ratio from 1.44 to 1.23. Jagannathan and Ma explained why constraints that are wrong on paper help in practice: they act as shrinkage on estimation error, the error maximiser’s fuel.

![Information ratios of the hundred-name book as constraints are added (each label names the constraint added to those on its left), 95 monthly rebalances. Ex-ante ratios fall with every constraint; realised ones do not follow, and the turnover limit gives the best book after costs. Data: rs_portcons.summary.](https://one-course.com/images/onecourse/chapters/quant-7/rs-portfolio-construction-i/fig-c86ec5ca0361.svg)

***Figure 25.1.** Information ratios of the hundred-name book as constraints are added (each label names the constraint added to those on its left), 95 monthly rebalances. Ex-ante ratios fall with every constraint; realised ones do not follow, and the turnover limit gives the best book after costs. Data: `rs_portcons.summary`.*

## 25.4 Turnover control

**Definition 25.5 (Turnover penalty).**

A *turnover penalty* subtracts $\kappa\,\lVert w - w_0\rVert_1$ from the objective, a linear cost on the weight traded from the current book $w_0$; a turnover limit bounds $\lVert w - w_0\rVert_1$ instead.

The turnover limit is the constraint that earns. It cuts the book’s monthly trading from 1.55 to 0.53 times capital and its costs from 1.9% to 0.6% a year; its realised information ratio rises from 0.87 to 1.94 before costs, which costs cannot explain. The reason is in the forecast: the planted drift persists for years, while the noise added to it is new every month. A book that may move only part of the way towards each month’s target averages several months’ forecasts, and averaging removes noise. The [transfer coefficient](https://one-course.com/books/quant/7/en/chapter/15-from-signal-to-forecast#def-rs-from-signal-to-forecast-breadth), the correlation between the book’s risk-adjusted weights and the forecast (Clarke, de Silva and Thorley), falls from 0.97 to 0.58, and it is right to fall: the forecast it transfers is noisier than the book. A [turnover penalty](#def-rs-portfolio-construction-i-turnover) or limit is therefore two things at once, a cost model and a smoother of forecasts; chapter 26’s multi-period rule makes the second explicit, and chapter 27 prices the first properly.

![Cumulative returns after costs, each book scaled to 10% annual volatility so that the slopes compare information ratios. Data: rs_portcons.run.](https://one-course.com/images/onecourse/chapters/quant-7/rs-portfolio-construction-i/fig-2c8239371a0f.svg)

***Figure 25.2.** Cumulative returns after costs, each book scaled to 10% annual volatility so that the slopes compare information ratios. Data: `rs_portcons.run`.*

## 25.5 Shadow prices and what each constraint costs

Every constraint has a shadow price, the rate at which the objective would improve if it were relaxed (Book 4, chapter 23). `firm.portcons` returns it, and more: the vector through which each constraint bends the optimum.

**Proposition 25.6 (Decomposing the information ratio by constraint).**

At the optimum of a constrained mean–variance problem, $\alpha - \gamma\Sigma w^* = \sum_k g_k$, where $g_k$ collects constraint $k$’s rows weighted by their multipliers. The unconstrained ex-ante $\mathrm{IR}^2 = \alpha^\top\Sigma^{-1}\alpha$ exceeds $\gamma^2 w^{*\top}\Sigma w^*$ by exactly $\sum_k \delta_k$, with $\delta_k = g_k^\top\Sigma^{-1}(2\alpha - G)$ and $G = \sum_k g_k$.

**Proof.** The first statement is the stationarity condition of the Karush–Kuhn–Tucker system restricted to the weights (split variables for absolute values contribute through the rows that link them to $w$). Then $\gamma^2 w^{*\top}\Sigma w^* = (\alpha - G)^\top\Sigma^{-1}(\alpha - G) = \alpha^\top\Sigma^{-1}\alpha - \sum_k
g_k^\top\Sigma^{-1}(2\alpha - G)$. ∎

The quantity $\gamma^2 w^\top\Sigma w$ is the squared information ratio of the alpha the constraints leave to the optimiser, and $\delta_k$ is the share of the forecast’s information that constraint $k$ takes away; the shares add up ([Listing 25.2](#lst-rs-portfolio-construction-i-decomp)). For the fully constrained book, averaged over the 95 months, the turnover limit takes 44.0% of the unconstrained $\mathrm{IR}^2$, liquidity 39.4%, the neutralities 7.0%, the [name limits](#def-rs-portfolio-construction-i-constraints) 3.1%; the gross limit and [dollar neutrality](#def-rs-portfolio-construction-i-constraints) take nothing, because once liquidity and turnover have shrunk the book its gross is 1.0 and never binds. On an average month 28 liquidity bounds bind, 2.5 [name limits](#def-rs-portfolio-construction-i-constraints), and the turnover limit always. Ex ante, turnover and liquidity cost most; realised, the turnover limit earned more than it cost ([Figure 25.3](#fig-rs-portfolio-construction-i-decomp)). That is the named result, and the reason to report both: shadow prices say what a constraint costs if the forecast is right, and a [backtest](https://one-course.com/books/quant/7/en/chapter/16-vectorised-backtests#def-rs-vectorised-backtests-backtest) after costs says whether it was.

![The shadow-price decomposition of the fully constrained book: the average share of the unconstrained squared ex-ante information ratio each constraint takes away. Data: rs_portcons.decomposition.](https://one-course.com/images/onecourse/chapters/quant-7/rs-portfolio-construction-i/fig-63e414e89d11.svg)

***Figure 25.3.** The shadow-price decomposition of the fully constrained book: the average share of the unconstrained squared ex-ante information ratio each constraint takes away. Data: `rs_portcons.decomposition`.*

## 25.6 Solving at scale

`firm.portcons` writes the problem in the factor form of the risk model, $\Sigma = XFX^\top + D$, and adds split variables only for the absolute values that the gross and turnover terms need, so a hundred names become at most five hundred variables. `firm.portopt.qp` is a dense interior-point solver, whose cost grows with the cube of the number of variables: enough for a hundred names and 95 months in under a minute, not for a firm book of three thousand names rebuilt daily, which needs the structure exploited. Introducing the [factor exposures](https://one-course.com/books/quant/7/en/chapter/24-risk-models#def-rs-risk-models-families) $y = X^\top w$ as variables makes the quadratic term $y^\top F y + w^\top D w$, diagonal plus a small dense block, and a sparse solver or an operator-splitting method (Book 4’s ADMM) then scales with the number of names rather than its cube. Warm starts from last month’s solution, and screening names whose alpha cannot pay for their cost, do the rest.

## 25.7 Tutorial: the sixty-one-times book

**Goal.** Build the hundred-name book with seven cumulative sets of constraints, 95 months, and record ex-ante and realised information ratios, turnover, [transfer coefficient](https://one-course.com/books/quant/7/en/chapter/15-from-signal-to-forecast#def-rs-from-signal-to-forecast-breadth), shadow prices and the decomposition. **End state:** the table, Figures [25.1](#fig-rs-portfolio-construction-i-ir), [25.2](#fig-rs-portfolio-construction-i-cum) and [25.3](#fig-rs-portfolio-construction-i-decomp).

1. **The problem**, one constraint set at a time. `def build (level: int , t0: int , w0=None ): """The problem with the first `level` + 1 settings, at rebalance t0. Level 0 (naive): alpha in return units (the same scale for every name) and the sample covariance of the last 126 days; from level 1 on, the alpha scaled by each name's residual volatility (chapter 15) and chapter 24's factor risk model.""" uni, alpha, vol, _, raw = forecasts()[t0] n = len (uni) if level == 0 : _, R, _, _ = market() S = MONTH * np.cov(np.nan_to_num(R[t0 - SAMPLE + 1 :t0 + 1 ][:, uni]).T) p = Problem(raw, np.eye(n), S, np.zeros(n), GAMMA, w0=np.zeros(n) if w0 is None else w0) p.equality(np.ones(n), 0.0 , " dollar neutral " ) return p X, F, spec = risk(t0, uni) p = Problem(alpha, X, F, spec, GAMMA, w0=np.zeros(n) if w0 is None else w0) p.equality(np.ones(n), 0.0 , " dollar neutral " ) level = max (level - 1 , 0 ) if level >= 1 : names = [" beta " ] + [f " industry { k} " for k in range (1 , 11 )] + [" size " , " value " , " momentum " ] p.neutral_factors(list (range (1 , X.shape[1 ])), names) if level >= 2 : p.bounds(-NAME_LIMIT, NAME_LIMIT, " name limits " ) if level >= 3 : p.gross(GROSS, " gross limit " ) if level >= 4 : p.liquidity(adv(t0, uni), PARTICIPATION, CAPITAL, " liquidity " ) if level >= 5 : p.turnover(TURNOVER, " turnover limit " ) return p` **Listing 25.1.** The chapter’s constraint sets. code/research/25-portfolio-construction-i/python/rs_portcons.py
2. **Shadow-price vectors and the decomposition.** `# each named constraint's shadow-price vector in the w block: alpha - gamma Sigma w = sum of these pull = {} tname = getattr (self , " turn_name " , " turnover " ) if self .turn_limit is not None else " turnover penalty " for k, name in enumerate (eq_names): key = {" _glink " : getattr (self , " gross_name " , " gross " ), " _tlink " : tname}.get(name, name) pull[key] = pull.get(key, 0.0 ) + sol[" y " ][k] * Am[k, :n] for k, name in enumerate (ineq): if name != " _nonneg " and Gm[k, :n].any(): pull[name] = pull.get(name, 0.0 ) + sol[" z " ][k] * Gm[k, :n] return {" w " : w, " objective " : -sol[" objective " ], " alpha " : float (self .alpha @ w), " risk " : risk, " ir " : float (self .alpha @ w) / risk if risk > 0 else 0.0 , " gross " : float (np.abs(w).sum()), " turnover " : float (np.abs(w - self .w0).sum()), " duals " : duals, " binding " : binding, " pull " : {k: np.asarray(v, float ) * np.ones(n) for k, v in pull.items()}, " status " : sol[" status " ]} def ir_decomposition (self , result: dict ) -> dict : """The unconstrained IR^2 = alpha' Sigma^-1 alpha minus the constrained one, gamma^2 w' Sigma w, split exactly by constraint: for g_k the constraint's shadow-price vector and G their sum (alpha - G = gamma Sigma w), delta_k = g_k' Sigma^-1 (2 alpha - G). Returns {'ir_free', 'ir_eff', 'delta': {name: delta_k}}.""" Si = np.linalg.inv(self .Sigma) pull = result[" pull " ] G = sum (pull.values()) if pull else np.zeros(self .n) free = float (self .alpha @ Si @ self .alpha) delta = {k: float (g @ Si @ (2 * self .alpha - G)) for k, g in pull.items()} return {" ir_free " : math.sqrt(free), " ir_eff " : math.sqrt(max (free - sum (delta.values()), 0.0 )), " delta " : delta}` **Listing 25.2.** Each constraint’s pull on the optimum, and its share of the information ratio. code/firm/portcons/firm_portcons.py
3. **Run** `rs_portcons.summary(k)` for $k = 0, \dots, 6$ , `decomposition(6)` and `fig_portcons.py` .

**What to change next.** Replace the turnover limit by a penalty and trace net information ratio against $\kappa$; make the noise persistent (the same draw each month) and see the turnover limit lose its advantage.

## 25.8 Build: the construction layer

**Purpose.** Every book the firm trades is built by one layer: the alpha, the risk model and the costs in, the constraints named, the trades and the price of each constraint out.

**Interface.** `Problem(alpha, X, F, spec, gamma, w0)`; `.equality(row, value, name)`, `.neutral_factors(cols, names)`, `.bounds(lo, hi, name)`, `.liquidity(adv, participation, capital, name)`, `.gross(limit, name)`, `.turnover(limit, name)`, `.turnover_penalty(kappa)`; `.solve()` returns weights, ex-ante information ratio, shadow prices, binding counts and pull vectors; `.ir_decomposition(result)`; `ir_ex_ante`; `trade_list(w, w0, capital, prices, names)`.

**Rules.** Alphas are scaled by the risk the optimiser sees; the covariance is a factor model, never a sample covariance of more names than it has periods; every constraint is named, and its shadow price and share are reported with the book.

**Acceptance tests.** `code/firm/portcons/tests/`: the closed form without constraints; neutralities met, and multipliers equal to the KKT ones; bounds, gross and turnover limits met and binding; the gross limit’s shadow price equal to the objective’s finite difference; a large [turnover penalty](#def-rs-portfolio-construction-i-turnover) holds the book still; liquidity bounds; pull vectors summing to $\alpha - \gamma\Sigma w$ and a decomposition that adds up; a trade list in shares.

**Stretch.** A factor-form solver for thousands of names; the eigenfactor adjustment of chapter 24’s model inside the optimiser; tax lots.

Sources and further reading

- H. Markowitz, “Portfolio selection”, *Journal of Finance* 7(1), 1952.
- R. O. Michaud, “The Markowitz optimization enigma: is ‘optimized’ optimal?”, *Financial Analysts Journal* 45(1), 1989.
- R. Jagannathan and T. Ma, “Risk reduction in large portfolios: why imposing the wrong constraints helps”, *Journal of Finance* 58(4), 2003.
- B. I. Jacobs, K. N. Levy and D. Starer, “On the optimality of long–short strategies”, *Financial Analysts Journal* 54(2), 1998.
- R. Clarke, H. de Silva and S. Thorley, “Portfolio constraints and the fundamental law of active management”, *Financial Analysts Journal* 58(5), 2002.

## 25.9 Exercises

**Exercise 25.1 ★.**

Two uncorrelated assets have alphas of 2% and 1% and volatilities of 20% and 10%; $\gamma = 5$. Give the unconstrained weights and the ex-ante information ratio.

**Solution of Exercise 25.1.**

$w_i = \alpha_i/(\gamma\sigma_i^2)$: $0.02/(5 \times 0.04) = 0.1$ and $0.01/(5 \times 0.01) = 0.2$. $\mathrm{IR} = \sqrt{0.02^2/0.04 + 0.01^2/0.01} = \sqrt{0.02} = 0.14$.

**Exercise 25.2 ★.**

The naive book trades 84 times its capital a month at ten basis points. What do its costs come to in a year?

**Solution of Exercise 25.2.**

$84 \times 12 \times 0.0010 = 1.01$: about the book’s whole capital every year, which is why its information ratio falls from 0.92 to 0.43.

**Exercise 25.3 ★.**

Give the standard errors of realised information ratios of 1.77 and 1.39 measured over 7.9 years.

**Solution of Exercise 25.3.**

$\sqrt{(1 + \mathrm{IR}^2/2)/T}$: $\sqrt{(1 + 1.77^2/2)/7.9} = 0.57$ and $\sqrt{(1 + 1.39^2/2)/7.9} = 0.50$. The two differ by less than one standard error.

**Exercise 25.4 ★★.**

Why does the sample covariance of a hundred stocks over 126 days lead to gross exposures of sixty times capital?

**Solution of Exercise 25.4.**

With 126 observations of 100 returns, the sample covariance’s smallest eigenvalues are far below the true ones (at the ratio 100/126 many are near zero). The optimum $\Sigma^{-1}\alpha/\gamma$ divides by them: combinations that were nearly riskless in the sample get huge weights, long and short, and the gross explodes. Their true risk is not small, so the realised volatility (207%) dwarfs the forecast (36%).

**Exercise 25.5 ★★.**

Explain how a turnover limit can raise the realised information ratio before costs.

**Solution of Exercise 25.5.**

The forecast is a persistent true signal plus noise that is new each month. A book allowed to move only part of the way to each month’s target holds an average of recent targets, in which the noise partly cancels and the signal does not. Before costs, it trades a little less signal for much less noise.

**Exercise 25.6 ★★.**

With $1 billion of capital and positions limited to 5% of a stock’s average daily traded value, what is the largest weight in a stock trading $10 million a day?

**Solution of Exercise 25.6.**

$0.05 \times 10\,\mathrm{m}/1\,000\,\mathrm{m} = 0.05\%$ of capital.

**Exercise 25.7 ★★★.**

*Coding.* With `rs_portcons.decomposition(6)` and `run(6)`, explain why the gross limit’s share is zero although it is in the problem.

**Solution of Exercise 25.7.**

The gross limit of 2 binds only if the book would otherwise exceed it. With the liquidity and turnover limits the gross averages 1.01, so the limit is slack every month, its multiplier is zero, and so is its pull and its share (complementary slackness).

**Exercise 25.8 ★★★.**

*Find the flaw.* “The optimiser’s ex-ante information ratio is 4.25 on a sample covariance of the last six months, so we will size the fund on it.”

**Solution of Exercise 25.8.**

The ex-ante ratio measures the optimiser’s own errors: with a six-month sample covariance of a hundred names the book’s realised volatility was 207% against 36% forecast, and its realised ratio 0.92 before costs and 0.43 after. Size on realised, cost-adjusted performance of a book built with a factor risk model and scaled alphas, with its standard error.

## 25.10 Problem: The Sixty-One-Times Book

**Problem 25.1.**

Weekend problem — constraints, priced

The chapter’s hundred-name book on `firm.synthmkt`.

**Part I — The optimiser.**

1. Write the unconstrained optimum and its ex-ante information ratio.
2. How are the alpha and the risk model built, and why is the alpha the truth plus noise?
3. What does the naive book look like: gross, forecast and realised volatility, ex-ante and realised information ratios, turnover?
4. Why are its errors spread over hedged combinations rather than two names?

**Part II — Constraints.**

5. What does the factor risk model with [dollar neutrality](#def-rs-portfolio-construction-i-constraints) change?
6. What do factor neutralities cost ex ante, and why so little?
7. What do name and gross limits do to scale and costs?
8. How many liquidity bounds bind, and what do they cost ex ante?
9. Why are most differences in realised information ratio between neighbouring settings noise?

**Part III — Turnover.**

10. What do turnover and costs become with the turnover limit?
11. Why does the realised information ratio rise before costs?
12. Why does the [transfer coefficient](https://one-course.com/books/quant/7/en/chapter/15-from-signal-to-forecast#def-rs-from-signal-to-forecast-breadth) fall, and is that bad?

**Part IV — The verdict.**

13. State the proposition behind the decomposition.
14. State the *named result* : the share of the unconstrained ex-ante information each constraint takes, and what each earned after costs.
15. Why do the gross limit and [dollar neutrality](#def-rs-portfolio-construction-i-constraints) take nothing?
16. Which book would you trade, and what would you report with it?
17. When is a sample covariance acceptable in an optimiser?
18. What would Jagannathan and Ma say about the [name limits](#def-rs-portfolio-construction-i-constraints) ?
19. How would you solve the problem for three thousand names?
20. In one sentence: what is an optimiser’s ex-ante information ratio worth?

**Solution of Problem 25.1.**

1. $w^* = \Sigma^{-1}\alpha/\gamma$ ; $\mathrm{IR} = \sqrt{\alpha^\top\Sigma^{-1}\alpha}$ .
2. The alpha is the simulation’s stock-specific monthly expected return plus noise twice as large, standardised and scaled by $\mathrm{IC}\,\sigma_i$ with $\mathrm{IC} = 0.05$ ; the risk model is chapter 24’s at a monthly horizon. The truth plus noise isolates construction from forecasting.
3. Gross 61; forecast 36%, realised 207% volatility; ex-ante 4.25, realised 0.92 and 0.43 after costs; turnover 84 a month.
4. The smallest eigenvalues of the sample covariance belong to combinations of many names; the top two positions hold 9% of the gross on average.
5. Forecast and realised volatility agree (13.7% and 14.0%), and the net information ratio is 1.39.
6. 1.64 to 1.59: the alpha is stock-specific, so the neutral book loses little.
7. The gross falls from 4.35 to 2.21 and 2.00, costs from 6.8% to 3.0% and 2.8% a year.
8. 28 on average; the ex-ante ratio falls from 1.44 to 1.23.
9. Realised ratios over 7.9 years have standard errors near 0.5.
10. Turnover 0.53 a month, costs 0.6% a year.
11. It averages monthly forecasts whose noise is independent from month to month.
12. The book no longer follows the noisy forecast; the correlation with it falls (0.97 to 0.58) while the correlation with the truth rises.
13. At the optimum $\alpha - \gamma\Sigma w^* = \sum_k g_k$ , and $\alpha^\top\Sigma^{-1}\alpha - \gamma^2 w^{*\top}\Sigma w^* = \sum_k g_k^\top\Sigma^{-1}(2\alpha - G)$ .
14. **Named result.** The turnover limit takes 44.0% of the unconstrained ex-ante $\mathrm{IR}^2$ , liquidity 39.4%, the neutralities 7.0%, the [name limits](#def-rs-portfolio-construction-i-constraints) 3.1%, the gross limit and [dollar neutrality](#def-rs-portfolio-construction-i-constraints) nothing. After costs the turnover limit earned the most: the net ratio rises from 0.46 to 1.77.
15. Neither binds: the book’s gross is about 1 once liquidity and turnover act, and [dollar neutrality](#def-rs-portfolio-construction-i-constraints) costs nothing with a stock-specific alpha.
16. The fully constrained book, reported with its forecast and realised volatility, its costs, the shadow prices and the decomposition, and the standard error of its information ratio.
17. When the number of periods is many times the number of names, or as an input to shrinkage, never raw with more names than observations.
18. That they shrink the weights where estimation error is largest, so a constraint wrong on paper can reduce realised risk.
19. In factor form ( $y = X^\top w$ ), with a sparse or splitting solver, warm starts and screening of names that cannot pay for their costs.
20. As much as its inputs are right: nothing, when its inputs are a sample covariance of more names than it has periods.

## 25.11 Interview questions

**Interview question 25.1 ★ researcher, trader.**

Why do unconstrained mean–variance portfolios perform badly out of sample?

**Solution of Interview question 25.1.**

They are error maximisers (Michaud): the optimiser favours assets with overestimated returns, underestimated variances and understated correlations, which are estimation errors. Remedies: scale alphas by risk, use factor risk models and shrinkage, constrain, and penalise turnover.

**Interview question 25.2 ★★ researcher.**

What is a shadow price in portfolio construction, and how would you use it?

**Solution of Interview question 25.2.**

The rate at which the objective would improve per unit of relaxation of a constraint. Use it to see which constraints bind and what they cost, to negotiate limits with risk managers, and, as vectors, to decompose what each constraint takes from the forecast’s information ratio.

**Interview question 25.3 ★★ researcher, risk.**

Your book must be dollar, beta and sector neutral. What does that cost, and when is it free?

**Solution of Interview question 25.3.**

The part of the alpha that lies along the neutralised exposures is lost; if the alpha is stock-specific (uncorrelated with the exposures) the cost is near zero (here 1.64 to 1.59 ex ante). Jacobs, Levy and Starer showed such neutrality is in general suboptimal; it is chosen for risk and mandate reasons.

**Interview question 25.4 ★★ trader.**

How do you set a liquidity limit, and what happens to the book as capital grows?

**Solution of Interview question 25.4.**

As a fraction of average daily traded value relative to capital, so the book can be exited in a few days; as capital grows the bounds tighten, more names bind (28 of 100 here at $1 billion), the book shifts to liquid names and the ex-ante ratio falls: capacity (chapter 28).

**Interview question 25.5 ★★ researcher.**

What is the [transfer coefficient](https://one-course.com/books/quant/7/en/chapter/15-from-signal-to-forecast#def-rs-from-signal-to-forecast-breadth), and why can a lower one be better?

**Solution of Interview question 25.5.**

The correlation between the book’s risk-adjusted weights and the risk-adjusted forecast (Clarke, de Silva and Thorley); it measures how much of the forecast reaches the book. When the forecast is noisy, a book that deliberately does not follow it (a turnover limit) has a lower coefficient and a better realised ratio.

**Interview question 25.6 ★★★ researcher, developer.**

Design the optimiser for a book of three thousand names rebalanced daily: formulation, solver, and what you precompute.

**Solution of Interview question 25.6.**

Factor form with exposures as variables; a sparse interior-point or operator-splitting solver; warm starts from yesterday’s solution; precomputed factor covariance, specific variances, exposures and liquidity bounds; screening of names whose alpha cannot pay for costs; checks on binding constraints and shadow prices before trading.
