Required Packages
library(ggplot2)
library(lmtest)
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(sandwich)
library(xts)
library(tseries)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(knitr)
library(FinTS)
library(broom)
library(gridExtra)
library(reshape2)
The aim of portfolio managers and investors is to optimise the allocation of wealth across a number of assets to minimise the associated risk, or maximise returns. This can be achieved using concepts from portfolio theory.
Typically, financial portfolios consist of multiple assets. Their returns depend concurrently on many economic and financial variables. Multivariate analyses is important to study the behaviour and properties of portfolio returns.
In this report, I conduct an analysis of various industry portfolios to understand their behavior, correlations, and risk-adjusted returns over a specified period. This study leverages the Capital Asset Pricing Model (CAPM) alongside regression techniques to assess the performance and interrelationships of portfolios within the Consumer, Manufacturing, High Technology, Health, and ‘Other’ sectors.
From Ken Frenchís webpage, https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html, I will be using a data set containing the monthly Fama-French (FF) market (MKT- RF) factor, the risk-free interest rate (RF), and the monthly (Average Value Weighted) returns for five US (United States) industry portfolios over the period January 2004 to December 2023.
data <- read.csv("/Users/nathanfoale/Desktop/data/Clean Data.csv")
industry_portfolios <- data[, c("Cnsmr", "Manuf", "HiTec", "Hlth", "Other")]
excess_returns <- industry_portfolios - data$RF
\(\text{Excess Returns} = r_{it} - r_{ft}\), where \(r_{it}\) represents the return on portfolio i at time t, and \(r_{ft}\) being the risk-free rate (often taken to be the interest rate on a government bond).
Excess returns plot for each industry portfolio
data$Date <- as.Date(data$Date, format = "%d/%m/%Y")
excess_returns <- as.data.frame(industry_portfolios - data$RF)
names(excess_returns) <- names(industry_portfolios)
excess_returns$Date <- data$Date
excess_returns_long <- melt(excess_returns, id.vars = "Date", variable.name = "Portfolio", value.name = "Excess_Returns")
plots <- lapply(unique(excess_returns_long$Portfolio), function(portfolio) {
ggplot(subset(excess_returns_long, Portfolio == portfolio), aes(x = Date, y = Excess_Returns)) +
geom_line() +
ggtitle(paste("Excess Returns: ", portfolio)) +
xlab("Date") +
ylab("Excess Returns") +
theme_minimal()
})
combined_plot <- do.call(grid.arrange, c(plots, ncol = 2))
When building portfolios, investors will want to know how assets move together. They might not want to include too many assets which are highly correlated, as if one does bad, the other will as well.
A vast majority of financial econometrics is interested in understanding the behaviour of a random variable conditional on some other variables.
A correlation matrix of the excess returns can give us insight into how closely the movements of different industries are linked. Understanding the correlation between different portfolios helps in assessing how diversified an investment in these portfolios could be.
We can estimate these quantities using the covariance/correlation matrix:
\[ \hat{Cov}(X_1, X_2) = \frac{1}{n} \sum_{t=1}^{n} (X_{1t} - \overline{X}_1)(X_{2t} - \overline{X}_2) \] \[ \hat{Corr}(X_1, X_2) = \frac{\hat{Cov}(X_1, X_2)}{s_1 s_2} \]
excess_returns_numeric <- excess_returns[, sapply(excess_returns, is.numeric)]
correlation_matrix <- cor(excess_returns_numeric)
print(correlation_matrix)
## Cnsmr Manuf HiTec Hlth Other
## Cnsmr 1.0000000 0.7643507 0.8782863 0.7205808 0.8335528
## Manuf 0.7643507 1.0000000 0.7678807 0.6436921 0.8213604
## HiTec 0.8782863 0.7678807 1.0000000 0.6858827 0.8023766
## Hlth 0.7205808 0.6436921 0.6858827 1.0000000 0.6949400
## Other 0.8335528 0.8213604 0.8023766 0.6949400 1.0000000
Results and Observations
Consumer has the highest overall correlation with the other portfolios, which suggests its returns move more closely to the with the market compared to the other portfolios. On the other hand, Health exhibits the weakest correlation with other sectors, indicating it may move somewhat more independently, however still has a strong level of correlation on average. The strongest correlation is observed between the Consumer and High-Tech portfolios, suggesting a significant level of co-movement between their respective excess returns, which may reflect shared market forces or cyclical patters (boom-bust) that simultaneously influence both sectors, like, for example, technological advancements benefitting both consumer products and high technological industries. Conversely, the weakest correlation is observed between Health and Manufacturing, which could suggest these sectors are influenced by different factors, offering potential diversification benefits. Overall, the positive correlations across all industry portfolios suggest that industry returns are generally moving in the same direction, though the magnitude of the movement varies. The Excess Return plots indicate some periods of increased volatility during 2008 and 2020, highlighting the impact of global crises on market behavior.
The CAPM model is given by: \[ r_{it} - r_{ft} = \alpha + \beta (r_{mt} - r_{ft}) + \epsilon_t \]
Where \(r_{it}\) is the return of the portfolio, \(r_{ft}\) is the risk-free rate, \(r_{mt}\) is the market return, \(\alpha\) and \(\beta\) are parameters to be estimated, \(\epsilon_t\) is the error term.
The CAPM model measures the risk on an invidual asset i through its “beta-risk”:
\[ \beta_i = \frac{E\left[(r_{it} - r_{ft} - (\mu_i - \mu_f))(r_{mt} - r_{ft} - (\mu_m - \mu_f))\right]}{Var[r_{mt} - r_{ft}]}\] \[= \frac{Cov(r_{it} - r_{ft}, r_{mt} - r_{ft})}{Var(r_{mt} - r_{ft})} \]
The coefficient \(\beta_i\) measures the exposure of the returns on asset i to movements in the market. If the market moves by a certain amount, returns move by certain amounts and that amount is determined by \(\beta_i\).
The coefficient \(\alpha_i\) represents abnormal returns relative to excess market returns (\(r_{mt} - r_{ft}\)).
CAPM Regression Function
run_CAPM_regression <- function(portfolio_returns, market_returns) {
lm_results <- lm(portfolio_returns ~ market_returns)
tidy(lm_results)
}
results_list <- list()
portfolios <- c("Cnsmr", "Manuf", "HiTec", "Hlth", "Other")
for (portfolio in portfolios) {
regression_results <- run_CAPM_regression(excess_returns[[portfolio]], data$Mkt.RF)
results_list[[portfolio]] <- regression_results
}
for (portfolio in portfolios) {
cat('\n**Robust CAPM Results for:', portfolio, '**\n\n')
print(knitr::kable(results_list[[portfolio]],
caption = paste("CAPM Regression Results for", portfolio),
align = 'c',
format = "markdown"))
beta <- results_list[[portfolio]][2, "estimate"]
beta_se <- results_list[[portfolio]][2, "std.error"]
cat(sprintf('\nFor the **%s** sector, the beta estimate is **%.4f** with a standard error of **%.4f**, indicating how the sector responds to market movements.\n\n', portfolio, beta, beta_se))
}
##
## **Robust CAPM Results for: Cnsmr **
##
##
##
## Table: CAPM Regression Results for Cnsmr
##
## | term | estimate | std.error | statistic | p.value |
## |:--------------:|:---------:|:---------:|:---------:|:---------:|
## | (Intercept) | 0.1441889 | 0.1010143 | 1.427411 | 0.1547723 |
## | market_returns | 0.8881500 | 0.0224315 | 39.593933 | 0.0000000 |
##
## For the **Cnsmr** sector, the beta estimate is **0.8882** with a standard error of **0.0224**, indicating how the sector responds to market movements.
##
##
## **Robust CAPM Results for: Manuf **
##
##
##
## Table: CAPM Regression Results for Manuf
##
## | term | estimate | std.error | statistic | p.value |
## |:--------------:|:---------:|:---------:|:----------:|:---------:|
## | (Intercept) | 0.0111371 | 0.1436280 | 0.0775415 | 0.9382579 |
## | market_returns | 0.9559056 | 0.0318944 | 29.9709923 | 0.0000000 |
##
## For the **Manuf** sector, the beta estimate is **0.9559** with a standard error of **0.0319**, indicating how the sector responds to market movements.
##
##
## **Robust CAPM Results for: HiTec **
##
##
##
## Table: CAPM Regression Results for HiTec
##
## | term | estimate | std.error | statistic | p.value |
## |:--------------:|:---------:|:---------:|:---------:|:---------:|
## | (Intercept) | 0.1586814 | 0.1130298 | 1.40389 | 0.1616551 |
## | market_returns | 1.0707016 | 0.0250996 | 42.65804 | 0.0000000 |
##
## For the **HiTec** sector, the beta estimate is **1.0707** with a standard error of **0.0251**, indicating how the sector responds to market movements.
##
##
## **Robust CAPM Results for: Hlth **
##
##
##
## Table: CAPM Regression Results for Hlth
##
## | term | estimate | std.error | statistic | p.value |
## |:--------------:|:---------:|:---------:|:---------:|:---------:|
## | (Intercept) | 0.1812656 | 0.1672305 | 1.083927 | 0.2794941 |
## | market_returns | 0.7138477 | 0.0371356 | 19.222747 | 0.0000000 |
##
## For the **Hlth** sector, the beta estimate is **0.7138** with a standard error of **0.0371**, indicating how the sector responds to market movements.
##
##
## **Robust CAPM Results for: Other **
##
##
##
## Table: CAPM Regression Results for Other
##
## | term | estimate | std.error | statistic | p.value |
## |:--------------:|:----------:|:---------:|:---------:|:---------:|
## | (Intercept) | -0.2608431 | 0.1312890 | -1.986786 | 0.0480929 |
## | market_returns | 1.1370139 | 0.0291543 | 38.999820 | 0.0000000 |
##
## For the **Other** sector, the beta estimate is **1.1370** with a standard error of **0.0292**, indicating how the sector responds to market movements.
Using the CAPM model, we can classify portfolios of stocks according to their beta risk:
Aggressive: If \(\beta_i > 1\), the portfolio is considered aggressive, implying that it tends to amplify the movements of the market.
Tracks the market: If \(\beta_i = 1\), the portfolio is said to track the market, mirroring its overall movements.
Conservative: If \(0 <\beta_i < 1\), the portfolio is considered conservative, indicating that it is less volatile compared to the market.
Independant of the market: If \(\beta_i = 0\), the portfolio closely follows that of the market.
Imperfect Hedge: If \(-1 < \beta_i < 0\), the portfolio acts as an imperfect hedge, potentially providing some protection against broad market downturns by moving inversely to the market, though not perfectly so.
Perfect Hedge: If \(\beta_i = -1\), the portfolio is considered a perfect hedge as it moves exactly inversely to the market, providing complete protection against market downturns.
To test whether each portfolio tracks the market, we perform a hypothesis test using the t-statistic calculated from the CAPM regression outputs. The null hypothesis \(H_0\) states that \(\beta = 1\), meaning the portfolio tracks the market
We use a two-tailed test at the 5% significance level. Critical t-value (\(t_{crit}\)) at 238 degrees of freedom is approximately 1.970.
Consumer Sector
\[ \text{t-statistic} = \frac{0.8882 - 1}{0.0224} = -4.99 \]
\[ |t_{stat}| > t_{crit} \]
Thus, we reject \(H_0\) at the 5% significance level, indicating that the Consumer portfolio does not track the market.
High Tech Sector
\[ \text{t-statistic} = \frac{0.7138 - 1}{0.0371} = -26.24 \]
\[ |t_{stat}| > t_{crit} \]
Thus, we reject \(H_0\) at the 5% significance level, indicating that the High Tech portfolio does not track the market.
Health Sector
\[ \text{t-statistic} = \frac{1.0707 - 1}{0.0251} = 2.82 \]
\[ |t_{stat}| > t_{crit} \]
Thus, we reject \(H_0\) at the 5% significance level, indicating that the Health sector does not track the market.
Manufacturing Sector
\[ \text{t-statistic} = \frac{0.9559 - 1}{0.031894} = -1.38 \]
\[ |t_{stat}| < t_{crit} \]
Thus, we fail to reject \(H_0\) at the 5% significance level, indicating that the Manufacturing portfolio tracks the market.
Other Sector
\[ \text{t-statistic} = \frac{1.1370 - 1}{0.0292} = 4.69 \]
\[ |t_{stat}| > t_{crit} \]
Thus, we reject \(H_0\) at the 5% significance level, indicating that the Other portfolio does not track the market.
CAPM regressions adjusting for potential heteroskedasticity in the error terms
run_CAPM_regression_robust <- function(portfolio_returns, market_returns) {
lm_results <- lm(portfolio_returns ~ market_returns)
robust_summary <- coeftest(lm_results, vcov = vcovHC(lm_results, type = "HC1"))
tidy(robust_summary)
}
robust_results_list <- list()
portfolios <- c("Cnsmr", "Manuf", "HiTec", "Hlth", "Other")
for (portfolio in portfolios) {
robust_regression_results <- run_CAPM_regression_robust(excess_returns[[portfolio]], data$Mkt.RF)
robust_results_list[[portfolio]] <- robust_regression_results
}
for (portfolio in portfolios) {
cat('\n**Robust CAPM Results for:', portfolio, '**\n\n')
print(knitr::kable(robust_results_list[[portfolio]],
caption = paste("Robust CAPM Regression Results for", portfolio),
align = 'c',
format = "markdown"))
beta <- robust_results_list[[portfolio]][2, "estimate"]
beta_se <- robust_results_list[[portfolio]][2, "std.error"]
cat(sprintf('\nFor the **%s** sector, the robust beta estimate is **%.4f** with a standard error of **%.4f**, indicating how the sector responds to market movements under more conservative standard error estimates.\n\n', portfolio, beta, beta_se))
}
##
## **Robust CAPM Results for: Cnsmr **
##
##
##
## Table: Robust CAPM Regression Results for Cnsmr
##
## | term | estimate | std.error | statistic | p.value |
## |:--------------:|:---------:|:---------:|:---------:|:---------:|
## | (Intercept) | 0.1441889 | 0.0996872 | 1.446413 | 0.1493771 |
## | market_returns | 0.8881500 | 0.0263310 | 33.730206 | 0.0000000 |
##
## For the **Cnsmr** sector, the robust beta estimate is **0.8882** with a standard error of **0.0263**, indicating how the sector responds to market movements under more conservative standard error estimates.
##
##
## **Robust CAPM Results for: Manuf **
##
##
##
## Table: Robust CAPM Regression Results for Manuf
##
## | term | estimate | std.error | statistic | p.value |
## |:--------------:|:---------:|:---------:|:----------:|:---------:|
## | (Intercept) | 0.0111371 | 0.1509681 | 0.0737714 | 0.9412542 |
## | market_returns | 0.9559056 | 0.0392073 | 24.3808188 | 0.0000000 |
##
## For the **Manuf** sector, the robust beta estimate is **0.9559** with a standard error of **0.0392**, indicating how the sector responds to market movements under more conservative standard error estimates.
##
##
## **Robust CAPM Results for: HiTec **
##
##
##
## Table: Robust CAPM Regression Results for HiTec
##
## | term | estimate | std.error | statistic | p.value |
## |:--------------:|:---------:|:---------:|:---------:|:---------:|
## | (Intercept) | 0.1586814 | 0.1177259 | 1.347888 | 0.1789759 |
## | market_returns | 1.0707016 | 0.0281313 | 38.060803 | 0.0000000 |
##
## For the **HiTec** sector, the robust beta estimate is **1.0707** with a standard error of **0.0281**, indicating how the sector responds to market movements under more conservative standard error estimates.
##
##
## **Robust CAPM Results for: Hlth **
##
##
##
## Table: Robust CAPM Regression Results for Hlth
##
## | term | estimate | std.error | statistic | p.value |
## |:--------------:|:---------:|:---------:|:---------:|:---------:|
## | (Intercept) | 0.1812656 | 0.1675764 | 1.081689 | 0.2804854 |
## | market_returns | 0.7138477 | 0.0416368 | 17.144626 | 0.0000000 |
##
## For the **Hlth** sector, the robust beta estimate is **0.7138** with a standard error of **0.0416**, indicating how the sector responds to market movements under more conservative standard error estimates.
##
##
## **Robust CAPM Results for: Other **
##
##
##
## Table: Robust CAPM Regression Results for Other
##
## | term | estimate | std.error | statistic | p.value |
## |:--------------:|:----------:|:---------:|:---------:|:---------:|
## | (Intercept) | -0.2608431 | 0.1378065 | -1.892822 | 0.0595949 |
## | market_returns | 1.1370139 | 0.0377239 | 30.140394 | 0.0000000 |
##
## For the **Other** sector, the robust beta estimate is **1.1370** with a standard error of **0.0377**, indicating how the sector responds to market movements under more conservative standard error estimates.
After adjusting for potential heteroskedasticity in the error terms, we would expect the standard errors of β to increase, which would lead to a corresponding adjustment in the t-statistic and an increase in the p-value associated with the value of β. By design, robust standard errors are more conservative. They provide a safeguard against the misspecification of the error variance structure. This conservatism means that they tend to be larger than OLS standard errors. This is supported by the evidence from all regressions outputs when compared to the outputs from Question 1.2
To compute the correlation matrix implied by the CAPM Model, we use the covariance formula: \[ \text{Covariance} = \beta \Sigma_F \beta^T + D \]
This formula accounts for both the systematic risk captured by the factor betas and the unsystematic risk specific to each portfolio.
This matrix includes the correlations calculated from the beta coefficients and the residuals from the CAPM regression, providing insights into how the portfolios move relative to each other.
We still anticipate that the correlation matrices will be similar because the R^2 of all models is relatively high, suggesting that the models are relatively good at predicting the portfolio return using (a linear multiple of) the excess market return, which in turn implies that these are well correlated. Indeed, by observing the below correlation matrix and comparing it to the matrix generated earlier on excess returns. The CAPM implied model generally has a slightly higher correlation, up to approximately 0.05 higher than indicated
| Consumer | High Tech | Health | Manufacturing | Other | |
|---|---|---|---|---|---|
| Consumer | 1.00000 | 0.87623 | 0.72668 | 0.82846 | 0.86644 |
| High Tech | 0.87623 | 1.00000 | 0.73341 | 0.83613 | 0.87446 |
| Health | 0.72668 | 0.73341 | 1.00000 | 0.69343 | 0.72522 |
| Manufacturing | 0.82846 | 0.83613 | 0.69343 | 1.00000 | 0.82679 |
| Other | 0.86644 | 0.87446 | 0.72522 | 0.82679 | 1.00000 |
Results and Observations
High Correlation Between Consumer and High Tech: The highest correlation in the matrix is between the Consumer and High Tech portfolios (0.87623). This suggests a strong positive relationship, meaning when Consumer stocks perform well, High Tech stocks tend to also perform well, and vice versa. This could be due to similar market forces affecting both sectors, such as economic cycles, consumer spending habits, or technological advancements impacting consumer products.
Moderate to High Correlations Across All Portfolios: All the entries in the matrix are positive and most are above 0.7, indicating that the industry portfolios generally move together in the same direction. This can imply a few things:
Market Sensitivity: The portfolios are sensitive to the same broad market factors, such as overall economic conditions, interest rates, or nationwide consumer confidence.
Limited Diversification Benefit: Since all sectors exhibit positive correlations, the potential for diversification by merely holding different sector portfolios may be limited. During market downturns or upheavals, all sectors might experience negative returns simultaneously.
Lowest Correlation Between Health and Manufacturing: The lowest correlation is observed between Health and Manufacturing sectors (0.69343). Although still positive and moderately strong, this suggests slightly more potential for diversification between these two sectors compared to others. Health and Manufacturing may be influenced by different specific factors, such as regulatory changes affecting healthcare more than manufacturing, or economic policies more directly impacting manufacturing.
In portfolio theory, assessing the performance of investments relative to their risk is critical. To measure this, several key metrics can be applied: Sharpe Ratio, Treynor Index, and Jensen’s Alpha.
Each of these metrics provides insights into different aspects of risk-adjusted performance, helping investors make informed decisions about where to allocate their capital.
Sharpe Ratio The Sharpe Ratio measures the excess return per unit of deviation in an investment asset or a trading strategy. It is a useful metric for comparing the relative performance of various investments or portfolios by normalizing their risk levels. A higher Sharpe Ratio indicates a more desirable outcome, as it suggests that the investor is receiving more return per unit of risk.
Treynor Index The Treynor Index, like the Sharpe Ratio, measures excess returns but it does so in relation to systemic risk as measured by the portfolio’s beta. This index is particularly useful when comparing the performance of portfolios with different levels of market risk. A higher Treynor Index indicates that the portfolio is earning more excess return per unit of systemic risk.
Jensen’s Alpha (α) Jensen’s Alpha measures a portfolio’s excess returns that are not explained by the beta-adjusted returns of the market. It represents the portfolio’s performance after accounting for the risk associated with its beta. A positive Jensen’s Alpha indicates a performance better than predicted by CAPM, suggesting the manager’s ability to ‘beat the market’.
Sharpe Ratio is defined as: \[ = \frac{\mu_p - r_f}{\sigma_p} \] where \(\mu_p\) is the expected return of the portfolio, \(r_f\) is the risk-free rate, and \(\sigma_p\) is the standard deviation of the portfolio’s returns.
Treynor’s Index is defined as: \[ = \frac{\mu_p - r_f}{\beta_p} \] where \(\beta_p\) is the beta of the portfolio with respect to the market.
Jensen’s Alpha is defined as: \[ \alpha = \mu_p - \left( r_f + \beta \times (\mu_m - r_f) \right) \] where \(\mu_m\) is the return of the market.
| Portfolio | Mean_Return | St_Dev | Beta | Sharpe_Ratio | Treynor_Index | Jensen_Alpha |
|---|---|---|---|---|---|---|
| Consumer | 0.939833 | 4.226960 | 0.888150 | 0.1957868 | 0.9318054 | 0.1441889 |
| High Tech | 1.094792 | 5.058857 | 1.070702 | 0.1942220 | 0.9176610 | 0.1586820 |
| Health | 0.842792 | 4.056648 | 0.713848 | 0.1800851 | 1.0233859 | 0.1812659 |
| Manufacturing | 0.858917 | 4.776959 | 0.955906 | 0.1563059 | 0.7811092 | 0.0111375 |
| Other | 0.726292 | 5.428689 | 1.137014 | 0.1131110 | 0.5400480 | -0.2608400 |
Consumer Portfolio
Sharpe Ratio: 0.1957868, the highest among the portfolios, indicating that the Consumer sector provides the best return per unit of risk.
Treynor Index: 0.9318054, also among the highest, suggesting effective returns per unit of market risk.
Jensen’s Alpha: 0.1441889, positive, implying that the portfolio is performing better than predicted by the CAPM, reflecting good management or sector performance.
High Tech Portfolio
Sharpe Ratio: 0.1942220, slightly lower than the Consumer, indicating a bit less favorable return per unit of risk.
Treynor Index: 0.9176610, slightly lower, reflecting lesser returns per unit of market risk compared to Consumer.
Jensen’s Alpha: 0.1586820, positive, showing that the portfolio performs better than what CAPM would predict, indicating potentially good management or sector advantage.
Health Portfolio
Sharpe Ratio: 0.1800851, relatively high, suggesting good return efficiency per unit of risk.
Treynor Index: 1.0233859, the highest, showing very efficient returns in terms of market risk, potentially making it a good choice for risk-averse investors.
Jensen’s Alpha: 0.1812659, the highest alpha, suggesting excellent management performance exceeding market expectations.
Manufacturing Portfolio
Sharpe Ratio: 0.1563059, the second-lowest, suggesting lesser return per unit of risk.
Treynor Index: 0.7811092, the second-lowest, indicating less efficient returns per unit of market risk.
Jensen’s Alpha: 0.0111375, barely positive, indicating minimal excess return over the market prediction, suggesting average management performance.
Other Portfolio
Sharpe Ratio: 0.1131110, the lowest among all, suggesting poor return efficiency per unit of risk.
Treynor Index: 0.5400480, the lowest, indicating poor returns per unit of market risk.
Jensen’s Alpha: -0.2608400, negative, implying the portfolio is underperforming compared to the market expectation, suggesting poor management or unfavorable sector conditions.
\[ r_{it} - r_{ft} = \alpha_i + \beta_{i,M}(r_{mt} - r_{ft}) + \beta_{i,SMB}SMB_t + \beta_{i,HML}HML_t + \epsilon_{it} \]
The Fama-French Three-Factor Model (FF3) is an asset pricing model that extends the Capital Asset Pricing Model (CAPM) by adding size and value factors to the market risk factor. Developed by Eugene Fama and Kenneth French in the early 1990s, the model aims to describe stock returns through three risk factors: market risk, size risk, and value risk.
Here’s a breakdown of each component:
Market Risk (Market Factor): Similar to the CAPM, the first factor in the FF3 model is the excess return of the market portfolio over the risk-free rate. This factor accounts for the returns due to market-wide risks that affect all stocks. It is measured as \(r_{mt} - r_{ft}\), where \(r_{mt}\) is the return on the market portfolio and \(r_{ft}\) is the risk-free rate.
Size Risk (Small Minus Big, SMB): This factor captures the additional return investors expect from investing in smaller firms compared to larger firms. Empirical evidence suggests that smaller companies, on average, have higher adjusted returns than larger companies, likely due to higher risk associated with smaller firms.
Value Risk (High Minus Low, HML): This factor measures the excess return of stocks with high book-to-market values over those with low book-to-market values. Value stocks (high book-to-market ratios) are often perceived as riskier and, thus, provide higher returns compared to growth stocks (low book-to-market ratios).
For the Manufacturing sector, we evaluate the Fama-French three-factor model over two distinct periods:
\[ (r_{it} - r_{ft}) = 0.290 + 1.028(r_{mt} - r_{ft}) - 0.077\text{SMB} - 0.179\text{HML} + \epsilon_t \]\[ (r_{it} - r_{ft}) = -0.209 + 0.934(r_{mt} - r_{ft}) - 0.004\text{SMB} + 0.431\text{HML} + \epsilon_t \]
excess_returns <- data.frame(matrix(ncol = length(industry_portfolios),
nrow = nrow(data)))
names(excess_returns) <- names(industry_portfolios)
for (col in names(industry_portfolios)) {
excess_returns[[col]] <- data[[col]] - data[["RF"]]
}
data$Date <- as.Date(data$Date, format="%d/%m/%Y")
excess_returns <- as.data.frame(matrix(ncol = 5))
names(excess_returns) <- c("Cnsmr", "Manuf", "HiTec", "Hlth", "Other")
ff3_model_Manuf <- lm(Manuf ~ Mkt.RF + SMB + HML, data = data)
summary(ff3_model_Manuf)
##
## Call:
## lm(formula = Manuf ~ Mkt.RF + SMB + HML, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -8.6433 -1.3721 0.0503 1.2992 6.1864
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.15574 0.13503 1.153 0.250
## Mkt.RF 0.92800 0.03234 28.696 < 2e-16 ***
## SMB -0.01287 0.05781 -0.223 0.824
## HML 0.25751 0.04245 6.066 5.17e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.057 on 236 degrees of freedom
## Multiple R-squared: 0.8169, Adjusted R-squared: 0.8145
## F-statistic: 350.9 on 3 and 236 DF, p-value: < 2.2e-16
coeftest(ff3_model_Manuf, vcov = vcovHC(ff3_model_Manuf, type = "HC1"))
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.155743 0.142234 1.0950 0.2746
## Mkt.RF 0.928001 0.038394 24.1705 < 2.2e-16 ***
## SMB -0.012866 0.056463 -0.2279 0.8199
## HML 0.257513 0.056878 4.5274 9.474e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
start_date <- as.Date("2004-01-01")
end_date <- as.Date("2013-12-31")
sub_data <- subset(data, Date >= start_date & Date <= end_date)
ff3_model_Manuf_sub <- lm(Manuf ~ Mkt.RF + SMB + HML, data = sub_data)
summary(ff3_model_Manuf_sub)
##
## Call:
## lm(formula = Manuf ~ Mkt.RF + SMB + HML, data = sub_data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.2989 -1.2507 -0.1515 1.1993 6.3655
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.41952 0.19232 2.181 0.0312 *
## Mkt.RF 1.02569 0.05187 19.775 <2e-16 ***
## SMB -0.08318 0.09898 -0.840 0.4024
## HML -0.17597 0.08113 -2.169 0.0321 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.084 on 116 degrees of freedom
## Multiple R-squared: 0.8101, Adjusted R-squared: 0.8052
## F-statistic: 164.9 on 3 and 116 DF, p-value: < 2.2e-16
coeftest(ff3_model_Manuf_sub, vcov = vcovHC(ff3_model_Manuf_sub, type = "HC1"))
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.419521 0.198571 2.1127 0.03677 *
## Mkt.RF 1.025691 0.058719 17.4678 < 2e-16 ***
## SMB -0.083184 0.105028 -0.7920 0.42997
## HML -0.175968 0.090356 -1.9475 0.05389 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
I will be testing if \({\beta}_3\) has an impact on the Manufacturing portfolio returns.
\({\beta}_3\) represents the coefficient for HML (High minus Low). A \({\beta}_3\) > 0.3 signifies a portfolio composed mainly of value stocks (high book-to-market ratios), a \({\beta}_3\) < 0.3 signifies a portfolio composed of mainly growth stocks (low book-to-market ratios). Value stocks are often perceived as riskier and, thus, tend to outperform growth stocks.
\[ H_0: \hat{\beta}_3 = 0 \quad \text{(The value factor does not impact the Manufacturing portfolio returns)} \] \[ H_1: \hat{\beta}_3 \neq 0 \quad \text{(The value factor impacts the Manufacturing portfolio returns)} \]
We conduct a two-tailed t-test using the estimated coefficients and standard errors from the FF3 regressions:
\[ t_{\text{stat}} = \frac{\hat{\beta}_3 - 0}{SE(\hat{\beta}_3)} \]
The critical value at the 1% significance level for a two-tailed test with \(df = n - k - 1\) degrees of freedom can be obtained from the t-distribution table or a statistical software. For our case with \(n = 120\) and \(k = 3\) explanatory variables in the model (excluding the intercept), the degrees of freedom are \(df = 120 - 3 - 1 = 116\). Thus, the critical value at the 1% significance level is:
\[ t_{\text{crit}} = t_{116} = 2.618 \]
For the sub-period from January 2004 to December 2013, the t-statistic is computed as:
\[ t_{\text{stat, 2004-2013}} = \frac{-0.178902}{0.090061} = -1.986 \]
Since \(|t_{\text{stat, 2004-2013}}| < t_{\text{crit}}\), there is insufficient evidence at the 1% significance level to reject the null hypothesis. Thus, we cannot conclude that the value factor has a significant impact on the Manufacturing portfolio’s returns during this period.
For the sub-period from January 2014 to December 2023, the t-statistic is computed as:
\[ t_{\text{stat, 2014-2023}} = \frac{0.430667}{0.041130} = 10.471 \]
Since \(|t_{\text{stat, 2014-2023}}| > t_{\text{crit}}\), there is sufficient evidence at the 1% significance level to reject the null hypothesis. Therefore, we conclude that the value factor significantly impacts the Manufacturing portfolio’s returns during this period.
For the period from 2004-2013, the calculated t-statistic of HML is -1.986, which is less than the critical t-value of 2.618 at the 1% significance level for a two-tailed test. Therefore, we do not have sufficient evidence to reject the null at the 1% significance level, thus we cannot make any conclusions on the impact of the value factor on manufacturing returns during this period.
For the period from 2014-2023, the calculated t-statistic of HML is 10.471, which exceeds the critical t-value of 2.618 at the 1% significance level for a two-tailed test. Therefore, the evidence strongly rejects the null hypothesis, indicating a significant impact of the value factor on manufacturing returns.
Comparing the two periods, there appears to be a distinct change in the influence of the value factor on manufacturing portfolio returns. In the earlier period, the negative and insignificant coefficient for HML implies that lower book-to-market ratios were not definitively associated with lower manufacturing returns. In contrast, the latter period showed a positive and statistically significant coefficient for HML, suggesting manufacturing stocks with lower book-to-market ratios were associated with higher returns.
data$Date <- as.Date(data$Date, format="%d/%m/%Y")
data2004_2013 <- subset(data, data$Date >= as.Date("2004-01-01") & data$Date <= as.Date("2013-12-31"))
data2014_2023 <- subset(data, data$Date >= as.Date("2014-01-01") & data$Date <= as.Date("2023-12-31"))
run_FF4 <- function(sub_data) {
fit <- lm(Manuf ~ Mkt.RF + SMB + HML + Mom, data = sub_data)
coeftest(fit, vcov. = vcovHC(fit, type = "HC1"))
}
ff4_2004_2013 <- run_FF4(data2004_2013)
ff4_2014_2023 <- run_FF4(data2014_2023)
print(ff4_2004_2013)
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.389187 0.188364 2.0661 0.04106 *
## Mkt.RF 1.067949 0.055453 19.2586 < 2e-16 ***
## SMB -0.111252 0.105898 -1.0506 0.29566
## HML -0.097970 0.094826 -1.0332 0.30370
## Mom 0.141421 0.066856 2.1153 0.03656 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
print(ff4_2014_2023)
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.099731 0.148496 -0.6716 0.5032
## Mkt.RF 0.920860 0.040708 22.6213 < 2.2e-16 ***
## SMB -0.017118 0.060420 -0.2833 0.7774
## HML 0.415757 0.046941 8.8569 1.187e-14 ***
## Mom -0.040912 0.049045 -0.8342 0.4059
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
\[ r_{it} - r_{ft} = \alpha_i + \beta_{i,M}(r_{mt} - r_{ft}) + \beta_{i,SMB}SMB_t + \beta_{i,HML}HML_t + \beta_{i,MOM}MOM_t + \epsilon_{it} \]
The Fama-French Four-Factor Model (FF4) expands on the original Three-Factor Model by adding a fourth factor, Momentum (MOM), to capture the premia associated with stocks that have shown strong performance in the past relative to those that have shown weak performance.
Momentum (MOM) is the new factor in the FF4 model, which captures the tendency of stocks that have performed well in the past to continue performing well in the near term, and conversely, for stocks that have performed poorly to continue underperforming. It is calculated as the difference in returns between stocks with high past returns and those with low past returns.
ff4_model_Manuf <- lm(Manuf ~ Mkt.RF + SMB + HML +Mom, data = data)
summary(ff4_model_Manuf)
##
## Call:
## lm(formula = Manuf ~ Mkt.RF + SMB + HML + Mom, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -8.3429 -1.3170 0.0108 1.4323 5.8185
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.130949 0.133715 0.979 0.32843
## Mkt.RF 0.954856 0.033548 28.462 < 2e-16 ***
## SMB -0.005046 0.057181 -0.088 0.92976
## HML 0.289962 0.043725 6.632 2.26e-10 ***
## Mom 0.087967 0.033576 2.620 0.00937 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.032 on 235 degrees of freedom
## Multiple R-squared: 0.8221, Adjusted R-squared: 0.819
## F-statistic: 271.4 on 4 and 235 DF, p-value: < 2.2e-16
coeftest(ff4_model_Manuf, vcov = vcovHC(ff4_model_Manuf, type = "HC1"))
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.1309495 0.1393347 0.9398 0.34827
## Mkt.RF 0.9548562 0.0409733 23.3044 < 2.2e-16 ***
## SMB -0.0050455 0.0569750 -0.0886 0.92951
## HML 0.2899623 0.0589890 4.9155 1.662e-06 ***
## Mom 0.0879668 0.0388128 2.2664 0.02433 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
start_date <- as.Date("2004-01-01")
end_date <- as.Date("2013-12-31")
sub_data <- subset(data, Date >= start_date & Date <= end_date)
ff4_model_Manuf_sub <- lm(Manuf ~ Mkt.RF + SMB + HML + Mom, data = sub_data)
summary(ff3_model_Manuf_sub)
##
## Call:
## lm(formula = Manuf ~ Mkt.RF + SMB + HML, data = sub_data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.2989 -1.2507 -0.1515 1.1993 6.3655
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.41952 0.19232 2.181 0.0312 *
## Mkt.RF 1.02569 0.05187 19.775 <2e-16 ***
## SMB -0.08318 0.09898 -0.840 0.4024
## HML -0.17597 0.08113 -2.169 0.0321 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.084 on 116 degrees of freedom
## Multiple R-squared: 0.8101, Adjusted R-squared: 0.8052
## F-statistic: 164.9 on 3 and 116 DF, p-value: < 2.2e-16
coeftest(ff4_model_Manuf_sub, vcov = vcovHC(ff4_model_Manuf_sub, type = "HC1"))
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.389187 0.188364 2.0661 0.04106 *
## Mkt.RF 1.067949 0.055453 19.2586 < 2e-16 ***
## SMB -0.111252 0.105898 -1.0506 0.29566
## HML -0.097970 0.094826 -1.0332 0.30370
## Mom 0.141421 0.066856 2.1153 0.03656 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
We will be testing whether adding the extra factor Momentum into the manufacturing returns regression will improve the model or not.
For the Fama-French four-factor model, the hypothesis test is formulated as follows:
The null hypothesis \(H_0: \beta_{4} = 0\) states that the fourth factor (momentum) is not significant, whereas the alternative hypothesis \(H_1: \beta_{4} \neq 0\) states that the fourth factor is significant.
The test statistic \(J_i\) is calculated using the formula:
\[ J_i = \frac{(RSS_{i0} - RSS_{i1})}{(RSS_{i1} / (T - K - 1))} \sim \chi^2_q \]
The critical value follows a chi-squared distribution with 1 regression being tested:
t-crit = 0.45 at the 5% level of significance
Decision Rule: If \(|J_i|\) > t-crit, reject the null hypothesis.
For the sub-period from 2004 to 2013:
\[ J_T = \frac{(489.1782 - 446.4941)}{(446.4941 / (120 - 4 - 1))} = 10.99 \]
With the critical value of the chi-squared distribution \(\chi^2_1 = 0.45\) at the 5% level of significance.
Since \(J_T > \chi^2_1\), there is sufficient evidence to reject the null hypothesis in favor of the alternative hypothesis. Thus, the FF4 model is preferred over the FF3 for this period.
For the sub-period from 2014 to 2023:
\[ J_T = \frac{(302.8616 - 301.0859)}{(301.0859 / (120 - 4 - 1))} = 0.68 \]
Since \(J_T < \chi^2_1\), there is insufficient evidence to reject the null hypothesis. Thus, the FF3 model is preferred over the FF4 for this period.
data$Date <- as.Date(data$Date, format = "%d/%m/%Y")
ff3_model <- lm(Manuf ~ Mkt.RF + SMB + HML, data = data)
ff3_residuals <- residuals(ff3_model)
residuals_df <- data.frame(Date = data$Date, Residuals = ff3_residuals)
ggplot(residuals_df, aes(x = Date, y = Residuals)) +
geom_line(color = "blue") +
theme_minimal() +
labs(title = "Residuals from the FF3 Model for Manufacturing Portfolio",
x = "Date", y = "Residuals") +
scale_x_date(date_breaks = "1 year", date_labels = "%Y")
Clusters of volatility in financial time series often are indications of the market experiencing significant world events which can lead to increased uncertainty (risk). The two distinct periods of volatility occur around 2008 and 2020, where you can see larger spikes in residuals. These could be influenced by and associated with the major financial events including the GFC and COVID. To achieve a clearer picture, you could zoom in on both periods to allow for a more detailed view of the volatility, possibly by using shorter time intervals. In relation to using shorter time intervals, using higher frequency data on returns, say weekly, could help achieve more clarity in revealing patterns. We could also employ an ARCH model to the residuals to model the variability through time. This would provide a measure of the magnitude of volatility as well as its persistence. Diagnostic tests on the ARCH residuals like examining the autocorrelation function (ACF) could help ensure the model has properly captured the structure of the volatility.
The Autoregressive Conditional Heteroskedasticity (ARCH) test is a statistical procedure to analyse time series data for conditional heteroskedasticity — where the variance of the current error term in a regression model depends on the sizes of the previous time periods’ error terms. This type of analysis is useful in financial markets where volatility clustering is common.
In econometrics, the assumption that series are homoskedastic (have constant variance across time) often fails, especially with financial time series data. Financial asset returns typically have volatility that varies through time, which can affect the efficiency of the beta estimates and predictions from linear regression models that assume constant variance.
The presence of ARCH effects can lead to inefficient and biased estimators in these standard models
ff3_model <- lm(Manuf ~ Mkt.RF + SMB + HML, data = data)
residuals_ff3 <- residuals(ff3_model)
arch_test_results <- ArchTest(residuals_ff3, lag = 12, demean = FALSE)
print(arch_test_results)
##
## ARCH LM-test; Null hypothesis: no ARCH effects
##
## data: residuals_ff3
## Chi-squared = 51.809, df = 12, p-value = 6.703e-07
To test for ARCH effects, the residuals from the fitted model are first squared and then regressed on their own lagged values. The test involves checking whether there is a significant relationship between the current squared residuals and their lagged values. If significant, this suggests the presence of ARCH effects. The test can be formally written as follows, where \(\epsilon_t^2\) is modeled as a function of its past squared values:
\[ \epsilon_t^2 = \gamma_0 + \gamma_1 \epsilon_{t-1}^2 + \gamma_2 \epsilon_{t-2}^2 + \cdots + \gamma_{12} \epsilon_{t-12}^2 + v_t \]
The null hypothesis \(H_0\) and the alternative hypothesis \(H_1\) for the ARCH test are:
\[ H_0: \gamma_1 = \gamma_2 = \cdots = \gamma_{12} = 0 \quad (\text{No ARCH}) \] \[ H_1: \text{At least one } \gamma_i \neq 0 \quad (\text{Presence of ARCH}) \]
The critical value follows a \(\chi_{(q)}^2\) distribution and at the 10% level of significance with 12 lags = 6.30
Decision Rule: If \(\text{ARCH}(12)_T\) is greater then \(\chi_{12}^2\) null hypothesis is rejected, it suggests the presence of ARCH effects, indicating that the variance of the error terms changes over time and that the ARCH model (or its extensions like GARCH) may be more appropriate for modeling the data.
The ARCH test can be formalized as follows:
\[ \text{ARCH}(12)_T = T \cdot R_T^2 = 228 \cdot 0.222003 = 50.62 \]
where \(\chi_{12}^2 = 6.30\) at the 10% level of significance.
Since \(\text{ARCH}(12)_T > \chi_{12}^2\), we reject the null hypothesis that there is no autoregressive conditional heteroskedasticity (ARCH), in favor of the alternative hypothesis that ARCH effects are present. This suggests the presence of heteroskedasticity in the residuals.
The ARCH test relates to the assumption of homoskedasticity in the FF3 model. Homoskedasticity means that the error terms of the regression model have constant variance across all observations. The presence of ARCH effects suggests that the variance of the error terms changes over time, which is a form of heteroskedasticity. Given the ARCH test results we can conclude that the homoskedasticity assumption of the FF3 model does not hold over the full sample period. Since the p-value is significantly below the 10% threshold, there is strong evidence of conditional heteroskedasticity in the residuals. This finding implies that the variance of the error terms are not constant and may depend on past values of the error terms themselves. In financial time series, this often corresponds to periods of volatility clustering, where large changes in returns (positive or negative) are followed by large changes, and small changes are followed by small changes. Considering the violation of the homoskedasticity assumption, the standard errors of the regression coefficients in the FF3 model may not be accurate, which affects hypothesis testing and confidence intervals.
Modelling ARCH effects are crucial for accurate forecasting and risk aversion in financial markets. Correctly specifying the volatility dynamics can lead to better hedging strategies, option pricing, and risk assessment, enhancing the overall investment decision-making process.
This report has provided a detailed analysis of industry-specific portfolios using advanced statistical models such as CAPM, Fama-French three-factor, and four-factor models. We have also addressed the intricacies of heteroskedasticity with ARCH testing to enhance our understanding of the risk dynamics within these portfolios.
Key findings demonstrate the diverse behaviors of different industry portfolios under market stress and their varied responses to economic factors. While some portfolios, such as Health and High Tech, show distinct patterns of behavior in response to market changes, others like Manufacturing exhibit a more consistent alignment with market movements. The Consumer and High Tech sectors showed strong performance metrics, while the Manufacturing sector aligned closely with market benchmarks, highlighting potential stability or predictability in its returns. In contrast, the Health and Other sectors exhibited unique challenges and opportunities, underscoring the importance of sector-specific strategies in portfolio management.
Furthermore, the detection of ARCH effects in the residual analysis from our regression models indicates the presence of timepvarying volatility, a critical consideration for risk management and portfolio strategy.
The insights derived from this study are important for portfolio managers and investors seeking to optimise their investment strategies in a dynamic market.
This concludes the portfolio analysis report.
Nathan Foale
Email: nfoa0001@student.monash.edu