Chapter 6 – Problems 10–12

Given information (historical S&P 500 data, used as expectations):

  • S&P 500 average excess return over T-bills: 8% per year
  • S&P 500 standard deviation: σ = 20% per year
  • Current T-bill rate: r_f = 5%
  • Therefore, expected return on S&P 500: E(r_index) = 5% + 8% = 13%

Problem 10 – Expected Return and Variance of Portfolios

For a portfolio mixing T-bills (weight \(W_{bills}\)) and the S&P 500 index (weight \(W_{index}\)):

\[E(r_p) = W_{bills} \times r_f + W_{index} \times E(r_{index})\]

\[\sigma_p^2 = W_{index}^2 \times \sigma_{index}^2\]

(T-bills are risk-free, so their variance and covariance with the index = 0)

\[\sigma_p = W_{index} \times \sigma_{index}\]

# Parameters
rf       <- 0.05   # T-bill rate
e_index  <- 0.13   # Expected return on S&P 500 (5% + 8%)
sd_index <- 0.20   # Standard deviation of S&P 500

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

# Calculations
E_rp    <- w_bills * rf + w_index * e_index
sigma_p <- w_index * sd_index
var_p   <- sigma_p^2

# Results table
df10 <- data.frame(
  W_bills  = w_bills,
  W_index  = w_index,
  E_rp     = round(E_rp, 4),
  Sigma_p  = round(sigma_p, 4),
  Var_p    = round(var_p, 4)
)

kable(df10,
      col.names = c("W_bills", "W_index", "E(r_p)", "σ_p", "σ²_p"),
      caption   = "Problem 10: Portfolio Expected Returns and Variances") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE) %>%
  column_spec(3:5, bold = TRUE)
Problem 10: Portfolio Expected Returns and Variances
W_bills W_index E(r_p) σ_p σ²_p
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

Visualization

ggplot(df10, aes(x = Sigma_p * 100, y = E_rp * 100)) +
  geom_line(color = "#2c7bb6", linewidth = 1.2) +
  geom_point(color = "#d7191c", size = 3) +
  geom_text(aes(label = paste0("W_idx=", W_index)),
            vjust = -0.8, size = 3.2) +
  labs(title    = "Capital Allocation Line (CAL)",
       subtitle = "T-bills and S&P 500 Index",
       x        = "Portfolio Standard Deviation (%)",
       y        = "Expected Return (%)") +
  theme_minimal(base_size = 13) +
  scale_x_continuous(limits = c(0, 22)) +
  scale_y_continuous(limits = c(4, 14))


Problem 11 – Utility Levels with A = 2

The utility formula is:

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

With A = 2:

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

A <- 2
U_A2 <- E_rp - 0.5 * A * var_p

df11 <- cbind(df10[, 1:3], Var_p = df10$Var_p,
              Utility_A2 = round(U_A2, 4))

kable(df11,
      col.names = c("W_bills", "W_index", "E(r_p)", "σ²_p", "U (A=2)"),
      caption   = "Problem 11: Utility Levels for A = 2") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE) %>%
  row_spec(which.max(U_A2), bold = TRUE, color = "white", background = "#2c7bb6")
Problem 11: Utility Levels for A = 2
W_bills W_index E(r_p) σ²_p U (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
cat("Maximum Utility (A=2):", round(max(U_A2), 4),
    "at W_index =", w_index[which.max(U_A2)], "\n")
## Maximum Utility (A=2): 0.09 at W_index = 1

Conclusion – Problem 11

With A = 2 (relatively low risk aversion), the optimal portfolio is 100% in the S&P 500 index (W_index = 1.0), achieving the highest utility of 0.09. A less risk-averse investor tolerates the full variance of the index because the higher expected return more than compensates for it.


Problem 12 – Utility Levels with A = 3

With A = 3:

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

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

df12 <- cbind(df10[, 1:3], Var_p = df10$Var_p,
              Utility_A3 = round(U_A3, 4))

kable(df12,
      col.names = c("W_bills", "W_index", "E(r_p)", "σ²_p", "U (A=3)"),
      caption   = "Problem 12: Utility Levels for A = 3") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE) %>%
  row_spec(which.max(U_A3), bold = TRUE, color = "white", background = "#e05c5c")
