Introduction

These study notes are based on Chapter 10 the Exam 9 syllabus reading Investments by Bodie, Kane, and Marcus. This chapter provides an introduction to arbitrage pricing theory and multi-factor asset pricing models. This chapter corresponds to learning objective A8 on the syllabus.

easypackages::packages("dplyr", "ggplot2", "DT", "data.table")
options(scipen = 999)

Arbitrage Pricing Theory

Arbitrage is a situation in which an investor can earn risk-free profits with zero net investment. The law of one price is the idea that two equivalent assets should have the same market price – if they did not, then an arbitrage opportunity would exist by taking a short position in the asset with the greater price, and a long position in the asset with a lower price. As a result, arbitrageurs would lower the price of the overpriced asset and increase the price of the underpriced asset. Risk arbitrage involves investment in mis-priced securities in a manner that is not completely risk free.

Arbitrage-Free Pricing

There are three main assumptions of the APT:

  1. A factor model can be used to describe returns on a security

  2. There are sufficient securities available to diversify away firm-specific risk

  3. Arbitrage opportinuties cannot persist

A factor model for the return \(R_i\) is of the form \[ R_i = E[R_i] + \sum_{1\leq j \leq n} \beta_{i, j} F_j + \epsilon_i \] where \(E[F_j] = 0\) and \(E[\epsilon_i] = 0\). It is assumed that \(\mathrm{Cov}(\epsilon_i, F_j) = 0\) and \(\mathrm{Cov}(\epsilon_i, \epsilon_k) = 0\). The factors \(F_j\) are typically macroeconomic sources of risk, such as unexpected changes in GDP or interest rates.

In the context of a single factor model, a portfolio \(P\) with weights \(w_i\) will have expected return \[ R_P = E[R_P] + \beta_P F + \epsilon_P \] where \[ \beta_P = \sum_{1\leq i \leq n} w_i \beta_i \] and \[ \epsilon_P = \sum_{1 \leq i \leq n} w_i \epsilon_i \] The variance of the resulting portfolio is \[ \sigma_P^2 = \beta_P^2 \sigma_F^2 + \sigma^2(\epsilon_P) \] The non-systematic risk is \[ \sigma^2(\epsilon_P) = \sum_{1\leq i \leq n} w_i^2 \sigma^2(\epsilon_P) \] A well-diversified portfolio is one such that the non-systematic risk is negligible. Provided \(w_i^2 \rightarrow 0\) as the number of stocks in the portfolio increases, then the portfolio will be well-diversified for sufficiently large portfolios.

The idea of a well-diversified portfolio can be illustrated by comparing three scenarios:

  1. All stocks get equal weight

  2. Stocks are grouped into four, equally weighted within each group, with the groups forming 70%, 15%, 10%, and 5% of the portfolio

  3. A single stock has weight 50%, with the remaining stocks being equally weighted

Assume that the residual standard deviation for each stock is 0.5, and to facilitate comparisons with scenario 2, look only at portfolios of size divisible by 4. The first two scenarios replicate the example in the textbook.

residual.sd = 0.5
wd.illustration = data.frame(number_of_stocks = 1:2500 * 4)
wd.illustration = wd.illustration %>% mutate(scenario_1_residual_sd = sqrt(residual.sd ^ 2 / number_of_stocks),
                                             group_1_weight = 0.7 * 4 / number_of_stocks,
                                             group_2_weight = 0.15 * 4 / number_of_stocks,
                                             group_3_weight = 0.10 * 4 / number_of_stocks,
                                             group_4_weight = 0.05 * 4 / number_of_stocks,
                                             scenario_2_residual_sd = sqrt(residual.sd^2 * number_of_stocks / 4 * (group_1_weight^2 + group_2_weight^2 + group_3_weight^2 + group_4_weight^2)),
                                             scenario_3_residual_sd = sqrt(0.5^2 * residual.sd^2 + residual.sd^2 / (number_of_stocks - 1)))
wd.illustration %>% filter(number_of_stocks %in% c(4, 60, 200, 1000, 10000)) %>% select(number_of_stocks, scenario_1_residual_sd, scenario_2_residual_sd, scenario_3_residual_sd)
##   number_of_stocks scenario_1_residual_sd scenario_2_residual_sd
## 1                4             0.25000000            0.362284419
## 2               60             0.06454972            0.093541435
## 3              200             0.03535534            0.051234754
## 4             1000             0.01581139            0.022912878
## 5            10000             0.00500000            0.007245688
##   scenario_3_residual_sd
## 1              0.3818813
## 2              0.2583356
## 3              0.2525001
## 4              0.2505000
## 5              0.2500500

