Level 3 — ProductionPortfolio Theory

Portfolio Theory

45 minutes60 marksprintable — key stays hidden on paper

Time limit: 45 minutes Total marks: 60 Instructions: Show all derivations from first principles. Where code is asked, write it from memory. Use ...... notation for math.


Q1. Two-asset variance from scratch (10 marks) Starting only from the definition of portfolio return Rp=wARA+wBRBR_p = w_A R_A + w_B R_B, derive the formula for portfolio variance σp2\sigma_p^2 in terms of wA,wB,σA,σBw_A, w_B, \sigma_A, \sigma_B and the correlation ρAB\rho_{AB}. Then, using σA=20%\sigma_A = 20\%, σB=30%\sigma_B = 30\%, ρAB=0.2\rho_{AB} = 0.2, wA=wB=0.5w_A = w_B = 0.5, compute σp\sigma_p. Explain in one sentence why σp\sigma_p is less than the weighted-average of the individual standard deviations.

Q2. Minimum-variance weight derivation (10 marks) For two risky assets, derive the weight wAw_A^* that minimizes portfolio variance. Then compute wAw_A^* for the numbers in Q1. Comment on whether short-selling is required.

Q3. CAPM & Security Market Line (12 marks) (a) State the CAPM equation and define every term. (4) (b) A stock has β=1.4\beta = 1.4. The risk-free rate is 4%4\% and the expected market return is 10%10\%. Compute the required return. (3) (c) The stock is actually expected to return 14%14\%. Compute its alpha and state whether it lies above or below the SML. (3) (d) Explain out loud (in writing) why only systematic risk is priced in CAPM. (2)

Q4. Performance ratios (12 marks) A fund returned 12%12\% with volatility 18%18\%; its downside deviation is 10%10\% and its beta is 0.90.9. The risk-free rate is 3%3\%. (a) Compute the Sharpe, Sortino, and Treynor ratios. (6) (b) Explain the difference in what Sortino and Treynor measure vs Sharpe. (4) (c) Which ratio would you prefer to compare two funds within the same well-diversified portfolio, and why? (2)

Q5. Code from memory (10 marks) Write a Python function (NumPy) portfolio_stats(weights, mean_returns, cov_matrix, rf) that returns the annualized portfolio expected return, standard deviation, and Sharpe ratio. Assume inputs are already annualized. Comment each line.

Q6. Systematic vs unsystematic risk / diversification (6 marks) Explain how total risk decomposes into systematic and unsystematic components. Sketch (describe) how portfolio risk behaves as the number of holdings NN increases, and state the limiting value.

Answer keyMark scheme & solutions

Q1 (10 marks)

Derivation (5): σp2=Var(wARA+wBRB)\sigma_p^2 = \mathrm{Var}(w_A R_A + w_B R_B) =wA2Var(RA)+wB2Var(RB)+2wAwBCov(RA,RB)= w_A^2\mathrm{Var}(R_A) + w_B^2\mathrm{Var}(R_B) + 2w_A w_B\mathrm{Cov}(R_A,R_B) (bilinearity of variance) (3) =wA2σA2+wB2σB2+2wAwBρABσAσB= w_A^2\sigma_A^2 + w_B^2\sigma_B^2 + 2w_A w_B\rho_{AB}\sigma_A\sigma_B (since Cov=ρσAσB\mathrm{Cov}=\rho\sigma_A\sigma_B) (2)

Computation (4): =0.25(0.04)+0.25(0.09)+2(0.5)(0.5)(0.2)(0.2)(0.3)= 0.25(0.04) + 0.25(0.09) + 2(0.5)(0.5)(0.2)(0.2)(0.3) =0.01+0.0225+0.006=0.0385= 0.01 + 0.0225 + 0.006 = 0.0385 σp=0.0385=0.19621=19.62%\sigma_p = \sqrt{0.0385} = 0.19621 = 19.62\% (4)

Explanation (1): Because ρAB<1\rho_{AB} < 1, the covariance term is smaller than the cross term of a perfect correlation, so imperfect correlation cancels part of the risk — diversification benefit. Weighted-average SD =0.5(20)+0.5(30)=25%>19.62%= 0.5(20)+0.5(30)=25\% > 19.62\%.

Q2 (10 marks)

