Background

For Problems 10–12: Historical data shows that the S&P 500 portfolio has averaged roughly 8% more than the Treasury bill return over the past 90 years, and that the S&P 500 standard deviation has been about 20% per year. The current T-bill rate is 5%.

rf        <- 0.05   # Risk-free rate (T-bill)
rp        <- 0.08   # Equity risk premium
r_index   <- rf + rp  # Expected return on S&P 500 = 13%
sd_index  <- 0.20   # Standard deviation of S&P 500

cat("T-bill rate       :", rf * 100, "%\n")
## T-bill rate       : 5 %
cat("S&P 500 E(r)      :", r_index * 100, "%\n")
## S&P 500 E(r)      : 13 %
cat("S&P 500 Std Dev   :", sd_index * 100, "%\n")
## S&P 500 Std Dev   : 20 %

Problem 10 – Expected Return and Variance of Mixed Portfolios

For a portfolio split between T-bills and the S&P 500 index:

\[E(r_p) = w_{bills} \cdot r_f + w_{index} \cdot E(r_{index})\]

\[\sigma_p^2 = w_{index}^2 \cdot \sigma_{index}^2\]

library(knitr)

w_bills <- c(0, 0.2, 0.4, 0.6, 0.8, 1.0)
w_index <- 1 - w_bills

E_r   <- w_bills * rf + w_index * r_index
Var_p <- (w_index * sd_index)^2
SD_p  <- sqrt(Var_p)

results10 <- data.frame(
  W_bills  = w_bills,
  W_index  = w_index,
  E_return = round(E_r, 4),
  Variance = round(Var_p, 4),
  Std_Dev  = round(SD_p, 4)
)

kable(results10,
      col.names = c("W(bills)", "W(index)", "E(r)", "Variance (σ²)", "Std Dev (σ)"),
      caption   = "Problem 10: Portfolio Expected Return and Variance")
Problem 10: Portfolio Expected Return and Variance
W(bills) W(index) E(r) Variance (σ²) Std Dev (σ)
0.0 1.0 0.130 0.0400 0.20
0.2 0.8 0.114 0.0256 0.16
0.4 0.6 0.098 0.0144 0.12
0.6 0.4 0.082 0.0064 0.08
0.8 0.2 0.066 0.0016 0.04
1.0 0.0 0.050 0.0000 0.00
library(ggplot2)

ggplot(results10, aes(x = Std_Dev * 100, y = E_return * 100,
                      label = paste0("w=", W_index))) +
  geom_line(color = "steelblue", linewidth = 1) +
  geom_point(color = "steelblue", size = 3) +
  geom_text(vjust = -0.8, size = 3.5) +
  labs(title    = "Capital Allocation Line (CAL)",
       subtitle = "T-bills and S&P 500 Index",
       x = "Portfolio Standard Deviation (%)",
       y = "Expected Return (%)") +
  theme_minimal()
Capital Allocation Line

Capital Allocation Line


Problem 11 – Utility Levels with A = 2

\[U = E(r_p) - \frac{1}{2} A \sigma_p^2\]

A11 <- 2
U11 <- E_r - 0.5 * A11 * Var_p

results11 <- data.frame(
  W_bills  = w_bills,
  W_index  = w_index,
  E_return = round(E_r, 4),
  Variance = round(Var_p, 4),
  Utility  = round(U11, 4)
)

kable(results11,
      col.names = c("W(bills)", "W(index)", "E(r)", "Variance (σ²)", "Utility (A=2)"),
      caption   = "Problem 11: Utility Levels for A = 2")
Problem 11: Utility Levels for A = 2
W(bills) W(index) E(r) Variance (σ²) Utility (A=2)
0.0 1.0 0.130 0.0400 0.0900
0.2 0.8 0.114 0.0256 0.0884
0.4 0.6 0.098 0.0144 0.0836
0.6 0.4 0.082 0.0064 0.0756
0.8 0.2 0.066 0.0016 0.0644
1.0 0.0 0.050 0.0000 0.0500
best11 <- results11[which.max(results11$Utility), ]
cat("Highest utility (A=2): W(index) =", best11$W_index,
    "| Utility =", best11$Utility, "\n")
## Highest utility (A=2): W(index) = 1 | Utility = 0.09
ggplot(results11, aes(x = W_index, y = Utility)) +
  geom_line(color = "darkorange", linewidth = 1) +
  geom_point(color = "darkorange", size = 3) +
  geom_point(data = best11, aes(x = W_index, y = Utility),
             color = "red", size = 5, shape = 8) +
  labs(title    = "Utility vs S&P 500 Weight (A = 2)",
       subtitle = "★ = highest utility portfolio",
       x = "Weight in S&P 500", y = "Utility") +
  theme_minimal()
Utility vs Portfolio Weights (A=2)

Utility vs Portfolio Weights (A=2)

Conclusion: With A = 2 (lower risk aversion), the investor prefers a heavy equity tilt — maximum utility is achieved at 100% in the S&P 500.


