Setup & Assumptions

Given:

  • S&P 500 average excess return over T-bills: 8% per year
  • S&P 500 standard deviation: σ = 20% per year
  • Current T-bill (risk-free) rate: r_f = 5%
  • Therefore: E(r_index) = 5% + 8% = 13%
  • Utility formula: U = E(r) − ½ × A × σ²
rf          <- 0.05   # risk-free rate (T-bill)
rp          <- 0.08   # equity risk premium
er_index    <- rf + rp  # expected return on S&P 500 = 0.13
sigma_index <- 0.20   # standard deviation of S&P 500

Problem 10 – Expected Return & Variance of Mixed Portfolios

For a portfolio with weight w in the S&P 500 and (1 - w) in T-bills:

  • E(r_p) = w_bills × r_f + w_index × E(r_index)
  • σ_p = w_index × σ_index (T-bills have zero variance)
  • Var_p = σ_p²
w_bills <- c(0.0, 0.2, 0.4, 0.6, 0.8, 1.0)
w_index <- 1 - w_bills

Er_p    <- w_bills * rf + w_index * er_index
sigma_p <- w_index * sigma_index
var_p   <- sigma_p^2

p10 <- data.frame(
  W_bills    = w_bills,
  W_index    = w_index,
  E_r_p      = round(Er_p,   4),
  Sigma_p    = round(sigma_p, 4),
  Variance   = round(var_p,  4)
)

kable(p10,
      col.names = c("W_bills", "W_index", "E(r_p)", "σ_p", "Variance σ²"),
      caption   = "Problem 10: Portfolio Expected Returns and Variances",
      align     = "ccccc")
Problem 10: Portfolio Expected Returns and Variances
W_bills W_index E(r_p) σ_p Variance σ²
0.0 1.0 0.130 0.20 0.0400
0.2 0.8 0.114 0.16 0.0256
0.4 0.6 0.098 0.12 0.0144
0.6 0.4 0.082 0.08 0.0064
0.8 0.2 0.066 0.04 0.0016
1.0 0.0 0.050 0.00 0.0000
ggplot(p10, aes(x = Sigma_p * 100, y = E_r_p * 100)) +
  geom_line(color = "#2C7BB6", linewidth = 1.2) +
  geom_point(color = "#D7191C", size = 3) +
  geom_text(aes(label = paste0("W=", W_index)),
            vjust = -0.8, size = 3.2, color = "gray30") +
  labs(
    title    = "Problem 10: Capital Allocation Line (CAL)",
    subtitle = "Risk–Return Tradeoff between T-bills and S&P 500",
    x        = "Portfolio Standard Deviation σ_p (%)",
    y        = "Expected Return E(r_p) (%)"
  ) +
  theme_minimal(base_size = 13) +
  theme(plot.title    = element_text(face = "bold"),
        plot.subtitle = element_text(color = "gray40"))


Problem 11 – Utility Levels with A = 2

\[U = E(r) - \frac{1}{2} \times A \times \sigma^2 = E(r) - \sigma^2 \quad (A = 2)\]

A2 <- 2
U_A2 <- Er_p - 0.5 * A2 * var_p

p11 <- data.frame(
  W_bills  = w_bills,
  W_index  = w_index,
  E_r_p    = round(Er_p,  4),
  Variance = round(var_p, 4),
  Utility  = round(U_A2,  4)
)

kable(p11,
      col.names = c("W_bills", "W_index", "E(r_p)", "Variance σ²", "Utility (A=2)"),
      caption   = "Problem 11: Utility Levels with A = 2",
      align     = "ccccc")
Problem 11: Utility Levels with A = 2
W_bills W_index E(r_p) 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 <- p11[which.max(p11$Utility), ]
cat("Optimal portfolio (A = 2):\n")
## Optimal portfolio (A = 2):
cat(sprintf("  W_bills = %.1f,  W_index = %.1f\n",
            best11$W_bills, best11$W_index))
##   W_bills = 0.0,  W_index = 1.0
cat(sprintf("  E(r_p)  = %.2f%%,  Utility = %.4f\n",
            best11$E_r_p * 100, best11$Utility))