Derivation (6): Set wB=1wAw_B = 1-w_A, differentiate σp2\sigma_p^2 w.r.t. wAw_A, set to 0: wA=σB2ρABσAσBσA2+σB22ρABσAσBw_A^* = \frac{\sigma_B^2 - \rho_{AB}\sigma_A\sigma_B}{\sigma_A^2 + \sigma_B^2 - 2\rho_{AB}\sigma_A\sigma_B} Computation (3): Numerator =0.090.2(0.2)(0.3)=0.090.012=0.078= 0.09 - 0.2(0.2)(0.3) = 0.09 - 0.012 = 0.078 Denominator =0.04+0.092(0.012)=0.130.024=0.106= 0.04 + 0.09 - 2(0.012) = 0.13 - 0.024 = 0.106 wA=0.078/0.106=0.7358=73.58%w_A^* = 0.078/0.106 = 0.7358 = 73.58\% (so wB=26.42%w_B^*=26.42\%). Comment (1): Both weights positive → no short-selling required.

Q3 (12 marks)

(a) E(Ri)=Rf+βi(E(Rm)Rf)E(R_i) = R_f + \beta_i(E(R_m) - R_f); RfR_f=risk-free rate, βi\beta_i=sensitivity to market, E(Rm)E(R_m)=expected market return, (E(Rm)Rf)(E(R_m)-R_f)=market risk premium. (4) (b) 4%+1.4(10%4%)=4+1.4(6)=4+8.4=12.4%4\% + 1.4(10\%-4\%) = 4 + 1.4(6) = 4 + 8.4 = 12.4\% (3) (c) α=14%12.4%=1.6%\alpha = 14\% - 12.4\% = 1.6\%; positive alpha → lies above the SML (underpriced/outperforming). (3) (d) Unsystematic risk can be diversified away for free, so the market does not compensate investors for bearing it; only non-diversifiable (systematic/market) risk earns a premium. (2)

Q4 (12 marks)

(a) Excess return =12%3%=9%= 12\%-3\% = 9\%.

  • Sharpe =9/18=0.5= 9/18 = 0.5 (2)
  • Sortino =9/10=0.9= 9/10 = 0.9 (2)
  • Treynor =9%/0.9=10%= 9\%/0.9 = 10\% (or 0.10) (2)

(b) Sharpe uses total volatility (all risk); Sortino replaces the denominator with downside deviation, penalizing only harmful downside moves (better for asymmetric returns); Treynor uses beta, measuring reward per unit of systematic risk only. (4)

(c) Treynor — within a well-diversified portfolio unsystematic risk is already eliminated, so systematic risk (beta) is the relevant risk measure. (2)

Q5 (10 marks)

import numpy as np
def portfolio_stats(weights, mean_returns, cov_matrix, rf):
    w = np.array(weights)                       # weight vector
    ret = np.dot(w, mean_returns)               # expected portfolio return w·μ
    var = np.dot(w, np.dot(cov_matrix, w))      # variance wᵀΣw
    std = np.sqrt(var)                          # portfolio std dev
    sharpe = (ret - rf) / std                   # excess return per unit risk
    return ret, std, sharpe

Marks: correct return dot product (2), quadratic form for variance (3), sqrt (1), Sharpe (2), returns/structure (2).

Q6 (6 marks)

Total risk == systematic (market/undiversifiable) ++ unsystematic (specific/diversifiable) (2). As NN increases with roughly equal weights, unsystematic variance falls ~1/N1/N while covariance (systematic) terms dominate; risk declines steeply then flattens (2). Limiting value = average covariance = systematic risk floor; it cannot be diversified below that (2).

[
{"claim":"Q1 portfolio std = 0.19621","code":"var=0.25*0.04+0.25*0.09+2*0.5*0.5*0.2*0.2*0.3; result=abs(float(var)**0.5-0.19621)<1e-3"},
{"claim":"Q2 minvar weight = 0.7358","code":"num=0.09-0.2*0.2*0.3; den=0.04+0.09-2*0.2*0.2*0.3; result=abs(num/den-0.7358)<1e-3"},
{"claim":"Q3b required return = 12.4%","code":"r=4+1.4*(10-4); result=r==12.4"},
{"claim":"Q4 Sharpe=0.5, Sortino=0.9, Treynor=10","code":"result=(9/18==0.5) and (9/10==0.9) and (9/0.9==10.0)"}
]