2026/03/16The following values are given for Problems 10–12:
rf <- 0.05 # T-bill (risk-free) rate
rp <- 0.08 # S&P 500 risk premium (excess return over rf)
Er_sp <- rf + rp # Expected return on S&P 500 = 13%
sigma <- 0.20 # S&P 500 standard deviationTask: Calculate expected return and variance for portfolios with varying weights in T-bills (\(W_{bills}\)) and the S&P 500 index (\(W_{index}\)).
Formulas:
\[E(r_P) = W_{bills} \cdot r_f + W_{index} \cdot E(r_{S\&P})\]
\[\sigma_P^2 = (W_{index})^2 \cdot \sigma_{S\&P}^2\]
# Portfolio weights
W_bills <- c(0.0, 0.2, 0.4, 0.6, 0.8, 1.0)
W_index <- 1 - W_bills
# Expected return and variance
E_r <- W_bills * rf + W_index * Er_sp
Var <- (W_index * sigma)^2
SD <- sqrt(Var)
prob10 <- data.frame(
W_bills = W_bills,
W_index = W_index,
E_r = round(E_r, 4),
Variance = round(Var, 4),
Std_Dev = round(SD, 4)
)
kable(prob10,
col.names = c("W_bills", "W_index", "E(r)", "Variance (σ²)", "Std Dev (σ)"),
caption = "Problem 10 – Portfolio Expected Return and Variance") %>%
kable_styling(bootstrap_options = c("striped","hover","condensed"), full_width = FALSE)| 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 |
Key insight: As we shift weight from T-bills to the S&P 500, both expected return and risk increase linearly (standard deviation increases linearly because only one risky asset is present).
Task: Calculate utility for each portfolio in Problem 10 with risk aversion coefficient A = 2.
Utility formula:
\[U = E(r) - \frac{1}{2} A \sigma^2\]
A2 <- 2
U_A2 <- E_r - 0.5 * A2 * Var
prob11 <- cbind(prob10[, 1:4], U_A2 = round(U_A2, 4))
kable(prob11,
col.names = c("W_bills", "W_index", "E(r)", "Variance (σ²)", "Utility (A=2)"),
caption = "Problem 11 – Utility Levels (A = 2)") %>%
kable_styling(bootstrap_options = c("striped","hover","condensed"), full_width = FALSE) %>%
row_spec(which.max(U_A2), bold = TRUE, background = "#d4edda")| 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 |
plot(W_index, U_A2,
type = "b", pch = 19, col = "steelblue",
xlab = "W_index (weight in S&P 500)",
ylab = "Utility",
main = "Problem 11: Utility vs. Portfolio Weight (A = 2)")
abline(v = W_index[which.max(U_A2)], col = "red", lty = 2)
legend("topright", legend = paste("Max utility at W_index =", W_index[which.max(U_A2)]),
col = "red", lty = 2, bty = "n")Conclusion (A = 2): The maximum utility of 0.09 is achieved at \(W_{index}\) = 1 (i.e., 100% invested in the S&P 500, 0% in T-bills). A less risk-averse investor (A = 2) is willing to take on full market exposure.
Task: Repeat Problem 11 with A = 3.
A3 <- 3
U_A3 <- E_r - 0.5 * A3 * Var
prob12 <- cbind(prob10[, 1:4], U_A3 = round(U_A3, 4))
kable(prob12,
col.names = c("W_bills", "W_index", "E(r)", "Variance (σ²)", "Utility (A=3)"),
caption = "Problem 12 – Utility Levels (A = 3)") %>%
kable_styling(bootstrap_options = c("striped","hover","condensed"), full_width = FALSE) %>%
row_spec(which.max(U_A3), bold = TRUE, background = "#d4edda")| 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 |
plot(W_index, U_A3,
type = "b", pch = 19, col = "darkorange",
xlab = "W_index (weight in S&P 500)",
ylab = "Utility",
main = "Problem 12: Utility vs. Portfolio Weight (A = 3)")
abline(v = W_index[which.max(U_A3)], col = "red", lty = 2)
legend("topright", legend = paste("Max utility at W_index =", W_index[which.max(U_A3)]),
col = "red", lty = 2, bty = "n")Conclusion (A = 3): The maximum utility of 0.0764 is again achieved at \(W_{index}\) = 0.6. With only the six discrete portfolios given, the 100% equity portfolio still dominates. However, note that the utility values are lower than under A = 2 for the risky portfolios — a more risk-averse investor penalizes variance more heavily. The optimal continuous weight formula is:
\[W^*_{index} = \frac{E(r_P) - r_f}{A \cdot \sigma^2}\]
W_opt_A2 <- rp / (A2 * sigma^2)
W_opt_A3 <- rp / (A3 * sigma^2)
cat(sprintf("Optimal W_index (A=2): %.4f (%.1f%%)\n", W_opt_A2, W_opt_A2*100))## Optimal W_index (A=2): 1.0000 (100.0%)
## Optimal W_index (A=3): 0.6667 (66.7%)
With continuous allocation, a more risk-averse investor (A = 3) would optimally hold 66.7% in the S&P 500, compared to 100% for A = 2. Higher risk aversion → lower optimal risky asset weight.
cfa <- 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)
)
kable(cfa, col.names = c("Investment", "E(r)", "σ"),
caption = "CFA Utility Formula Data") %>%
kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE)| Investment | E(r) | σ |
|---|---|---|
| 1 | 0.12 | 0.30 |
| 2 | 0.15 | 0.50 |
| 3 | 0.21 | 0.16 |
| 4 | 0.24 | 0.21 |
Utility formula: \(U = E(r) - \frac{1}{2} A \sigma^2\)
Which investment maximizes utility for A = 4?
A_cfa <- 4
cfa$U_A4 <- cfa$E_r - 0.5 * A_cfa * cfa$sigma^2
kable(cfa, col.names = c("Investment", "E(r)", "σ", "Utility (A=4)"),
caption = "CFA Problem 1 – Utility with A = 4") %>%
kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE) %>%
row_spec(which.max(cfa$U_A4), bold = TRUE, background = "#d4edda")| Investment | E(r) | σ | Utility (A=4) |
|---|---|---|---|
| 1 | 0.12 | 0.30 | -0.0600 |
| 2 | 0.15 | 0.50 | -0.3500 |
| 3 | 0.21 | 0.16 | 0.1588 |
| 4 | 0.24 | 0.21 | 0.1518 |
Answer: Investment 3 has the highest utility (U = 0.1588) for a risk-averse investor with A = 4. Investment 3 has a relatively high expected return (21%) with the lowest standard deviation (16%), making it attractive after penalizing variance.
Which investment maximizes utility if the investor is risk neutral?
A risk-neutral investor has A = 0, so the utility formula reduces to:
\[U = E(r) - \frac{1}{2}(0)\sigma^2 = E(r)\]
cfa$U_A0 <- cfa$E_r - 0.5 * 0 * cfa$sigma^2 # = E(r)
kable(cfa[, c("Investment","E_r","sigma","U_A0")],
col.names = c("Investment", "E(r)", "σ", "Utility (A=0)"),
caption = "CFA Problem 2 – Utility with A = 0 (Risk Neutral)") %>%
kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE) %>%
row_spec(which.max(cfa$U_A0), bold = TRUE, background = "#d4edda")| Investment | E(r) | σ | Utility (A=0) |
|---|---|---|---|
| 1 | 0.12 | 0.30 | 0.12 |
| 2 | 0.15 | 0.50 | 0.15 |
| 3 | 0.21 | 0.16 | 0.21 |
| 4 | 0.24 | 0.21 | 0.24 |
Answer: A risk-neutral investor ignores variance entirely and selects the investment with the highest expected return — Investment 4 with E(r) = 24%.
The correct answer is (b) Investor’s aversion to risk.
Explanation: In the mean-variance utility function \(U = E(r) - \frac{1}{2}A\sigma^2\), the parameter \(A\) is the risk-aversion coefficient. It scales the penalty applied to portfolio variance:
The other options are incorrect: - (a) is wrong — return requirements are captured by \(E(r)\), not \(A\). - (c) is wrong — the certainty equivalent rate is the utility value \(U\) itself, not \(A\). - (d) is wrong — \(A\) does not describe a “one unit of return per four units of risk” trade-off; that is a misreading of the \(\frac{1}{2}\) scaling constant.
summary_df <- data.frame(
Problem = c("10","11","12","CFA 1","CFA 2","CFA 3"),
Answer = c(
"See table: E(r) ranges 5%–13%; Var ranges 0–0.04",
paste0("Max utility at W_index = 1.0 (U = ", round(max(U_A2),4), ")"),
paste0("Max utility at W_index = 1.0 (U = ", round(max(U_A3),4), "); optimal continuous weight = ", round(W_opt_A3*100,1), "%"),
"Investment 3 (U = 0.1572)",
"Investment 4 (highest E(r) = 24%)",
"b. Investor's aversion to risk"
)
)
kable(summary_df, caption = "Summary of Answers") %>%
kable_styling(bootstrap_options = c("striped","hover"), full_width = TRUE)| Problem | Answer |
|---|---|
| 10 | See table: E(r) ranges 5%–13%; Var ranges 0–0.04 |
| 11 | Max utility at W_index = 1.0 (U = 0.09) |
| 12 | Max utility at W_index = 1.0 (U = 0.0764); optimal continuous weight = 66.7% |
| CFA 1 | Investment 3 (U = 0.1572) |
| CFA 2 | Investment 4 (highest E(r) = 24%) |
| CFA 3 |
|