The Analyst's Path

Phase 12Finance Plus, AI and the quant-code trackFinance trackAA1.0116,756 words1 h 33 min of readingabout 18 hours of study8 concept pagesfree

MVO, the Efficient Frontier, SAA vs TAA

Hand a spreadsheet Solver, or an AI assistant, which for this purpose is the identical mathematics wearing a friendlier interface, a table of expected returns, volatilities, and correlations, and ask it for "the optimal portfolio." It will answer in under a…

Advertisement

Branch: Asset Allocation & Performance (Finance-Plus Ring) · Node AA1.01 · ~18 focused hours · Standard gate ≥ 85%

Hand a spreadsheet Solver, or an AI assistant, which for this purpose is the identical mathematics wearing a friendlier interface, a table of expected returns, volatilities, and correlations, and ask it for "the optimal portfolio." It will answer in under a second, to four decimal places, with total confidence: 24.51% here, 70.60% there, a short position over there. What this node teaches you, by recomputing every one of those numbers yourself in Python before it is allowed to sit on the page, is that the confidence is almost entirely undeserved. A change to one input smaller than any honest estimate of that input's own uncertainty can flip the "optimal" answer's weights by ten percentage points or more (including flipping a position from short to long) while the objective the optimizer was chasing barely moves at all. The machine is not lying to you and it is not broken. It is doing exactly the arithmetic it was asked to do, and it will never volunteer how little of its confident output would survive a slightly different guess.

Advertisement

This Ring is additive institutional/CFA breadth, it presents the toolkit and the plumbing alongside, not in place of, the program's process-over-P&L, concentration-over-diversification philosophy. Nothing here asks you to abandon the fifteen-to-twenty-position conviction book M9.01 and M9.02 built your instincts around. It hands you the separate toolkit for the question an institution, a family office's total balance sheet, or the non-equity sleeves of your own capital eventually forces on you: how do you build and defend a diversified, multi-asset policy portfolio, in a language a pension trustee, an investment committee, or a CFA-trained colleague will recognize on sight?

The one-sentence version. Markowitz's mean-variance machine turns a table of assumptions into a supposedly optimal portfolio through nothing more exotic than matrix algebra (minimize w′Σw subject to w′μ = target and w′1 = 1) but the same algebra that makes the frontier bow so elegantly to the left is, underneath, an amplifier that turns small, ordinary estimation noise in your assumptions into large, sometimes sign-flipping swings in the "optimal" weights, which is exactly why every figure in this node is verified twice: once by the solver, once by your own hand or a second, independent Python route.