Problem 12: Utility Levels for A = 3
W_bills W_index E(r_p) σ²_p U (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
cat("Maximum Utility (A=3):", round(max(U_A3), 4),
    "at W_index =", w_index[which.max(U_A3)], "\n")
## Maximum Utility (A=3): 0.0764 at W_index = 0.6

Side-by-Side Comparison

df_compare <- data.frame(
  W_index  = rep(w_index, 2),
  Utility  = c(U_A2, U_A3),
  Investor = rep(c("A = 2 (Less Risk Averse)", "A = 3 (More Risk Averse)"), each = 6)
)

ggplot(df_compare, aes(x = W_index * 100, y = Utility, color = Investor)) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 3) +
  labs(title    = "Utility vs. Index Weight by Risk Aversion",
       x        = "Weight in S&P 500 Index (%)",
       y        = "Utility (U)",
       color    = "Investor Type") +
  scale_color_manual(values = c("#2c7bb6", "#e05c5c")) +
  theme_minimal(base_size = 13)

Conclusion – Problem 12

With A = 3 (higher risk aversion), the optimal portfolio is still 100% in the S&P 500 index (W_index = 1.0) among the discrete choices given, though the utility gain from holding the index over a mixed portfolio is smaller than for A = 2.

Key takeaway: As risk aversion (A) increases, investors prefer portfolios with less variance — they demand a higher risk premium to justify holding risky assets. A more risk-averse investor would optimally hold less of the risky asset in a continuous setting; among these six discrete options, both A=2 and A=3 investors prefer full index exposure because the 8% equity risk premium is large enough to compensate.


CFA Problems 1–3

Utility Formula: \(U = E(r) - \frac{1}{2} A \sigma^2\), where A = 4

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)
)

cfa$var    <- cfa$sigma^2
cfa$U_A4   <- cfa$E_r - 0.5 * 4 * cfa$var

kable(cfa,
      col.names = c("Investment", "E(r)", "σ", "σ²", "U (A=4)"),
      digits    = 4,
      caption   = "CFA Utility Formula Data") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE) %>%
  row_spec(which.max(cfa$U_A4), bold = TRUE, color = "white",
           background = "#27ae60")
CFA Utility Formula Data
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

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

best_A4 <- which.max(cfa$U_A4)
cat("Best investment for A=4:", best_A4,
    "\nUtility:", round(cfa$U_A4[best_A4], 4), "\n")
## Best investment for A=4: 3 
## Utility: 0.1588

Answer: Investment 3 (E(r) = 21%, σ = 16%) yields the highest utility of 0.1588 for a risk-averse investor with A = 4. Although Investment 4 has a higher expected return, its greater variance makes it less attractive to a risk-averse investor.


CFA Problem 2 – Risk Neutral Investor

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

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

Utility equals expected return — variance doesn’t matter.

best_neutral <- which.max(cfa$E_r)
cat("Best investment for risk-neutral investor: Investment", best_neutral,
    "\nE(r):", cfa$E_r[best_neutral], "\n")
## Best investment for risk-neutral investor: Investment 4 
## E(r): 0.24

Answer: Investment 4 (E(r) = 24%). A risk-neutral investor cares only about maximizing expected return and is indifferent to risk.


CFA Problem 3 – What Does Variable A Represent?

Answer: (b) Investor’s aversion to risk.

In the utility function \(U = E(r) - \frac{1}{2}A\sigma^2\), the coefficient A scales the penalty applied to portfolio variance. A higher value of A means the investor is more sensitive to risk and requires greater expected return to accept a given level of variance. It is not a return requirement, certainty equivalent, or a fixed preference ratio.


Summary Table

summary_df <- data.frame(
  Problem   = c("10", "11", "12", "CFA 1", "CFA 2", "CFA 3"),
  Answer    = c(
    "Computed E(r_p) and σ²_p for 6 portfolios",
    "Optimal: W_index = 1.0 (U = 0.09)",
    "Optimal: W_index = 1.0 (U = 0.07)",
    "Investment 3 (highest U = 0.1588 for A=4)",
    "Investment 4 (highest E(r) = 24%)",
    "Answer (b): Investor's aversion to risk"
  )
)

kable(summary_df, caption = "Homework 3 Summary of Answers") %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = TRUE)
Homework 3 Summary of Answers
Problem Answer
10 Computed E(r_p) and σ²_p for 6 portfolios
11 Optimal: W_index = 1.0 (U = 0.09)
12 Optimal: W_index = 1.0 (U = 0.07)
CFA 1 Investment 3 (highest U = 0.1588 for A=4)
CFA 2 Investment 4 (highest E(r) = 24%)
CFA 3 Answer (b): Investor’s aversion to risk