Scenario 3 is an example of a portfolio that does not become well-diversified due to one of the proportions being fixed.

Arbitrage pricing theory is based on the idea that if a well-diversified portfolio with non-zero \(\alpha\) exists, then an arbitrage opportunity presents itself. Suppose that there exists a portfolio \(P\) with excess return \[ R_P = \alpha_P + \beta_P R_M \] The assumption that the portfolio is well-diversified corresponds to not including an \(\epsilon\) term in the equation. The objective is shift the weight toward a market portfolio \(M\) such that \(\beta_P\) is eliminated. In other words, we want to select a weight \(w_P\) for portfolio \(P\) such that \[ w_P\beta_P + (1 - w_P) = 0 \] This implies that \[ w_P = \frac{1}{1 - \beta_P} \] and that the weight on the market portfolio is \[ w_M = 1 - w_P = \frac{-\beta_P}{1 - \beta_P} \] The resulting portfolio has zero beta, so it has no systematic risk, but has an alpha of \(w_P\alpha_P\). Depending on the values of \(\alpha_P\) and \(\beta_P\), the arbitrage strategy is:

  1. If \(\alpha_P/(1 - \beta_P) > 1\), borrow at the risk-free rate and invest in the combined portfolio.

  2. If \(\alpha_P / (1 - \beta_P) < 1\), sell the combined portfolio short and invest at the risk-free rate.

A consequence of this is that \(\alpha_P\) must be forced to be zero. Therefore, for any well-diversified portfolio, \[ E[R_P] = \beta_P E[R_M] \] This produces the same security market line as the CAPM. More generally, if we have two portfolios \(A\) and \(B\), we can create a zero-\(\beta\) portfolio by selecting a weight \(w_A\) such that \[ w_A \beta_A + (1 - w_A) \beta_B = 0 \] In other words, \[ w_A = \frac{\beta_B}{\beta_B - \beta_A} \] This can be illustrated using the following example:

beta.A = 1
beta.B = 0.5
R.A = 0.06
R.B = 0.02
w.A = beta.B / (beta.B - beta.A)
w.B = 1 - w.A
print(paste0("The weight of portfolio A is ", w.A, " and the weight of portfolio B is ", w.B))
## [1] "The weight of portfolio A is -1 and the weight of portfolio B is 2"
excess.return = w.A * R.A + w.B * R.B
print(paste0("The excess return is ", excess.return))
## [1] "The excess return is -0.02"

In this situation, we would take a short position in the combined portfolio and invest the proceeds in the risk-free asset.

Comparison to CAPM an Index Models

Key differences between the CAPM and APT include:

  • The CAPM relies on the strong assumption that all investors hold optimal portfolios. In contrast, APT only requires the assumption of a small number of arbitrageurs who mobilize large amounts of money to achieve the equiliblrium price.

  • The APT relies on the assumption of zero residual risk, which may not be achievable in practice. Its accuracy relies on the extent to which this risk can be diversified away.

  • The APT relies on specific observable portfolios (e.g. market index) and does not require the CAPM assumption that all assets be traded.

  • At the individual security level, with high residual risk, the APT breaks down but the CAPM still applies.

The APT is consistent with portfolio optimization using a single index model. In this approach, the initial weight assigned to the active portfolio is \[ w_A^0 = \frac{\alpha_A / \sigma^2(\epsilon_A)}{E[R_M] / \sigma_M^2} \] If the \(\alpha_A \neq 0\) but the active portfolio is well-diversified, then \(w_A^0\) increases without limit. This is consistent with the APT concept that in this situation, the position in the active portfolio should increase without bound. At an individual asset level, the weight in the active portfolio is proportional to \(w_i / \sigma^2(\epsilon_i)\), so if the residual risk is zero then this asset will comprise the entire active portfolio.

The following example illustrates how the portfolio optimization approach produces better results than the zero-\(\beta\) portfolio from the APT when there is residual variance. (Note that when the optimal weight produces a negative excess return, the desired action is to take a short position in the optimal portfolio.)

