Chapter 6 – Problems 10–12

Given information:

  • T-bill rate (risk-free): \(r_f = 5\%\)
  • S&P 500 risk premium (excess return): \(8\%\), so \(E(r_{index}) = 5\% + 8\% = 13\%\)
  • S&P 500 standard deviation: \(\sigma_{index} = 20\%\)

Problem 10 – Expected Return and Variance

The portfolio expected return and variance formulas are:

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

\[\sigma^2_p = (w_{index})^2 \cdot \sigma^2_{index}\]

# Given parameters
rf       <- 0.05   # T-bill rate
r_index  <- 0.13   # E(r) of S&P 500 = rf + 8% risk premium
sigma    <- 0.20   # S&P 500 standard deviation

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

# Expected return
E_rp <- w_bills * rf + w_index * r_index

# Variance
var_p <- (w_index * sigma)^2

# Combine into a data frame
df10 <- data.frame(
  W_bills  = w_bills,
  W_index  = w_index,
  E_rp     = round(E_rp, 4),
  Var_p    = round(var_p, 4)
)

knitr::kable(df10,
  col.names = c("W_bills", "W_index", "E(r_p)", "Variance"),
  caption = "Problem 10: Expected Return and Variance of Portfolios")
Problem 10: Expected Return and Variance of Portfolios
W_bills W_index E(r_p) Variance
0.0 1.0 0.130 0.0400
0.2 0.8 0.114 0.0256
0.4 0.6 0.098 0.0144
0.6 0.4 0.082 0.0064
0.8 0.2 0.066 0.0016
1.0 0.0 0.050 0.0000

Interpretation: As the weight in T-bills increases, both expected return and variance decrease. A fully-invested S&P 500 portfolio has the highest expected return (13%) and highest variance (0.04), while a 100% T-bill portfolio has expected return of 5% and zero variance.


Problem 11 – Utility Levels with A = 2

The utility function is:

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

A2 <- 2

U_A2 <- E_rp - 0.5 * A2 * var_p

df11 <- data.frame(
  W_bills  = w_bills,
  W_index  = w_index,
  E_rp     = round(E_rp, 4),
  Var_p    = round(var_p, 4),
  Utility  = round(U_A2, 4)
)