Where it sits. This is the first numbered node of the Asset Allocation & Performance branch. It is not open from day one: it builds on Phase 3 (M3.02's frontier and CAPM above all). The branch starts with capital market expectations, which opens once you pass the cost-of-capital module in Phase 3, and this node opens once you pass that one. AA1.01 (this node) builds the frontier and the strategic-versus-tactical split. AA1.02 takes the fragility exposed in §5.8 below and actually fixes it. Black-Litterman anchors expected returns to market equilibrium and blends in views with a stated confidence, risk budgeting and risk parity abandon return forecasts as the organizing input altogether, plus liability-relative and goals-based frameworks and a rebalancing policy's cost. AA1.03, the branch's crown, is the audit: it measures what the policy portfolio you build here actually produced, and it depends directly on the idea this node supplies, that the SAA, priced through the right indices, becomes the benchmark against which a real portfolio's allocation and selection decisions are later decomposed. Build it carelessly here and every attribution number in AA1.03 inherits the sloppiness.

Suggested hour budget. Core content 7h · worked examples 3h · practice set 4h · mini-project 3h · flashcards + mastery check 1h.

Case Lab: run case CL-AA.1 (Two Frontiers: Family Office vs Endowment) in the app's Cases tab, solve the shared global-minimum-variance and tangency portfolios from one set of capital market assumptions, then build two institutions' own constrained policy portfolios off that identical frontier, the same machinery Worked Examples 2–4 build below. Attempt it after Worked Example 4, blank sheet, before checking the model answer.


Learning objectives

By the end you can:

  1. Generalize the two-asset efficient frontier of M3.02 §4.5 to n assets in matrix form, build a covariance matrix Σ from volatilities and a correlation matrix, state the Markowitz problem as minimize w′Σw subject to w′μ = target, w′1 = 1, and explain why the two-asset formula you already own is the n = 2 special case of everything here.
  2. Compute the global minimum-variance (GMV) portfolio and the unconstrained efficient frontier in Python, verify the GMV's first-order condition (Σw proportional to 1) to machine precision, and state, and demonstrate, the non-obvious fact that GMV weights depend on Σ alone and never on μ.
  3. Compute the tangency (maximum-Sharpe) portfolio from w ∝ Σ⁻¹(μ − Rf·1), both unconstrained and under a long-only and a single-asset-cap constraint, and quantify the Sharpe ratio a real-world constraint costs relative to the unconstrained optimum.
  4. Distinguish Strategic Asset Allocation (SAA) from Tactical Asset Allocation (TAA), build an SAA at a stated risk target on a constrained frontier, apply a bounded tactical tilt, and judge the tilt on risk-adjusted terms rather than on whether the tilted asset simply went up.
  5. Expose, reproduce, and explain the MVO input-sensitivity failure, recompute, in Python, how a change of roughly one percentage point in a single expected-return assumption can swing a tangency weight by ten-plus percentage points and flip its sign, name the phenomenon (the "estimation-error maximizer" critique) and its sources, and state why this makes an unverified, AI- or solver-generated "optimal allocation" the single highest AI-over-trust risk in this Ring.
  6. Correctly attribute the industry's most misquoted statistic, state what Brinson, Hood & Beebower (1986) actually found, why "asset allocation explains 90% of returns" is a documented misreading of it, and how Ibbotson & Kaplan (2000) corrected the record.
  7. Assemble a defensible capital-market-assumptions (CMA) table, verify a correlation matrix is a valid (positive semi-definite) input before trusting anything downstream of it, and know where to pull real CMAs (a published institutional CMA set, or the historical/implied-ERP toolkit of M3.02 re-purposed for the equity leg) versus where this node's own numbers are explicitly synthetic teaching inputs.

Say this once, plainly (R10). Of every region in this program, asset allocation is the one where a tool will most confidently hand you a wrong-shaped answer that looks like sophistication. Worked Example 6 proves, in your own re-run Python, that the tangency portfolio's composition can reverse on an input change smaller than any honest confidence interval around that input, while the optimizer's own scorecard (its Sharpe ratio) moves almost nothing. That is AI0.01's "optimizes for plausible, not true" wearing a spreadsheet's clothing: the output is precise, confident, and only as trustworthy as the assumptions nobody shows you the error bars on. The by-hand and Python-verified understanding of why the optimizer is this fragile, not just that it exists, is the gated skill here; letting a tool run the optimization before you can reproduce and stress-test its answer yourself is exactly the failure mode this node exists to immunize you against.


Prerequisites & connections

Builds on. M3.02 §4.3–§4.5 is this entire node's foundation and is not re-derived: the two-asset portfolio-variance formula (σp² = w²σA² + (1−w)²σB² + 2w(1−w)ρσAσB), the minimum-variance weight formula, the bowed efficient frontier, the tangency portfolio, two-fund separation, the Sharpe ratio, and CAPM/beta/the equity risk premium. If any of those is not automatic, stop and go back, everything below is that same machinery, scaled from one correlation number to a full covariance matrix, and solved in Python because a napkin no longer suffices past two or three assets. M9.01 and M9.02 supply the concentrated-investor lens this node's positioning line keeps faith with: M9.01 argues risk is permanent capital impairment, not benchmark-relative wobble, and sizes single positions by conviction and Kelly logic; M9.02 stages the concentration-versus-diversification debate honestly and gives factor investing and the active-passive question their first hearing. Read what follows as the separate institutional dialect for a different mandate, a multi-asset policy portfolio, not a rebuttal of that view. M3.03 supplies the clean, currency-matched risk-free rate (its Station 1: strip the sovereign default spread out of a raw government-bond yield, add country risk back once through the ERP) that this node reuses without re-deriving as the risk-free leg of every capital allocation line below.

AA1.01 is not a day-one node: it unlocks once you pass AA1.04, which opens once you pass M3.03. You need M3.02's frontier and CAPM machinery cold, ordinary matrix notation (a vector, a matrix, a matrix times a vector, no proofs required), and enough comfort with Python to read numpy/scipy code even if you have never written an optimizer yourself.

Feeds forward. AA1.02 takes the input-sensitivity failure exposed in §5.8 and fixes it: Black-Litterman blends this node's return assumptions with market-equilibrium returns and a stated view-confidence; risk budgeting and risk parity size positions by risk contribution rather than by a fragile return forecast at all; and it owns the mechanics and cost of a rebalancing policy (calendar versus threshold) that this node only names in passing. AA1.03, the branch's crown, supplies the benchmark-as-policy-portfolio idea's payoff: once your SAA is set here and priced through the appropriate indices, that mix is the benchmark Brinson attribution decomposes a real portfolio's allocation and selection decisions against, build a sloppy SAA here and every attribution number downstream inherits the sloppiness. PW1.01 (Private-Client IPS) supplies the objectives-and-constraints machinery, return requirement, risk tolerance, time horizon, liquidity needs, that in practice sets the target return or target risk this node's SAA optimizes toward; this node assumes that target is already given to you. QD1.04 (Portfolio Optimization in Code, quant-code region) is where the short Python shown in the Modern Data Analysis callouts below grows into production software: real constraint sets (turnover, sector, ESG, liquidity), robust and shrinkage estimators, Black-Litterman and risk-parity implementations, and Michaud resampling, the coded answer to precisely the fragility this node exposes by hand.

The one-sentence version, restated as a promise. By the end of these hours, "the optimizer says 24.51% equity, 70.60% debt" will never again be something you write down, it will be something you reproduce, in your own Python, along with the one-line stress test that tells you whether that number is a real conclusion or an artifact of noise you happened to feed the machine.


Core teaching content

1. From two assets to n: why the algebra must change

M3.02 §4.3–§4.5 gave you the whole shape of Markowitz's idea with one correlation number: portfolios average returns but, whenever ρ < 1, they earn sub-average risk; plot every weighting of two assets and the curve bows to the left; add a risk-free asset and the best line from it just kisses the frontier at the tangency portfolio; two-fund separation says every investor's optimal risky holding is the same bundle, differing only in dose. None of that changes here. What changes is the arithmetic the instant a real mandate enters the room. A family office does not hold two assets; it holds equity, debt, gold, and property. An endowment holds equity, bonds, and a sleeve of private markets and hedge funds. The moment you go from two assets to four, the tidy two-asset variance formula (one ρ, one minimum-variance weight you could compute on a napkin) becomes a covariance matrix: six pairwise correlations to assemble simultaneously for four assets, twenty-eight for eight. "The" minimum-variance weight stops being a formula worth memorizing and becomes a linear-algebra problem, and linear algebra is what numpy is for.

This is not a concession to laziness; it is the honest shape of the problem, and the Python you will run below is the by-hand skill's natural extension, not its replacement. You still need to know exactly what the machine is solving, in what units, under what assumptions, or you will not catch it when the answer it hands you is nonsense (§5.8 makes this concrete and uncomfortable). Every number that follows was computed in a scratch Python script, run, and pasted here verified; the covariance matrices, the frontier points, the tangency weights, and the sensitivity demonstration in Worked Example 6 are not illustrations of a formula, they are that formula's actual, checked output.

Mean-variance optimization

Mean-variance optimization is the Markowitz method for choosing portfolio weights: find the mix of assets with the lowest variance for a target expected return, with the weights adding up to 1. Written in matrix form, the two-asset formulas scale to any number of assets. It is a quadratic program with a closed form until you add bounds such as no shorting, and it is the core of institutional portfolio-construction software.

3 min read, on its own page

3. Assembling the machine: two capital-market-assumption sets, checked before use

Two running cases carry this node, one per required jurisdiction (R6). Bharat Family Office (synthetic) holds four asset classes: domestic Equity, domestic Debt, Gold, and REITs. Northfield Endowment (synthetic, USD) holds three: US Equity, US Bonds, and a diversified Alts sleeve (private equity, hedge funds, and real assets, treated as one bucket). Every input below is an explicitly illustrative, synthetic capital-market-assumptions (CMA) set, chosen to be realistic in magnitude and to teach the mechanics honestly, not any single institution's published numbers. §9 tells you exactly where to pull real ones.

Bharat Family Office (INR, annual):

AssetE(R)σρ(Eq)ρ(Debt)ρ(Gold)ρ(REIT)
Equity12.0%19%1.000.10−0.050.55
Debt7.0%6%0.101.000.150.35
Gold7.5%15%−0.050.151.000.05
REIT9.0%17%0.550.350.051.00

Clean INR risk-free rate: 4.5% (M3.02 §4.10/M3.03's clean-Rf construction, reused without re-deriving). One definitional caution, because a neighbour computes it differently. That 4.5% is the credit-cleaned ten-year INR rate, and a Sharpe ratio strictly wants the cash rate, which on the same building blocks is about 5.70% (1.20% real plus 4.50% expected inflation). The 0.80-point gap is the maturity premium, and using the ten-year rate raises every Sharpe ratio in this node by roughly 0.19 on the equity line. Every comparison here is internally consistent because one rate is used throughout, which is what the teaching needs; AA1.04 runs the same frontier on both and shows the difference. When you build a real table, pick the cash rate for Sharpe ratios and say which one you used. The signs are chosen for real economic reasons, worth reading once: Equity and REIT sit at 0.55 because a REIT's cash flows are equity-like real-estate income, sensitive to the same growth cycle; Debt and REIT sit at 0.35 because a REIT also carries bond-like duration sensitivity through its distribution yield; Equity and Gold sit near zero (−0.05) because gold's classic role is a growth-cycle-agnostic store of value; Debt and Gold sit modestly positive (0.15) because both can benefit when real rates fall.

Before anything is computed from this table, run the one check almost nobody runs by hand and everybody should run in Python: is this correlation matrix even valid? A set of pairwise correlations assembled from separate "gut feel" judgments is not guaranteed to be internally consistent, some combination of them can imply a negative variance somewhere, which is nonsense. The test is that every eigenvalue of the correlation matrix must be non-negative (positive semi-definite). np.linalg.eigvalsh(corr) on the table above returns 0.390, 0.797, 1.107, 1.707, all positive, so this is a valid input. This is not a formality; it is the first Python-verification step, and it belongs in Common Mistakes below for a reason.

Northfield Endowment (USD, annual):

AssetE(R)σρ(Eq)ρ(Bonds)ρ(Alts)
Equity8.5%17%1.00−0.100.55
Bonds4.8%6%−0.101.000.05
Alts8.0%14%0.550.051.00

Clean US risk-free rate: 4.2% (M3.02's US Rf, reused). Eigenvalues of this correlation matrix: 0.430, 1.017, 1.552, again all positive, PSD confirmed. Equity-Bonds sits mildly negative (−0.10), a normal-regime assumption you should hold loosely (M3.02 §4.3 already warned that correlations lurch toward +1 in a crisis; that caveat is not re-argued here, only reused). Equity-Alts sits at 0.55 for a reason worth flagging now and returning to in §9: a diversified private-equity/hedge-fund composite's reported correlation to public equity is very often understated, because private-market marks are appraisal-based and update on a lag, the true, economic correlation is usually higher than the number a factsheet prints.

4. The global minimum-variance portfolio, and a non-obvious fact worth sitting with

The global minimum-variance (GMV) portfolio is the leftmost point of the frontier, the lowest-risk combination achievable from the menu, with no return target imposed. Its closed form is w_gmv = Σ⁻¹1 / (1′Σ⁻¹1), and running it on Bharat Family Office's table gives, verified in Python:

GMV (unconstrained): Equity 9.32%, Debt 86.94%, Gold 9.73%, REIT −5.99%; E(R) = 7.39%, σ = 5.62%.

Two things to read off this immediately. First, the unconstrained solution wants a small short position in REIT, real mandates almost never permit that, which is exactly why §5.5 exists. Second, and worth verifying yourself rather than taking on faith: the first-order condition for a GMV portfolio is that Σw is a constant vector, every asset's marginal contribution to portfolio variance must be identical at the minimum, or you could still trade one for another and reduce risk further. Running Sigma @ w_gmv returns 31.54, 31.54, 31.54, 31.54 (in %², to two decimals) across all four assets: confirmed to machine precision. This is the n-asset generalization of a check you can always run, and it is exactly the kind of self-verification a bare Python call will not do for you unless you ask it to.

Here is the fact worth sitting with, because it will matter enormously in §5.8: the GMV formula contains no μ at all. It depends only on Σ (the volatilities and correlations) never on the expected returns. Revise every asset's assumed return by any amount, in any direction, and the GMV portfolio's weights do not move by a single basis point. Every other point on the frontier (and, above all, the tangency portfolio) depends on μ, which is exactly where the fragility of §5.8 lives. Hold the contrast: Σ-only decisions (GMV) are relatively stable because covariance is comparatively easier to estimate and slower to change; μ-dependent decisions are exactly where an optimizer's confidence and an estimate's reliability come apart.

A slice of the full unconstrained frontier (short-selling allowed, the "textbook" case), by target return:

Target E(R)σEquityDebtGoldREIT
7.5%5.63%11.46%84.63%10.09%−6.18%
8.5%7.03%31.87%62.69%13.48%−8.04%
9.5%9.82%52.27%40.74%16.88%−9.89%
10.5%13.14%72.67%18.80%20.28%−11.75%
11.5%16.68%93.07%−3.15%23.67%−13.60%

The curve bows exactly the way the two-asset picture in M3.02 §4.5 did, you are looking at the same geometry, just traced through four dimensions instead of two. Notice, too, that REIT is short at every point on this table, and Debt itself turns short past 11.5% target return: this is the unconstrained frontier telling you, honestly, that it is a diagnostic device for understanding the trade-off, not a menu you could actually trade (Common Mistakes, item 10).

5. The tangency portfolio, revisited at scale

M3.02 §4.5 showed you that adding a risk-free asset turns the problem into finding the single portfolio that maximizes the Sharpe ratio (the steepest line from Rf that just kisses the frontier) and that every investor's best risky holding is some dose of that one bundle (two-fund separation). The n-asset formula is w_tan ∝ Σ⁻¹(μ − Rf·1), renormalized to sum to 1. For Bharat Family Office, at Rf = 4.5%:

Tangency (unconstrained): Equity 24.51%, Debt 70.60%, Gold 12.26%, REIT −7.37%; E(R) = 8.14%, σ = 6.30%, Sharpe = 0.578.

Read the economics, not just the arithmetic: Debt dominates this portfolio not because it has the highest return (it has the lowest, at 7.0%) but because its very low σ (6%) and low correlation with everything else lets it do almost all of the Sharpe-maximizing work, a textbook illustration of §4.4's point in M3.02 that a stock's own σ is not what gets priced or, here, what gets weighted; co-movement is. Gold earns a real allocation (12.26%) precisely because its near-zero correlation with Equity makes it a genuine diversifier. REIT, correlated 0.55 with Equity and 0.35 with Debt, adds too little diversification benefit at this menu's assumed returns to earn a positive unconstrained weight at all, a result, not a prejudice, and one that (as §5.8 shows) is uncomfortably close to flipping.

Mean-variance optimization with constraints

Mean-variance optimization with constraints is the same search for the lowest-variance portfolio, with limits on the weights such as no shorting or a cap on illiquid assets. Once a bound is added there is no closed form, so a numerical solver does the work. Analysts use it to price each limit: a constrained portfolio can only match or fall short of the unconstrained Sharpe ratio, and the gap is the price of the constraint.

5 min read, on its own page

Strategic asset allocation

Strategic asset allocation (SAA) is the long-run policy mix of asset classes, set from long-run capital-market assumptions to meet an investor's return requirement and risk tolerance over a multi-year horizon. In practice it is one point on the constrained, investable frontier, chosen to match a target level of risk or return and then kept in place by a rebalancing policy. It also becomes the benchmark: later decisions, such as a tactical tilt or a manager's security selection, are measured against it.

3 min read, on its own page

Tactical asset allocation

Tactical asset allocation (TAA) is a bounded, shorter-term deviation from the long-run strategic mix, taken on a view about markets such as a valuation call or a momentum signal. It stays inside a stated band, commonly 5 percentage points either way for each asset class. Analysts judge it net of transaction costs and taxes and on risk-adjusted terms, because a tilt that raises return can still lower the Sharpe ratio.

4 min read, on its own page

9. The input-sensitivity failure: MVO as an "estimation-error maximizer"

Here is the module's center of gravity, and the reason its mastery gate cannot be passed by trusting a tool. §4 already planted the seed: the GMV portfolio depends only on Σ, but the tangency portfolio and every other point on the frontier depend on μ, and expected returns are, by a wide margin, the least reliable input in the whole exercise: recall from M3.02 §4.8 that even a century of US market history pins the equity risk premium down to only about ±4 points at 95% confidence. Best & Grauer (1991) and Michaud (1989) made the resulting fragility precise and gave it a name that has stuck: unconstrained mean-variance optimization behaves like an estimation-error maximizer, it does not just tolerate noise in your return assumptions, it actively exploits it, because the optimizer's job is to lean as hard as the math allows into whatever asset the inputs say is best, and small differences in "best" translate into large differences in "how hard to lean." Chopra & Ziemba (1993) quantified which input matters most: errors in expected returns move optimal weights roughly an order of magnitude more than equivalently sized errors in volatilities or correlations. This is why §9's forward pointer to real CMA sources spends the most care on the return leg, and why AA1.02's Black-Litterman fix targets expected returns specifically, not the covariance matrix.

Make it concrete on Bharat Family Office's unconstrained tangency portfolio. Hold every input fixed except REIT's assumed expected return, and nudge it up in small steps, well within any honest estimate of that single number's own uncertainty:

REIT's assumed E(R)EquityDebtGoldREITSharpe
9.00% (baseline)24.51%70.60%12.26%−7.37%0.578
10.00% (+100bp)22.07%66.84%12.29%−1.20%0.5712
10.20% (+120bp)21.57%66.07%12.29%+0.07%0.5710
11.00% (+200bp)19.53%62.92%12.32%+5.24%0.5743

A change of roughly one percentage point, smaller than the kind of revision an honest capital-markets team makes to a single asset's return assumption every year without controversy, moves REIT's "optimal" position by more than six percentage points, and a change of about 1.2 points flips the sign entirely: the same optimizer that told you to short REIT by 7.4% now tells you to hold it long. Notice, too, the column you were never shown by a bare tool: the Sharpe ratio, the optimizer's own scorecard, barely moves across this entire range (0.578 → 0.571 → 0.574), meaning the optimizer is nearly indifferent between a portfolio that shorts REIT by 7% and one that owns it at +5%, yet it will report only one of them, in exactly the same decimal-precise, confident register either way. That is this Ring's version of AI0.01's invisible-probability lesson: a near-flat objective surface near the optimum means many genuinely different portfolios are almost equally "correct," and nothing in the optimizer's output tells you that your specific answer sits on a knife's edge rather than a solid plateau.

The same fragility recurs in the other currency and in a different direction. Cut Northfield Endowment's Bonds assumption by a mere 80 basis points (4.8% → 4.0%, again a modest, plausible capital-markets revision) and the unconstrained tangency portfolio's Bonds position flips from a substantial long (+44.71%) to an outright short (−27.32%), with Equity and Alts both surging to absorb it (48.17% and 79.15% respectively). Constraints dampen this, the long-only, no-cap tangency's Equity weight moves only about 2.6 percentage points for a comparable 100bp bump to Equity's own assumption, because REIT's floor at zero absorbs part of the adjustment rather than letting it flow through unchecked, but dampening is not curing: a bounded optimizer still reallocates meaningfully off inputs no analyst should treat as precise. Revising a correlation assumption produces the same qualitative lesson from a different angle: raising Bharat's Equity–REIT correlation from 0.55 to 0.70 (still a valid, PSD-confirmed input) moves the unconstrained tangency's REIT weight from −7.37% to −17.68%, a ten-point swing, while Equity and Debt both rise to compensate.

{
  "skill": "Refusing to trust a solver's or an assistant's single 'optimal portfolio' output without stress-testing it",
  "use": "Whenever a tool (a chat assistant, a spreadsheet Solver, a robo-advisor's backend) hands you a specific weight vector as 'the optimal allocation,' have it (or your own script) re-run the same optimization after perturbing one expected-return input by an amount no larger than your own honest estimate of that input's uncertainty, and report how much the weights move.",
  "prompt": "Here is my capital-market-assumptions table and the 'optimal' weights a tool produced from it: <PASTE>. Recompute the same optimization after raising ONE asset's expected return by <X basis points, a modest, defensible revision>, holding everything else fixed. Show me the new weights side by side with the original and flag whether any position's sign changed.",
  "tools": ["A code-execution-enabled chat assistant that can actually run the re-optimization, not just describe it", "Any spreadsheet Solver or portfolio-construction tool your desk already uses"],
  "verify": "Never accept the re-run's numbers without checking them against your own independent computation (Guardrail #3 Recompute) — the whole point of this exercise is that you, not the tool, decide whether the swing you observe is small (the answer is robust) or large (the 'optimal' answer was mostly noise dressed as precision). If the tool declines to show the swing or reports only the new answer without the comparison, that is itself a red flag (Guardrail #1 Trace: trace the claim of optimality back to the actual sensitivity, not just the tool's say-so).",
  "diy": "You must already be able to compute a tangency portfolio and reason about why it might be fragile (this node's §5, §9) before this check means anything to you — otherwise you are just trusting a second confident number instead of the first one.",
  "market": "US"
}

Capital market assumptions

Capital market assumptions (CMAs) are the forward-looking figures an allocation is built on, such as the expected return and volatility of each asset class. Real ones come from estimating each asset class separately: the equity risk premium plus a risk-free rate for equities, and yield to maturity for bonds. Free long-term sets from large asset managers are the usual starting point, and the correlation matrix has to pass a validity check before use.

3 min read, on its own page

11. Where this Ring's toolkit sits, restated

M9.02 §4.3 already staged the concentration-versus-diversification debate honestly, for the single, concentrated-investor portfolio this program's core process trains you to run. Nothing here reopens or resolves that debate, it is not this node's argument to make. What this node teaches is the separate, genuinely useful toolkit for a different, and very real, question: how an institution, or the non-equity sleeves of your own balance sheet, or a client's total wealth you are asked to advise on alongside their concentrated equity book, builds and defends a diversified multi-asset policy portfolio in the language a pension trustee, an investment committee, or a CFA-trained colleague expects to hear. A competent professional in this program's world increasingly needs both languages: the conviction-and-concentration case for the equity sleeve you actually pick stocks in, and the institutional-allocation case for everything else that sits on the same balance sheet. This Ring hands you the second language. It does not ask you to unlearn the first.

Portfolio management process

The portfolio management process is the standard loop for managing a client's money: write an investment policy statement from the client's objectives and constraints, then implement it and feed what you learn back into the policy. It has three stages, and the second and third take almost all of the fee and almost none of the analytical attention. A firm that redoes its optimisation quarterly and never measures its own implementation shortfall has automated the cheap part.

5 min read, on its own page

Fintech in investment management

Fintech in investment management is the use of new technology to build and run portfolios, from alternative data and machine learning to automated trading and robo-advice, and each has a specific use and a specific way of failing. The clearest gain is lower fees, while claims about tax savings are often over-quantified. A robo-adviser is a regulated adviser, so the firm has to be able to explain why a client's answers produced a given allocation.

5 min read, on its own page

ESG investing strategies

ESG investing strategies are the ways an investor builds a sustainability preference into a portfolio. Six approaches are used, from excluding whole industries to voting as a shareholder, and only screening and thematic investing change the frontier. Analysts price a screen like any other constraint: in the worked example it costs 4.27% of the Sharpe ratio, a price the client can weigh against the preference.

4 min read, on its own page

Common mistakes & how experts think differently

  1. Treating the optimizer's single output as a precise answer rather than a point estimate with large, invisible error bars. §9 showed a 100–120bp revision to one assumption flipping a position's sign while the Sharpe ratio barely moved. Amateurs write down "24.51%" as if it were a measurement; experts ask "how far can my return assumptions move before this answer changes materially?" before they write down anything.
  1. Letting a solver or an AI assistant's confidently stated "optimal allocation" stand unexamined. This is R10's highest-risk region in the whole Ring: the output is decimal-precise and identical in tone whether the underlying inputs are solid or noise. The expert's reflex, every time, is the sensitivity re-run of §9's second ai-augment-json callout, not because the tool is untrustworthy, but because no tool, including a careful human, can make a fragile input stable by computing harder.
  1. Assembling a correlation matrix from gut-feel pairwise numbers without checking it is positive semi-definite. A set of correlations that looks individually reasonable can be jointly inconsistent (implying a negative variance somewhere) and every number computed downstream of an invalid matrix is garbage dressed as precision. numpy.linalg.eigvalsh (or confirming a Cholesky decomposition succeeds) is a thirty-second check that must happen before the first frontier point.
  1. Assuming calm-market correlations hold when it matters most. M3.02 §4.3 already showed that measured correlations lurch toward +1 in a crisis, a ρ = 0.3 pair behaving like 0.9 exactly when diversification is needed. This node does not re-derive that caveat; it inherits it fully, and every correlation in §3's tables should be read as "typical regime," never "guaranteed."
  1. Quoting "asset allocation explains 90% of returns" as if Brinson, Hood & Beebower (1986) proved it. §8 stated the correct, narrower claim (time-series variance of one fund's own returns) and the correction (Ibbotson & Kaplan, 2000). Getting this backwards is one of the most common credentialing tells in the industry, a fluent, confident, and wrong recitation of a real paper's title without its actual finding.
  1. Chasing a tactical tilt without netting transaction costs, taxes, and turnover, or evidence of genuine forecasting skill. §8's own worked tilt raised return but lowered risk-adjusted return before a single rupee of trading cost was even subtracted. A TAA program that cannot clear that bar gross has no chance of clearing it net.
  1. Confusing "set the SAA" with "set and forget." A policy portfolio drifts from its target weights as markets move and must be brought back by a rebalancing policy, its calendar-versus-threshold design and its turnover cost are AA1.02's job, not taught here, but the discipline itself is not optional just because this node stops short of its mechanics.
  1. Trusting a reported Alts or REIT correlation at face value. §10 named the mechanism: appraisal-based, infrequently marked prices smooth away true volatility and correlation. An allocator who reads a factsheet's "0.2 correlation to equities" as ground truth is very often buying a statistical illusion rather than a genuine diversifier, the true figure typically runs meaningfully higher.
  1. Mixing currencies or inflation regimes when comparing allocations. M3.02's Worked Example 4(e) already refused to rank an INR required return against a USD one without adjusting for the different inflation baked into each. The same discipline applies here: never blend or benchmark an SAA built in one currency's nominal terms directly against one built in another's without that adjustment.
  1. Treating the unconstrained (short-selling-allowed) efficient frontier as an investable menu. §4's frontier table has REIT short at every single point and Debt itself turning short past 11.5% target return. That frontier is a genuine, useful diagnostic for understanding the trade-off the covariance matrix implies, it is not a portfolio any real mandate could hold, and §6's constrained frontier is what you actually build from.

Worked examples

Worked example 1: Building and validating a covariance matrix (India, ₹)

Given. Bharat Family Office's four-asset CMA table from §3: σ = (19%, 6%, 15%, 17%) for (Equity, Debt, Gold, REIT), with the correlation matrix given there.

Solution. Step 1: build Σ. Σ_ij = σ_i σ_j ρ_ij. The diagonal is just each asset's own variance: Equity 19² = 361, Debt 6² = 36, Gold 15² = 225, REIT 17² = 289 (all in %²). The off-diagonals: Equity–Debt = 0.10 × 19 × 6 = 11.40; Equity–Gold = −0.05 × 19 × 15 = −14.25; Equity–REIT = 0.55 × 19 × 17 = 177.65; Debt–Gold = 0.15 × 6 × 15 = 13.50; Debt–REIT = 0.35 × 6 × 17 = 35.70; Gold–REIT = 0.05 × 15 × 17 = 12.75. Assembled:

Σ (%²) =  [ 361.00   11.40  -14.25  177.65 ]
          [  11.40   36.00   13.50   35.70 ]
          [ -14.25   13.50  225.00   12.75 ]
          [ 177.65   35.70   12.75  289.00 ]

Step 2: validate it before using it. numpy.linalg.eigvalsh(corr) on the underlying correlation matrix returns 0.390, 0.797, 1.107, 1.707, every eigenvalue strictly positive, so the matrix is a legitimate (positive semi-definite) correlation structure. Had any pairwise correlation been chosen carelessly (say, three assets each pairwise correlated at 0.9 with each other but one pair at −0.9), this check would have failed, and every downstream number (GMV, frontier, tangency) would have been meaningless before a single line of optimization ran.

Step 3, a hand spot-check of one entry. Pick the largest off-diagonal, Equity–REIT: 0.55 × 19 × 17. 19 × 17 = 323; 323 × 0.55 = 177.65: matches the matrix above exactly. This thirty-second arithmetic check is the whole discipline in miniature: never let a matrix-construction line of code run unverified on its very first use.

Read it. Every subsequent worked example in this node reuses exactly this Σ (or Northfield's three-asset analogue), verified once, here, so nothing after this point needs to re-litigate whether the covariance matrix itself is trustworthy.

Worked example 2: The global minimum-variance portfolio, and its first-order condition (India, ₹)

Given. Σ from Worked Example 1; μ = (12.0%, 7.0%, 7.5%, 9.0%).

Solution. Step 1, the closed form. w_gmv = Σ⁻¹1 / (1′Σ⁻¹1). Inverting Σ and applying this in Python returns Equity 9.32%, Debt 86.94%, Gold 9.73%, REIT −5.99%.

Step 2, the first-order condition, checked. At the true minimum-variance point, every asset's marginal contribution to portfolio variance ((Σw)_i) must be identical, otherwise you could still improve the portfolio by trading one asset for another. Computing Σ @ w_gmv in Python returns 31.54, 31.54, 31.54, 31.54 (%², to two decimals) in every row, the condition holds to machine precision, and 1/A (the reciprocal of 1′Σ⁻¹1) equals the same 31.54, exactly as the formula predicts.

Step 3, the portfolio's stats, and the fact that should surprise you. E(R) = w′μ = 9.32%×12.0 + 86.94%×7.0 + 9.73%×7.5 + (−5.99%)×9.0 = 7.39%; σ = √31.54% = 5.62%. Now revise μ however you like, raise Equity's assumed return from 12.0% to 20.0%, say, and recompute: w_gmv does not move at all, because the GMV formula never references μ. Verify this yourself in Python before trusting the assertion; it is the cleanest possible illustration that not every MVO output is fragile, only the return-dependent ones are, and knowing which is which is half the professional skill this node teaches.

Read it. GMV is the frontier's one genuinely stable landmark. Everything from here forward (the tangency portfolio, the SAA, the sensitivity failure of Worked Example 6) depends on μ, and that dependency is exactly where the module's central warning lives.

Worked example 3: The tangency portfolio, three ways, and the price of each constraint (India, ₹)

Given. Σ and μ as above; Rf = 4.5% (clean INR, M3.02/M3.03).

Solution. Step 1: unconstrained. w_tan ∝ Σ⁻¹(μ − Rf·1), renormalized to sum to 1: Equity 24.51%, Debt 70.60%, Gold 12.26%, REIT −7.37%; E(R) = 8.14%, σ = 6.30%, Sharpe = (8.14 − 4.5)/6.30 = 0.578.

Step 2: long-only, no other bound. Re-solve with scipy.optimize.minimize, objective −(w′μ − Rf)/√(w′Σw), subject to w ≥ 0 and Σw = 1: Equity 21.60%, Debt 66.11%, Gold 12.29%, REIT 0.00%; E(R) = 8.14%, σ = 6.38%, Sharpe = 0.571, a 1.2% relative give-up versus the unconstrained case, purely from forbidding REIT's short.

Step 3, long-only plus a 50% single-asset cap. Add w_i ≤ 0.50 for every asset and re-solve: Equity 29.37%, Debt 50.00% (binding), Gold 20.63%, REIT 0.00%; E(R) = 8.57%, σ = 7.36%, Sharpe = 0.5535, a further, larger give-up, 4.2% relative to the unconstrained optimum, because the cap binds on exactly the asset (Debt) doing the most Sharpe-maximizing work in Step 1.

Step 4, read the ladder. 0.578 → 0.571 → 0.5535: each additional, more realistic constraint costs a little more Sharpe ratio, and the size of the cost tells you which sleeve the unconstrained math was leaning on hardest. A trustee who insists on both "no shorting" and "no more than half the book in any one sleeve" is buying real, quantifiable safety at a real, quantifiable price, not a free improvement, and not a catastrophe either.

Read it. Compare this to Northfield Endowment's Alts-cap-at-20% result in §6 (Sharpe 0.317 → 0.3132, a mere 1.2% relative cost): the same kind of constraint can be expensive or nearly free depending on how much diversification value the capped sleeve was actually contributing, a genuinely useful piece of policy-design intuition that only falls out of doing the arithmetic honestly.

Worked example 4: Building an SAA on the constrained frontier (US, $)

Given. Northfield Endowment: μ = (8.5%, 4.8%, 8.0%) for (Equity, Bonds, Alts), σ = (17%, 6%, 14%), correlations from §3; Rf = 4.2%. Target: a policy portfolio near 9.5% annualized volatility.

Solution. Step 1, the long-only frontier. Solving the constrained problem at a grid of target returns (bounds 0 ≤ w ≤ 1, w′1 = 1) traces a frontier from the long-only GMV (Equity 10.21%, Bonds 83.46%, Alts 6.33%; σ = 5.41%) up toward the highest achievable return.

Step 2: locate the target-risk point. Scanning that frontier for the target return whose achieved σ lands closest to 9.5% gives target return 7.176%, achieved σ = 9.50% almost exactly, at weights Equity 29.86%, Bonds 30.42%, Alts 39.72%; Sharpe = (7.176 − 4.2)/9.50 = 0.3133.

Step 3: hand cross-check the variance. Expand w′Σw term by term (values in %²): Equity–Equity = 0.2986² × 17² = 25.774; Equity–Bonds (doubled) = 2 × 0.2986 × 0.3042 × 17 × 6 × (−0.10) = −1.853; Equity–Alts (doubled) = 2 × 0.2986 × 0.3972 × 17 × 14 × 0.55 = 31.054; Bonds–Bonds = 0.3042² × 6² = 3.331; Bonds–Alts (doubled) = 2 × 0.3042 × 0.3972 × 6 × 14 × 0.05 = 1.015; Alts–Alts = 0.3972² × 14² = 30.923. Sum: 25.774 − 1.853 + 31.054 + 3.331 + 1.015 + 30.923 = 90.244 (%²) → σ = √90.244 = 9.50%, matches the Python w′Σw output exactly.

Read it. This SAA: 29.86% Equity, 30.42% Bonds, 39.72% Alts, is not a number this node hands you for its own sake. It is the object AA1.03 later calls a benchmark: price each sleeve through its appropriate market index, and any future manager's actual portfolio gets decomposed, segment by segment, against exactly this policy mix.

Worked example 5: A tactical tilt, quantified and judged (US, $)

Given. Northfield Endowment's SAA from Worked Example 4 (Equity 29.86%, Bonds 30.42%, Alts 39.72%; E(R) = 7.176%, σ = 9.50%, Sharpe = 0.3133). Tactical view: overweight Alts by 5 percentage points (an illiquidity-premium call), funded from Bonds, within a stated ±5pp band.

Solution. Step 1: apply the tilt. New weights: Equity 29.86% (unchanged), Bonds 25.42% (−5pp), Alts 44.72% (+5pp).

Step 2: recompute in Python. E(R) = 0.2986×8.5 + 0.2542×4.8 + 0.4472×8.0 = 7.336% (+16.0bp vs SAA); σ = √(w′Σw) = 10.083% (+58.3bp vs SAA); Sharpe = (7.336 − 4.2)/10.083 = 0.311 (down from 0.3133).

Step 3: judge it. Return rose. Risk rose faster, proportionally, so the risk-adjusted return fell. If the tilt is judged only on "did Alts do well relative to Bonds," it looks vindicated the moment Alts outperforms; judged on Sharpe, the metric an institutional overlay is actually held to, it needs Alts to outperform by enough to compensate for the extra volatility the tilt introduced, and this particular sizing did not clear that bar even before a single dollar of transaction cost, illiquidity friction, or tax drag is subtracted.

Read it. This is the asset-class-level echo of M9.01's single-position sizing lesson: conviction about direction and correctness about sizing are two different skills, and an allocator who tracks only the first will systematically overrate tactical calls that a Sharpe-ratio discipline would flag as poorly sized.

Worked example 6: The input-sensitivity failure, reproduced and diagnosed (India, ₹)

Given. Bharat Family Office's unconstrained tangency portfolio from Worked Example 3, Step 1: Equity 24.51%, Debt 70.60%, Gold 12.26%, REIT −7.37%; Sharpe = 0.578.

Solution. Step 1: perturb one input. Raise REIT's assumed expected return from 9.00% to 10.00%, a 100-basis-point revision, comfortably inside any honest confidence interval a real capital-markets team would put around a single asset's return assumption, holding every volatility and correlation fixed. Re-solve w_tan ∝ Σ⁻¹(μ − Rf·1) in Python.

Step 2, read the new weights. Equity 22.07%, Debt 66.84%, Gold 12.29%, REIT −1.20%. REIT's position moved by more than six percentage points on a one-point input change, and Sharpe barely moved at all, from 0.578 to 0.5712.

Step 3, push further and watch the sign cross. At REIT's assumed return of 10.20% (a further 20bp), REIT's weight is +0.07%: positive. Somewhere between +115bp and +120bp of cumulative revision, the same optimizer that recommended shorting REIT by 7.4% now recommends holding it long. Sharpe across this entire range from baseline to +200bp moves only between 0.571 and 0.578, the objective surface is nearly flat exactly where the recommended trade is reversing.

Step 4, name the mechanism and its sources. This is not a coding error and not an unstable solver; it is the documented behavior of unconstrained mean-variance optimization under estimation error (Best & Grauer, 1991; Michaud, 1989's "estimation-error maximizer"), and Chopra & Ziemba (1993) specifically identify expected-return errors, not volatility or correlation errors, as the dominant driver of exactly this kind of output instability.

Read it. Connect this directly to R10's opening warning: an AI assistant or a spreadsheet Solver asked to "optimize this portfolio" from the baseline table will confidently return "short REIT by 7.4%." The same tool, fed a barely different (and equally defensible) return assumption, will just as confidently return "own REIT at +5.2%." Both answers arrive in identical, decimal-precise, confident language, exactly AI0.01's "plausible, not true" wearing this Ring's clothing. The only thing that tells you which portfolio (if either) deserves your trust is running this exact sensitivity check yourself, in your own Python, before the number leaves the page. AA1.02 is the fix, not a repeat of the diagnosis: Black-Litterman anchors return assumptions to market equilibrium and blends in views with a stated confidence precisely so that a plausible-sounding but weakly evidenced view cannot single-handedly flip a sleeve's sign the way this REIT assumption just did.


Practice set

Work every problem before reading its solution. Guided (P1–P4) → independent (P5–P9) → integrated (P10–P14) → timed (P15–P17).

P1 (guided). Using Bharat Family Office's Equity (σ = 19%) and Gold (σ = 15%, ρ = −0.05 with Equity) alone, at weights 70/30, compute the two-asset portfolio σ with M3.02's formula.

Solution. σp² = 0.70² × 19² + 0.30² × 15² + 2 × 0.70 × 0.30 × (−0.05) × 19 × 15 = 176.89 + 20.25 − 5.985 = 191.155 (%²) → σp = 13.83%.

P2 (guided). For the same two-asset pair, find the minimum-variance weight in Equity using M3.02's formula, and its σ.

Solution. w(Equity) = (σ_Gold² − ρσ_Eqσ_Gold) / (σ_Eq² + σ_Gold² − 2ρσ_Eqσ_Gold) = (225 − (−14.25)) / (361 + 225 − 2×(−14.25)) = 239.25 / 614.5 = 38.93%, so Gold = 61.07%. σ = √(0.3893²×361 + 0.6107²×225 + 2×0.3893×0.6107×(−0.05)×19×15) = 11.48%, below either asset's own σ, exactly as M3.02 §4.3's dominance argument predicts.

P3 (guided). Bharat's unconstrained GMV weights are (9.32%, 86.94%, 9.73%, −5.99%) for (Equity, Debt, Gold, REIT), and Worked Example 2 reported Σ @ w_gmv = (31.54, 31.54, 31.54, 31.54) (%²), the first-order condition. Using Σ's Equity row (361.00, 11.40, −14.25, 177.65), verify the Equity entry of Σw by hand.

Solution. 361.00×0.0932 + 11.40×0.8694 + (−14.25)×0.0973 + 177.65×(−0.0599) = 33.645 + 9.911 − 1.386 − 10.641 = 31.53 (%²): matches the reported 31.54 to rounding. The first-order condition holds on this row exactly as claimed.

P4 (guided). Read the long-only frontier table in §4/§6 (Bharat, constrained). At which target return does REIT first hit its zero floor, and does it ever leave that floor as target return rises further? Explain in economic terms.

Solution. REIT is at its zero floor at every long-only frontier point shown (7.5% through 11.5% target return), it never re-enters, because its risk/return/correlation profile never becomes attractive enough relative to Equity, Debt, and Gold to earn a positive weight anywhere on this menu under long-only constraints; the unconstrained frontier's willingness to hold it (at negative weights) was entirely a function of permitting a short position that funds the other three assets more cheaply than any long combination could.

P5 (independent). Compute the Sharpe ratio of the unconstrained frontier point at target return 9.5% (σ = 9.82%, from §4's table), Rf = 4.5%.

Solution. (9.5 − 4.5)/9.82 = 0.509. Compare to the tangency portfolio's 0.578, every other frontier point has a strictly lower Sharpe ratio than the tangency portfolio, by definition of what "tangency" means.

P6 (independent). Compute Northfield Endowment's expected return and σ for a naive equal-weight (1/3 each) portfolio across Equity, Bonds, and Alts.

Solution. E(R) = (8.5+4.8+8.0)/3 = 7.10%. σ² = w′Σw with w = (1/3,1/3,1/3) gives σ = 9.25% (Sharpe = 0.313).

P7 (independent). Compare P6's equal-weight σ (9.25%) to Northfield's GMV σ (5.41%, §4/Worked Example 4). What does the 3.84-point gap tell you about "1/N" as a diversification policy?

Solution. Equal weighting ignores the huge σ differences across these three asset classes (Bonds at 6% versus Equity at 17%): 1/N in dollar terms is very far from 1/N in risk terms. The naive portfolio carries nearly double the GMV's volatility for barely any more expected return (7.10% vs 5.38%), because it hands Equity and Alts far more risk-budget than their diversification value earns them.

P8 (independent). Bharat's SAA Sharpe ratio is 0.4855; its TAA (Worked Example 6's tilt from §8) is 0.4725. Was the tilt's underlying view rewarded? Was it a good sizing decision?

Solution. The view was directionally rewarded: expected return rose 25bp. It was not a good sizing decision on a risk-adjusted basis: σ rose 83.2bp, more than proportionally, so the Sharpe ratio fell. Direction and sizing are different questions, and only the second is what a TAA overlay mandate is actually judged on.

P9 (independent). Compute the relative Sharpe-ratio cost of Bharat's 50%-cap constraint (unconstrained 0.578, capped 0.5535) and Northfield's 20%-Alts-cap constraint (unconstrained 0.317, capped 0.3132). Which constraint was "more expensive," and why might that be?

Solution. Bharat: (0.578 − 0.5535)/0.578 = 4.24%. Northfield: (0.317 − 0.3132)/0.317 = 1.20%. Bharat's cap was materially more expensive because it bound on Debt (the asset doing the most Sharpe-maximizing work in the unconstrained solution (§5)) while Northfield's cap bound on Alts, a smaller contributor to the unconstrained optimum's efficiency. A constraint's Sharpe cost is a direct read on how much diversification value the capped sleeve was providing.

P10 (integrated). Using the sensitivity table in Worked Example 6, compute the percentage-point swing in REIT's weight and in Debt's weight between the baseline and the +100bp bump. Which documented finding (name the authors) does this illustrate?

Solution. REIT: −7.37% → −1.20%, a swing of +6.17pp. Debt: 70.60% → 66.84%, a swing of −3.76pp. This illustrates Chopra & Ziemba's (1993) finding that errors in expected-return assumptions move optimizer output far more than equivalently sized errors in volatility or correlation inputs would.

P11 (integrated). Hand-verify Northfield's GMV portfolio variance (Equity 10.21%, Bonds 83.46%, Alts 6.33%) against its Σ (Equity–Equity 289, Bonds–Bonds 36, Alts–Alts 196, Equity–Bonds −10.2, Equity–Alts 130.9, Bonds–Alts 4.2, all %²), and confirm σ = 5.41%.

Solution. 0.1021²×289 + 0.8346²×36 + 0.0633²×196 + 2×0.1021×0.8346×(−10.2) + 2×0.1021×0.0633×130.9 + 2×0.8346×0.0633×4.2 = 3.013 + 25.075 + 0.785 − 1.744 + 1.689 + 0.446 = 29.264 (%², small rounding) → σ = √29.264 ≈ 5.41%: matches.

P12 (integrated). Northfield's unconstrained tangency has σ = 7.86%, Sharpe = 0.317, Rf = 4.2%. Using two-fund separation (M3.02 §4.5), find the weight on the tangency portfolio (rest in Rf) needed to hit a target portfolio σ of 6%, and the resulting expected return.

Solution. w = target σ / tangency σ = 6/7.86 = 0.763 (76.3% in the tangency portfolio, 23.7% in Rf). E(R) = Rf + w×(tangency E(R) − Rf) = 4.2 + 0.763×(6.69 − 4.2) = 4.2 + 1.90 = 6.10%.

P13 (timed). Bharat's Equity–REIT correlation is revised from 0.55 to 0.70 (still PSD-valid, check the new correlation matrix's eigenvalues yourself). Recompute the unconstrained tangency portfolio.

Solution. New weights: Equity 30.61%, Debt 74.87%, Gold 12.20%, REIT −17.68%; E(R) = 8.24%, σ = 6.21%, Sharpe = 0.6021. A 15-point correlation revision deepened REIT's short by more than ten percentage points and raised the achievable Sharpe ratio, a reminder that correlation inputs, not only return inputs, can move optimizer output substantially, even if Chopra & Ziemba's finding says returns dominate on a per-basis-point basis.

P14 (timed). Northfield's Bonds expected return is revised down from 4.8% to 4.0% (an 80bp cut). Recompute the unconstrained tangency portfolio and describe what happened to Bonds' position.

Solution. New weights: Equity 48.17%, Bonds −27.32%, Alts 79.15%; E(R) = 9.33%, σ = 17.12%, Sharpe = 0.2998. Bonds flips from a substantial long (+44.71% at baseline) to a substantial short (−27.32%) on an 80bp change to a single input, a more dramatic instance of exactly Worked Example 6's lesson, in the other currency and in the opposite direction (a cut, not a rise).

P15 (timed, conceptual). In two to three sentences, explain why the unconstrained (short-selling-allowed) efficient frontier is a diagnostic device rather than an investable menu, citing at least one concrete figure from this node.

Solution. The unconstrained frontier reveals what the covariance and return assumptions imply is mathematically optimal with no restriction (useful for understanding the trade-off) but its solutions routinely require positions no real mandate permits: Bharat's frontier has REIT short at every point shown and Debt itself turning short past an 11.5% target return (§4). A real portfolio is built from the constrained frontier (§6), which can only match or fall short of the unconstrained one, never improve on it.

P16 (timed, conceptual). A colleague claims their "TAA program added 90% of our fund's return" and cites Brinson, Hood & Beebower (1986). What is wrong with the citation?

Solution. BHB's finding describes the share of the time-series variance in one fund's own returns explained by its policy mix (SAA), not TAA, and it says nothing about the level of return or differences across funds. Citing it for a TAA program's contribution to return is a double misreading: wrong statistic (variance, not level) and wrong attribution (policy, not tactical decisions). Ibbotson & Kaplan (2000) is the standard correction to cite instead.

P17 (timed, integrated). You are designing two mandates: Bharat's, where the binding constraint (a 50% cap) cost 4.2% of Sharpe ratio, and Northfield's, where the binding constraint (a 20% Alts cap) cost 1.2%. If a trustee at each institution asked you to loosen one constraint by ten points to recover some of that cost, which mandate's case is stronger, and why?

Solution. Bharat's case is the stronger one to make: the larger Sharpe cost (4.2% vs 1.2%) directly reflects how much diversification value the capped sleeve (Debt) was contributing in the unconstrained solution, so loosening Bharat's cap recovers more efficiency per point of relaxation than loosening Northfield's would. The trade a trustee is actually making, in both cases, is that Sharpe-ratio cost against whatever policy reason (concentration risk, illiquidity) motivated the cap in the first place, a decision this node can price for them, not make for them.

P18 (integrated, vehicle and investor type). A taxable Indian family office with a perpetual horizon, a ₹40 crore portfolio, a 3.5% annual spending draw and a large low-basis holding in one listed company asks you to implement §7's strategic asset allocation. Name the vehicle you would use for the domestic equity sleeve and the one you would use for the debt sleeve, and say which of the five constraints decides each choice.

Solution. Equity: a separately managed account, because the binding constraint is tax and the family's concentrated low-basis position makes security-level control valuable. Direct ownership lets the manager hold the existing position inside the sleeve rather than selling it, harvest losses at the individual-security level against the eventual gain on it, and set an exclusion around the concentrated name so the sleeve does not double the family's exposure. An index fund can do none of those, and its lower headline fee is the wrong comparison. Debt: a low-cost pooled fund or exchange-traded fund, because the binding constraint is liquidity against the 3.5% draw and there is no tax control worth paying for in a sleeve whose return is mostly accrual. The general rule the two answers share is that the wrapper should be chosen by which constraint binds in that sleeve, not by the fee schedule read across sleeves. PW1.01 prices the tax control; AA1.08 prices the tracking difference on the pooled route.


Applied mini-project: build, constrain, and stress-test your own frontier

Budget ~3.5 hours. This project is the whole node compressed into one deliverable: your own multi-asset frontier, built, constrained, allocated, tilted, and stress-tested, in Python you wrote and ran yourself.

Step 1, choose your menu and source your inputs (~45 min). Pick three or four asset classes for either India, the US, or another market you know, reuse this node's menus if you prefer, or choose your own. For each asset, get an expected return, a volatility, and pairwise correlations, and label every figure honestly: either a real, cited number (a published institutional CMA set: J.P. Morgan, BlackRock, Vanguard, or your own build from M3.02's historical/implied-ERP toolkit for the equity leg and a current yield-to-maturity for the bond leg), or your own explicitly stated illustrative estimate. Do not present an invented number as if it were sourced.

Step 2, validate before you optimize (~20 min). Assemble Σ from your (σ, ρ) inputs. Run the positive-semi-definite check (numpy.linalg.eigvalsh) before computing a single frontier point. If it fails, diagnose and fix the offending correlation(s) before continuing.

Step 3, the unconstrained core (~30 min). Compute the GMV portfolio and verify its first-order condition (Σw should be a constant vector) to at least three decimal places. Compute the unconstrained tangency portfolio at a risk-free rate you can defend (currency-matched, cleaned per M3.02/M3.03 if applicable).

Step 4, constrain it like a real mandate (~35 min). Add at least one realistic institutional bound, long-only at minimum, plus either a single-asset cap or an illiquidity cap on your riskiest/least-liquid sleeve. Recompute the constrained tangency portfolio and quantify the Sharpe-ratio cost of your constraint versus the unconstrained optimum, the way Worked Example 3 and Practice Set item P9 do.

Step 5, set an SAA and apply a TAA tilt (~40 min). Define, in one sentence, a hypothetical investor's risk tolerance or return requirement (this stands in for PW1.01's IPS machinery). Locate the closest point on your constrained frontier and call it your SAA. Propose one tactical tilt, with a one-paragraph rationale (a valuation, momentum, or macro view), within a stated band (e.g., ±5pp). Recompute E(R), σ, and Sharpe, and state honestly, the way Worked Example 5 does, whether the tilt improved risk-adjusted return.

Step 6, run the sensitivity stress test yourself (~30 min). Perturb one expected-return assumption by an amount no larger than your own honest estimate of that input's uncertainty. Report how much your tangency (or SAA) weights move. If very little moves, say so plainly and try a second, more collinear pair of assets before concluding your case is unusually robust, a "nothing moved" finding, honestly reported, is a completely valid and useful result.

Step 7: write the memo (~20 min). In 400 words or fewer: your CMAs and their sources/labels; your SAA and its rationale; your tilt and its honest assessment; your sensitivity finding; and one paragraph on what this exercise implies for how much you should trust a single "optimal allocation" from any tool, including an AI one.

Scoring rubric. Self-score honestly; a criterion earns 2 points only if it is complete, correct, and honestly labeled.

#Criterion0 points1 point2 points
1CMA sourcing & labelingNo sourcing; figures presented as fact with no basisSome figures cited, others unlabeledEvery figure clearly marked real-and-cited or illustrative-and-stated
2PSD validationNot runRun but not reported or not understoodRun, reported, and (if it ever failed) correctly diagnosed
3GMV + first-order conditionGMV not computedGMV computed, FOC not checkedGMV computed and FOC verified to ≥3 decimals
4Unconstrained tangencyNot computed or materially wrongComputed with an errorComputed correctly, with a currency-matched Rf
5Constrained tangency + Sharpe costNot attemptedConstrained but cost not quantifiedConstrained, with the Sharpe-ratio cost explicitly computed and interpreted
6SAA + honest TAA assessmentNeither setSAA set, tilt not honestly assessed (direction only)SAA set with a stated rationale; tilt judged on risk-adjusted terms, honestly
7Sensitivity stress testNot runRun, result not interpretedRun and interpreted, including a "nothing moved" finding if that is what happened
8Memo & final judgmentMissing or purely descriptivePresent but avoids the trust questionPresent, with a genuine, specific answer to how much a single tool output should be trusted

Pass: ≥ 12/16, with no criterion at 0.


Reading & resources

Core (do these).

  • Markowitz, H. (1952), "Portfolio Selection," The Journal of Finance, the original paper; short, and worth reading once in the founder's own words. [Free: widely available] [Advanced]
  • CFA Program Curriculum, Level III (the Asset Allocation readings (capital market expectations, MVO in practice, SAA versus TAA)) the canonical institutional treatment this node compresses into 18 hours. [Paid] [Intermediate]
  • Michaud, R. (1989), "The Markowitz Optimization Enigma: Is Optimized Optimal?" Financial Analysts Journal, the original "estimation-error maximizer" critique. [Paid/library] [Advanced]
  • Best, M.J. & Grauer, R.R. (1991), "On the Sensitivity of Mean-Variance-Efficient Portfolios to Changes in Asset Means," Review of Financial Studies, the formal treatment behind Worked Example 6. [Paid/library] [Advanced]
  • Chopra, V.K. & Ziemba, W.T. (1993), "The Effect of Errors in Means, Variances, and Covariances on Optimal Portfolio Choice," Journal of Portfolio Management, the order-of-magnitude finding cited throughout §9. [Paid/library] [Advanced]
  • Ibbotson, R. & Kaplan, P. (2000), "Does Asset Allocation Policy Explain 40, 90, or 100 Percent of Performance?" Financial Analysts Journal: corrects the Brinson-Hood-Beebower misreading (§8). [Free/library] [Intermediate]
  • Swensen, D. (2009), Pioneering Portfolio Management (revised ed.), the Yale/endowment model in full; excellent on illiquidity, Alts, and a real institutional SAA process. [Paid] [Intermediate]

Going deeper.

  • Ang, A. (2014), Asset Management: A Systematic Approach to Factor Investing, a factor lens on SAA, TAA, and the Alts sleeve. [Paid] [Advanced]
  • Ilmanen, A. (2011), Expected Returns: already on your shelf since M3.02; re-read its asset-allocation chapters now with the MVO machinery in hand. [Paid] [Advanced]
  • Grinold, R. & Kahn, R., Active Portfolio Management, the deeper active-management and information-ratio framing that borders AA1.03's territory. [Paid] [Advanced]

Live data: building your own CMA table.

  • J.P. Morgan Asset Management, Long-Term Capital Market Assumptions (annual). [Free] [Intermediate]
  • BlackRock Investment Institute, Capital Market Assumptions (annual). [Free] [Intermediate]
  • Vanguard Capital Markets Model (VCMM) outlook (annual). [Free] [Intermediate]
  • Damodaran Online, the same implied-ERP and country-risk pages you used in M3.02 §4.11, reused here to build the equity leg of any CMA table yourself. [Free] [Intermediate]
  • FRED (fred.stlouisfed.org), a Treasury or bond-index yield series, for the US bond leg's forward-looking yield-to-maturity proxy. [Free] [Beginner]
  • RBI DBIE / CCIL, the INR government-bond leg. [Free] [Beginner]
  • NSE, AMFI, and India's listed REITs (Embassy Office Parks, Mindspace, Brookfield India REIT), for a real India REIT distribution-yield figure. [Free] [Intermediate]
  • scipy.optimize documentation, and PyPortfolioOpt (an open-source library implementing this node's math and considerably more), the direct code bridge to QD1.04. [Free] [Intermediate–Advanced]

Do this, not just read: build one real CMA table from live sources, run the PSD check, and compute your own GMV and tangency portfolios before you consider this node closed. A frontier you have only ever read about is not a frontier you can defend when a colleague, or a tool, hands you a different one.


Teach it back & journal

Feynman prompt. Explain to a colleague who has just been handed a spreadsheet Solver's "optimal portfolio": 24.51% here, 70.60% there, a short position over there, why they should not act on it before running one more calculation. Use the sentence "the optimizer is not lying to you, but it will never tell you how little of its confident answer survives a slightly different guess." Then show them, on paper or in a shared notebook, what happens to that same portfolio when you nudge one expected-return assumption by about one percentage point, including, if you can reproduce Worked Example 6's numbers, the moment a short position flips to a long one while the Sharpe ratio hardly moves. If your colleague can, unprompted, predict that the fix is not "use a better solver" but "check how much the answer moves before you trust it," you have installed this node's central lesson.

Journal prompt. Build one real capital-market-assumptions table this week (three or four asset classes, sourced honestly, PSD-checked) and run your own frontier, GMV, and tangency portfolio in Python. Then run the sensitivity check from Worked Example 6 on your own table: perturb one expected-return assumption by an amount no larger than your own honest estimate of its uncertainty, and record exactly how much your tangency weights move. Write a paragraph on three things: which single input in your table you are least confident about and why; what happened to your "optimal" weights when you perturbed it; and whether, before this exercise, you would have trusted a solver's single answer without asking that question. Close with one sentence on how this changes the way you will treat the next "optimal allocation" any tool (spreadsheet, robo-advisor, or AI assistant) ever hands you.


This module's flashcards and mastery quiz are wired into the app: see the node's Quiz and Reviews.

Advertisement

The gate

The module's flashcards and its quiz are in the app. The quiz is the gate: you need 85% to pass it, and the next module opens when you do.