##   E(r_p)  = 13.00%,  Utility = 0.0900
ggplot(p11, aes(x = W_index, y = Utility)) +
  geom_line(color = "#1A9641", linewidth = 1.2) +
  geom_point(color = "#D7191C", size = 3) +
  geom_point(data = best11, aes(x = W_index, y = Utility),
             color = "gold", size = 5, shape = 8, stroke = 2) +
  annotate("text", x = best11$W_index, y = best11$Utility,
           label = paste0("Max U = ", round(best11$Utility, 4)),
           vjust = -1.2, color = "gray20", size = 3.5) +
  labs(
    title    = "Problem 11: Utility vs. Equity Weight (A = 2)",
    subtitle = "★ = Maximum utility portfolio",
    x        = "Weight in S&P 500 (W_index)",
    y        = "Utility U"
  ) +
  theme_minimal(base_size = 13) +
  theme(plot.title    = element_text(face = "bold"),
        plot.subtitle = element_text(color = "gray40"))

Conclusion (A = 2): The investor should hold 100% S&P 500. With only moderate risk aversion, the equity risk premium (8%) outweighs the utility penalty from variance, so utility increases monotonically with equity allocation.


Problem 12 – Utility Levels with A = 3

\[U = E(r) - \frac{1}{2} \times 3 \times \sigma^2 = E(r) - 1.5\sigma^2 \quad (A = 3)\]

A3 <- 3
U_A3 <- Er_p - 0.5 * A3 * var_p

p12 <- data.frame(
  W_bills  = w_bills,
  W_index  = w_index,
  E_r_p    = round(Er_p,  4),
  Variance = round(var_p, 4),
  Utility  = round(U_A3,  4)
)

kable(p12,
      col.names = c("W_bills", "W_index", "E(r_p)", "Variance σ²", "Utility (A=3)"),
      caption   = "Problem 12: Utility Levels with A = 3",
      align     = "ccccc")
Problem 12: Utility Levels with A = 3
W_bills W_index E(r_p) 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 <- p12[which.max(p12$Utility), ]
cat("Optimal portfolio (A = 3):\n")
## Optimal portfolio (A = 3):
cat(sprintf("  W_bills = %.1f,  W_index = %.1f\n",
            best12$W_bills, best12$W_index))
##   W_bills = 0.4,  W_index = 0.6
cat(sprintf("  E(r_p)  = %.2f%%,  Utility = %.4f\n",
            best12$E_r_p * 100, best12$Utility))
##   E(r_p)  = 9.80%,  Utility = 0.0764
# Combined comparison chart A=2 vs A=3
df_combined <- data.frame(
  W_index = rep(w_index, 2),
  Utility = c(U_A2, U_A3),
  Investor = rep(c("A = 2 (Moderate)", "A = 3 (More Risk-Averse)"), each = 6)
)

ggplot(df_combined, aes(x = W_index, y = Utility, color = Investor)) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 3) +
  scale_color_manual(values = c("#1A9641", "#D7191C")) +
  labs(
    title    = "Problems 11 & 12: Utility vs. Equity Weight (A = 2 vs A = 3)",
    subtitle = "Higher risk aversion shifts the optimal portfolio toward T-bills",
    x        = "Weight in S&P 500 (W_index)",
    y        = "Utility U",
    color    = "Investor Type"
  ) +
  theme_minimal(base_size = 13) +
  theme(plot.title    = element_text(face = "bold"),
        plot.subtitle = element_text(color = "gray40"),
        legend.position = "bottom")

Conclusion (A = 3): The optimal portfolio shifts to 40% T-bills / 60% S&P 500. As risk aversion rises from 2 to 3, variance is penalized more heavily, so the investor prefers to sacrifice some expected return for lower risk.


CFA Problem 1 – Risk Averse with A = 4

\[U = E(r) - \frac{1}{2} \times 4 \times \sigma^2 = E(r) - 2\sigma^2\]

inv <- 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
inv$Variance <- inv$sigma^2
inv$Utility  <- round(inv$E_r - 0.5 * A_cfa * inv$Variance, 4)

kable(inv,
      col.names = c("Investment", "E(r)", "σ", "σ²", "U (A=4)"),
      caption   = "CFA Problem 1: Utility with A = 4",
      align     = "ccccc")
