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 %
## S&P 500 E(r) : 13 %
## S&P 500 Std Dev : 20 %
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")| 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
\[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")| 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)
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.
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")| 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
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.
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)| 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 |
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.
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%).
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
## Correct answer: (b) Investor's aversion to risk.
## A penalises variance in U = E(r) - 0.5*A*sigma^2.
## 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.