Problem 12 – Utility Levels with A = 3

A12 <- 3
U12 <- E_r - 0.5 * A12 * Var_p

results12 <- data.frame(
  W_bills  = w_bills,
  W_index  = w_index,
  E_return = round(E_r, 4),
  Variance = round(Var_p, 4),
  Utility  = round(U12, 4)
)

kable(results12,
      col.names = c("W(bills)", "W(index)", "E(r)", "Variance (σ²)", "Utility (A=3)"),
      caption   = "Problem 12: Utility Levels for A = 3")
Problem 12: Utility Levels for A = 3
W(bills) W(index) E(r) Variance (σ²) Utility (A=3)
0.0 1.0 0.130 0.0400 0.0700
0.2 0.8 0.114 0.0256 0.0756
0.4 0.6 0.098 0.0144 0.0764
0.6 0.4 0.082 0.0064 0.0724
0.8 0.2 0.066 0.0016 0.0636
1.0 0.0 0.050 0.0000 0.0500
best12 <- results12[which.max(results12$Utility), ]
cat("Highest utility (A=3): W(index) =", best12$W_index,
    "| Utility =", best12$Utility, "\n")
## Highest utility (A=3): W(index) = 0.6 | Utility = 0.0764
library(tidyr)

compare <- data.frame(W_index = w_index,
                      A2 = round(U11, 4),
                      A3 = round(U12, 4))

compare_long <- pivot_longer(compare, cols = c(A2, A3),
                              names_to = "Investor", values_to = "Utility")

ggplot(compare_long, aes(x = W_index, y = Utility, color = Investor)) +
  geom_line(linewidth = 1) +
  geom_point(size = 3) +
  scale_color_manual(values = c("darkorange", "purple"),
                     labels = c("A = 2", "A = 3")) +
  labs(title = "Utility Comparison: A = 2 vs A = 3",
       x = "Weight in S&P 500", y = "Utility", color = "Risk Aversion") +
  theme_minimal()
Utility Comparison: A=2 vs A=3

Utility Comparison: A=2 vs A=3

Conclusion: With A = 3 (higher risk aversion), variance is penalised more heavily. Utility falls off more steeply at higher equity weights, so this investor should hold less equity than the A = 2 investor at the theoretically optimal continuous allocation.


CFA Problems 1–3

Data

investments <- data.frame(
  Investment = 1:4,
  E_r        = c(0.12, 0.15, 0.21, 0.24),
  Sigma      = c(0.30, 0.50, 0.16, 0.21)
)

A_cfa <- 4
investments$Variance <- investments$Sigma^2
investments$Utility  <- investments$E_r - 0.5 * A_cfa * investments$Variance

kable(investments,
      col.names = c("Investment", "E(r)", "σ", "σ²", "Utility (A=4)"),
      caption   = "CFA Utility Formula Data (A = 4)",
      digits    = 4)
CFA Utility Formula Data (A = 4)
Investment E(r) σ σ² Utility (A=4)
1 0.12 0.30 0.0900 -0.0600
2 0.15 0.50 0.2500 -0.3500
3 0.21 0.16 0.0256 0.1588
4 0.24 0.21 0.0441 0.1518

CFA Problem 1 – Risk Averse Investor (A = 4)

best_cfa1 <- investments[which.max(investments$Utility), ]
cat("Best investment (A=4): Investment", best_cfa1$Investment,
    "| Utility =", round(best_cfa1$Utility, 4), "\n")
## Best investment (A=4): Investment 3 | Utility = 0.1588

Answer: Investment 3 — it yields the highest utility (0.1588) after penalising for risk with A = 4.

CFA Problem 2 – Risk Neutral Investor (A = 0)

best_cfa2 <- investments[which.max(investments$E_r), ]
cat("Best investment (risk neutral): Investment", best_cfa2$Investment,
    "| E(r) =", best_cfa2$E_r, "\n")
## Best investment (risk neutral): Investment 4 | E(r) = 0.24

Answer: Investment 4 — a risk-neutral investor ignores variance and simply picks the highest expected return (24%).

CFA Problem 3 – The Variable A

Question: The variable (A) in the utility formula represents the: - a. Investor’s return requirement
- b. Investor’s aversion to risk ✓
- c. Certainty equivalent rate of the portfolio
- d. Preference for one unit of return per four units of risk

cat("Correct answer: (b) Investor's aversion to risk.\n")
## Correct answer: (b) Investor's aversion to risk.
cat("A penalises variance in U = E(r) - 0.5*A*sigma^2.\n")
## A penalises variance in U = E(r) - 0.5*A*sigma^2.
cat("Higher A => investor dislikes risk more => needs higher E(r) to accept same risk.\n")
## Higher A => investor dislikes risk more => needs higher E(r) to accept same risk.

Answer: (b) — A is the risk aversion coefficient. A higher A means the investor penalises variance more, demanding greater expected return as compensation for risk.