index.risk.premium = 0.07
index.sd = 0.2
index.sharpe.ratio = index.risk.premium / index.sd
apt.index.comparison = merge(merge(data.frame(alpha = c(0.01,0.03)), data.frame(residual_sd = c(0.04, 0.03, 0.02))), data.frame(beta = c(0.5, 2)))
apt.index.comparison = apt.index.comparison %>% mutate(zero_beta_weight = 1 / (1 - beta), zero_beta_excess = zero_beta_weight * (alpha + beta * index.risk.premium) + (1 - zero_beta_weight) * index.risk.premium, apt_position = sign(zero_beta_excess), zero_beta_residual_sd = sqrt(zero_beta_weight^2 * residual_sd^2), apt_sharpe_ratio  = apt_position * zero_beta_excess / zero_beta_residual_sd, opt_initial_weight = (alpha / residual_sd^2) / (index.risk.premium / index.sd^2), opt_final_weight = opt_initial_weight / (1 + (1 - beta) * opt_initial_weight), opt_excess_return = opt_final_weight * (alpha + beta * index.risk.premium) + (1 - opt_final_weight) * index.risk.premium, opt_sd = sqrt(opt_final_weight^2 * (beta^2 * index.sd^2 + residual_sd^2) + (1 - opt_final_weight)^2 * index.sd^2 + 2 * opt_final_weight * (1 - opt_final_weight) * beta * index.sd^2), opt_sharpe_ratio = apt_position * opt_excess_return / opt_sd)
datatable(apt.index.comparison %>% arrange(apt_sharpe_ratio))

Multifactor Models

In order to generalize the APT to a multi-factor context, we require a factor portfolio \(F_j\) for each factor in the model: this is a well-diversified portfolio such that its beta value is 1 for the factor of interest, and 0 for all other factors. These portfolios track specific sources of macroeconomic risk, and are uncorrelated with other risks. A given security will have a different \(\beta\) for each factor portfolio, and each factor portfolio has its own risk premium \(r_j - r_f\). The expected return on portfolio \(P\) is: \[ E[r_P] = r_f + \sum_{1\leq j \leq n} \beta_{P, j} (r_j - r_f) \] An alternative portfolio with identical risk characteristics can be constructed by using the factor portfolios, using the betas as the weights. If the return on the alternative portfolio does not equal the return on the original portfolio, then an arbitrage opportunity exists. This leads to the expected return given by the above equation.

A multifactor model can be used to calculate the firm-specific surprise as follows:

  1. Determine \(E[r_P]\) based on the formula given above.

  2. If there have been deviations from the expected value of the factors from actuals, adjust the expected return by the product of the betas and the deviation from expectations: \(E[R_i] + \sum_{1\leq j \leq n} \beta_{i, j} F_j\)

  3. Calculate the actual return on the stock as the sum of the end-of-period value plus dividends, divided by the start-of-period value. The difference between this and the adjusted expected return from step 2 is the firm-specific surprise.

The approach is illustrated by Problem 10 in the textbook. The underlying data for the problem are:

risk.free.rate = 0.06
APT.data = data.frame(factor = c("Inflation", "Industrial Production", "Oil prices"), factor_beta = c(1.2, 0.5, 0.3), factor_risk_premium = c(0.06, 0.08, 0.03), expected_rate_of_change = c(0.05, 0.03, 0.02), actual_rate_of_change = c(0.04, 0.06, 0))
APT.data
##                  factor factor_beta factor_risk_premium
## 1             Inflation         1.2                0.06
## 2 Industrial Production         0.5                0.08
## 3            Oil prices         0.3                0.03
##   expected_rate_of_change actual_rate_of_change
## 1                    0.05                  0.04
## 2                    0.03                  0.06
## 3                    0.02                  0.00

First, calculate the expected return based on expected values of the factors:

initial.expected.return = risk.free.rate + sum(APT.data$factor_beta * APT.data$factor_risk_premium)
print(paste0("The initial expected return is ", initial.expected.return))
## [1] "The initial expected return is 0.181"

Next, adjust based on the deviation from actuals:

APT.data = APT.data %>% mutate(deviation_from_expected = actual_rate_of_change - expected_rate_of_change)
adjusted.expected.return = initial.expected.return + sum(APT.data$factor_beta * APT.data$deviation_from_expected)
print(paste0("The adjusted expected return is ", adjusted.expected.return))
## [1] "The adjusted expected return is 0.178"

The Fama and French Three-Factor model uses the following factors:

Overall, the idea is that the last two factors capture macroeconomic effects that are not reflected in the market index. A drawback of this approach is that these two factors don’t clearly correspond to an identifiable risk that is being hedged.

Other examples of factors that might be considered in a multifactor model include:

An important consideration in multi-factor models is that the \(\beta\) values for some factors may be negative. The interpretation is that these are factors that make securities more desirable when the factor increases, so they have a negative risk premium.