CFA Problem 1: Utility with A = 4
Investment E(r) σ σ² U (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 <- inv[which.max(inv$Utility), ]
cat(sprintf("Best investment for A = 4: Investment %d\n", best_cfa1$Investment))
## Best investment for A = 4: Investment 3
cat(sprintf("  E(r) = %.2f%%,  σ = %.0f%%,  U = %.4f\n",
            best_cfa1$E_r * 100, best_cfa1$sigma * 100, best_cfa1$Utility))
##   E(r) = 21.00%,  σ = 16%,  U = 0.1588

Answer: Investment 3 — highest utility of 0.1588. Despite not having the highest expected return, Investment 3’s low standard deviation (16%) makes it the most attractive once risk is penalized with A = 4.


CFA Problem 2 – Risk Neutral Investor

A risk-neutral investor has A = 0, so:

\[U = E(r) - \frac{1}{2} \times 0 \times \sigma^2 = E(r)\]

Risk is completely ignored; only expected return matters.

inv$Utility_A0 <- inv$E_r

kable(inv[, c("Investment", "E_r", "Utility_A0")],
      col.names = c("Investment", "E(r)", "U (A=0)"),
      caption   = "CFA Problem 2: Utility for Risk-Neutral Investor (A = 0)",
      align     = "ccc")
CFA Problem 2: Utility for Risk-Neutral Investor (A = 0)
Investment E(r) U (A=0)
1 0.12 0.12
2 0.15 0.15
3 0.21 0.21
4 0.24 0.24
best_cfa2 <- inv[which.max(inv$Utility_A0), ]
cat(sprintf("Best investment for risk-neutral investor: Investment %d\n",
            best_cfa2$Investment))
## Best investment for risk-neutral investor: Investment 4
cat(sprintf("  E(r) = %.2f%%\n", best_cfa2$E_r * 100))
##   E(r) = 24.00%

Answer: Investment 4 — highest expected return of 24%.


CFA Problem 3 – What Does A Represent?

The utility function is:

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

The choices are:

    1. Investor’s return requirement
  • b. Investor’s aversion to risk
    1. Certainty equivalent rate of the portfolio
    1. Preference for one unit of return per four units of risk

Answer: b. Investor’s aversion to risk.

A is the risk-aversion coefficient. A larger value of A means the investor assigns a greater penalty to variance (risk) when computing utility. Specifically:

  • A = 0: Risk neutral — indifferent to variance, maximizes only expected return.
  • A > 0: Risk averse — accepts lower expected return in exchange for less variance.
  • A < 0: Risk seeking — willingly accepts lower expected return for more variance.
# Illustrate how A shapes utility across different portfolios
A_values <- c(0, 1, 2, 3, 4, 5)
w_seq    <- seq(0, 1, by = 0.01)
Er_seq   <- w_seq * er_index + (1 - w_seq) * rf
var_seq  <- (w_seq * sigma_index)^2

utility_df <- do.call(rbind, lapply(A_values, function(a) {
  data.frame(
    W_index  = w_seq,
    Utility  = Er_seq - 0.5 * a * var_seq,
    A        = factor(paste0("A = ", a))
  )
}))

ggplot(utility_df, aes(x = W_index, y = Utility, color = A)) +
  geom_line(linewidth = 0.9) +
  labs(
    title    = "CFA Problem 3: Effect of Risk-Aversion Coefficient A",
    subtitle = "Higher A → steeper penalty on variance → less equity preferred",
    x        = "Weight in S&P 500 (W_index)",
    y        = "Utility U",
    color    = "Risk Aversion"
  ) +
  theme_minimal(base_size = 13) +
  theme(plot.title    = element_text(face = "bold"),
        plot.subtitle = element_text(color = "gray40"),
        legend.position = "right")


Summary Table

summary_df <- data.frame(
  Question     = c("Prob 10", "Prob 11 (A=2)", "Prob 12 (A=3)",
                   "CFA 1 (A=4)", "CFA 2 (A=0)", "CFA 3"),
  Answer       = c(
    "See table: E(r_p) ranges 5%–13%, Var ranges 0–0.04",
    "Optimal: 100% S&P 500 (W_index=1.0), U = 0.09",
    "Optimal: 40% T-bills / 60% S&P 500, U = 0.0764",
    "Investment 3 (E(r)=21%, σ=16%), U = 0.1588",
    "Investment 4 (E(r)=24%), U = 0.24",
    "b. Investor's aversion to risk"
  )
)

kable(summary_df,
      col.names = c("Question", "Answer"),
      caption   = "Homework 3 – Summary of Answers",
      align     = "ll")
Homework 3 – Summary of Answers
Question Answer
Prob 10 See table: E(r_p) ranges 5%–13%, Var ranges 0–0.04
Prob 11 (A=2) Optimal: 100% S&P 500 (W_index=1.0), U = 0.09
Prob 12 (A=3) Optimal: 40% T-bills / 60% S&P 500, U = 0.0764
CFA 1 (A=4) Investment 3 (E(r)=21%, σ=16%), U = 0.1588
CFA 2 (A=0) Investment 4 (E(r)=24%), U = 0.24
CFA 3 b. Investor’s aversion to risk