knitr::kable(df11,
  col.names = c("W_bills", "W_index", "E(r_p)", "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_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
cat("Maximum utility achieved at W_bills =", w_bills[which.max(U_A2)],
    "with utility =", round(max(U_A2), 4))
## Maximum utility achieved at W_bills = 0 with utility = 0.09

Conclusion (A = 2): The investor with moderate risk aversion (A = 2) achieves the highest utility at 100% invested in the S&P 500 index (W_bills = 0, W_index = 1). The risk penalty is relatively small for this investor, so the higher expected return from the index dominates.


Problem 12 – Utility Levels with A = 3

A3 <- 3

U_A3 <- E_rp - 0.5 * A3 * var_p

df12 <- data.frame(
  W_bills  = w_bills,
  W_index  = w_index,
  E_rp     = round(E_rp, 4),
  Var_p    = round(var_p, 4),
  Utility  = round(U_A3, 4)
)

knitr::kable(df12,
  col.names = c("W_bills", "W_index", "E(r_p)", "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_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
cat("Maximum utility achieved at W_bills =", w_bills[which.max(U_A3)],
    "with utility =", round(max(U_A3), 4))
## Maximum utility achieved at W_bills = 0.4 with utility = 0.0764

Conclusion (A = 3): The investor with higher risk aversion (A = 3) also achieves the highest utility at 100% in the S&P 500 index (W_bills = 0). However, compared to A = 2, the utility values are lower across all portfolios because the risk penalty is steeper. A more risk-averse investor would be willing to accept a lower allocation to equities for a given level of utility compared to an investor with A = 2.

Note: The optimal continuous allocation can be found via the formula \(w^* = \frac{E(r_p) - r_f}{A \cdot \sigma^2}\). For A = 2: \(w^* = \frac{0.08}{2 \times 0.04} = 1.0\); for A = 3: \(w^* = \frac{0.08}{3 \times 0.04} \approx 0.667\). The discrete table only shows integer steps, so 100% index is the best available option for both.

library(ggplot2)

plot_df <- data.frame(
  W_index = rep(w_index, 2),
  Utility = c(U_A2, U_A3),
  A       = rep(c("A = 2", "A = 3"), each = length(w_index))
)

ggplot(plot_df, aes(x = W_index, y = Utility, color = A, group = A)) +
  geom_line(size = 1.2) +
  geom_point(size = 3) +
  scale_x_continuous(breaks = w_index) +
  labs(
    title    = "Utility vs. Portfolio Weight in S&P 500 Index",
    x        = "Weight in S&P 500 (W_index)",
    y        = "Utility",
    color    = "Risk Aversion"
  ) +
  theme_minimal(base_size = 13) +
  theme(legend.position = "top")
Utility vs. W_index for A=2 and A=3

Utility vs. W_index for A=2 and A=3


CFA Problems 1–3

Given data (U = E(r) − ½Aσ², A = 4):

Investment E(r) σ
1 0.12 0.30
2 0.15 0.50
3 0.21 0.16
4 0.24 0.21

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

E_r  <- c(0.12, 0.15, 0.21, 0.24)
sigma_cfa <- c(0.30, 0.50, 0.16, 0.21)
A_cfa <- 4

U_cfa <- E_r - 0.5 * A_cfa * sigma_cfa^2

df_cfa <- data.frame(
  Investment = 1:4,
  E_r        = E_r,
  Sigma      = sigma_cfa,
  Utility    = round(U_cfa, 4)
)

knitr::kable(df_cfa,
  col.names = c("Investment", "E(r)", "σ", "Utility (A=4)"),
  caption = "CFA Problem 1: Utility for Risk-Averse Investor (A = 4)")
CFA Problem 1: Utility for Risk-Averse Investor (A = 4)
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
cat("Best investment for A = 4:", which.max(U_cfa),
    "with utility =", round(max(U_cfa), 4))
## Best investment for A = 4: 3 with utility = 0.1588

Answer: A risk-averse investor with A = 4 should select Investment 3, which has the highest utility (≈ 0.1588). Although Investment 4 has a higher expected return, its variance is large enough that the risk penalty reduces its utility below Investment 3.


CFA Problem 2 – Risk-Neutral Investor

A risk-neutral investor has A = 0, so the utility function simplifies to:

\[U = E(r)\]

The investor simply maximizes expected return, ignoring risk entirely.

U_neutral <- E_r  # A = 0, so utility = E(r)

df_cfa2 <- data.frame(
  Investment = 1:4,
  E_r        = E_r,
  Utility    = U_neutral
)

knitr::kable(df_cfa2,
  col.names = c("Investment", "E(r)", "Utility (A=0)"),
  caption = "CFA Problem 2: Utility for Risk-Neutral Investor (A = 0)")
CFA Problem 2: Utility for Risk-Neutral Investor (A = 0)
Investment E(r) Utility (A=0)
1 0.12 0.12
2 0.15 0.15
3 0.21 0.21
4 0.24 0.24
cat("Best investment for risk-neutral investor:", which.max(U_neutral),
    "with E(r) =", max(U_neutral))
## Best investment for risk-neutral investor: 4 with E(r) = 0.24

Answer: A risk-neutral investor selects Investment 4 (E(r) = 0.24), as it offers the highest expected return. Risk is irrelevant to this investor.


CFA Problem 3 – What Does Variable A Represent?

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

The coefficient A in the utility function \(U = E(r) - \frac{1}{2}A\sigma^2\) measures the degree of risk aversion:

  • A higher A means the investor penalizes variance more heavily → prefers lower-risk portfolios.
  • A lower A (closer to 0) means the investor is less sensitive to risk.
  • When A = 0, the investor is risk-neutral and only cares about expected return.
  • A negative A would imply a risk-seeking investor.

The other options are incorrect: - (a) Return requirement is a constraint, not a preference parameter. - (c) The certainty equivalent rate is the output of the utility function (the risk-free rate that gives the same utility), not A itself. - (d) A does not capture a “4 units of risk per unit of return” ratio—that is a misinterpretation.