Executive Summary

The project constructs 4 strategies of longing S&P 500 index and shorting the prevailing short rate and different treasury rates from 1973/01/01 to 2015/01/01. In each strategy we computed arithmetic and geometric rate of return and concluded that the 5-year strategy works better than the other three strategies.

Key Question

1.What was the average arithmetic and geometric historical mean rate of return for daily returns, for monthly returns, for annual returns, and for 5-year returns from 1/1/1973 through 1/1/2015?

2.What was the excess rates of return above the prevailing short rate, the 30-day Treasury rate, the 1-year Treasury rate, and the 5-year Treasury rates?

3.Does overlapping the longer-term series lead to different inference?

Summary Statistics

The average arithmetic and geometric rate of return of S&P 500 and excess return above the prevailing short rate, the 30-day Treasury rate, the 1-year Treasury rate, and the 5-year Treasury rates are listed in the following table:

S&P 500 arithmetic mean geometric mean
daily 0.1133 0.1034
monthly 0.1109 0.1035
1-year 0.1193 0.1035
5-year 0.1878 0.1221
excess return arithmetic mean geometric mean
daily 0.0497 0.0355
monthly 0.0624 0.0514
1-year 0.0498 0.0339
5-year 0.0817 0.0532

Methodology

Data Resource

1.The S&P 500 daily returns are imported from Wrds CRSP-Index/S&P 500 Indexes daily Value-weighted Return. (includes distributions)

2.The prevailing short rates are imported from Wrds Federal Reserve Bank-Federal Fund Effective Rates.

3.The 30-day Treasury rates are imported from Wrds CRSP-Treasury-Riskfree Series-Monthly Annualized Yield calculated from nominal price.

4.The 1-year and 5-year treasury rates are imported from Wrds Federal Reserve Bank-Treasury constant maturity/nominal, maturity = 1 and maturity = 5.

Computation Method

1.The average rate of return of S&P 500 Index is calculated by the equation:

(a)Compute period return

\[R_{period}=\prod^{n_1}_{i = 1}(1+r_i)-1\] In which \(n_1\) means the number of daily returns needed to calculate the period return.

(b)Compute arithmetic average annualized period return

\[R_{arith-period} = \frac{\sum^{n_2}_{i=1}R_{period_i}}{n_2}*m\] In which \(n_2\) means the number of period returns and \(m\) means the number needed to annualize the period return.

(c)Compute geometric average annualized period return

\[R_{geo-period}=(R_{period_i}+1)^{\frac{m}{n_2}}-1\]

2.The average excess rate of return is calculated by the equation:

(a)Calculate the excess daily return

\[R_{excess} = r_{SP500}-r_{f}\]

Step (b)(c)(d) are the same as step (a)(b)(c) in part 1.

Computer Code

library(zoo)
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(xts)
library(data.table)
## 
## Attaching package: 'data.table'
## The following objects are masked from 'package:xts':
## 
##     first, last
#Process data
fn <- paste("C:/Users/bingj/Google Drive/2018 WINTER/Corporate Finance and Risk Management/","S&P 500.csv",sep = "")
sp500 <- fread(fn)
sp500$caldt <- as.Date(sp500$caldt)
sp500 <- xts(sp500$vwretd,order.by = sp500$caldt)

tRate <- fread("C:/Users/bingj/Google Drive/2018 WINTER/Corporate Finance and Risk Management/tRate2.csv")
tRate$date <- as.Date(tRate$date)
tRate <- xts(tRate[,2:4],order.by = tRate$date)
tRate <- tRate/100/252

monthlyRate <- fread("C:/Users/bingj/Google Drive/2018 WINTER/Corporate Finance and Risk Management/riskfreemonth.csv")
monthlyRate$MCALDT <- as.Date(monthlyRate$MCALDT)
monthlyRate <- xts(monthlyRate$TMYTM,order.by = monthlyRate$MCALDT)
monthlyRate <- monthlyRate/12/100


#Compute S&P 500 return
gMean <- function(data,na.rm = TRUE){
  data <- na.omit(data)
  gm <- prod(data+1)^(1/length(data))-1
  return(gm)
}

sp500_daily <- sp500
sp500_monthly <- apply.monthly(sp500+1,prod)-1
sp500_yearly <- apply.yearly(sp500+1,prod)-1
index <- endpoints(sp500_yearly,"years",5)
sp500_5y <- vector()
for (i in 1:(length(index)-2)){
  sp500_5y[i] <- prod(sp500_yearly[(index[i+1]+1):(index[i+2])]+1)-1
}
sp500_daily_ari <- mean(sp500_daily)*252
sp500_monthly_ari <- mean(sp500_monthly)*12
sp500_yearly_ari <- mean(sp500_yearly)
sp500_5y_ari <- mean(sp500_5y)/5

sp500_daily_geo <- (gMean(sp500_daily)+1)^252-1
sp500_monthly_geo <- (gMean(sp500_monthly)+1)^12-1
sp500_yearly_geo <- gMean(sp500_yearly)
sp500_5y_geo <- (gMean(sp500_5y)+1)^(1/5)-1
sp500_summary <- data.frame(sp500_daily_ari,sp500_daily_geo,sp500_monthly_ari,sp500_monthly_geo,
                            sp500_yearly_ari,sp500_yearly_geo,sp500_5y_ari,sp500_5y_geo)
print(sp500_summary)
##   sp500_daily_ari sp500_daily_geo sp500_monthly_ari sp500_monthly_geo
## 1       0.1133416       0.1033694         0.1109121         0.1035028
##   sp500_yearly_ari sp500_yearly_geo sp500_5y_ari sp500_5y_geo
## 1        0.1192816        0.1035028    0.1878374    0.1220949
#Compute Excess Return
excess_rtn <- data.frame()
for(i in 1:ncol(tRate)){
  a <- sp500-tRate[,i]
  excess_rtn <- cbind(excess_rtn,a)
}
names(excess_rtn) <- names(tRate)
excess_rtn_daily <- excess_rtn[,"FF_O"]
excess_rtn_monthly <- sp500_monthly-monthlyRate
excess_rtn_yearly <- apply.yearly(excess_rtn[,"TCMNOM_Y1"]+1,prod,na.rm = T)-1
index2 <- endpoints(excess_rtn_yearly,"years",5)
excess_rtn_5y <- data.frame()
for (i in 1:(length(index2)-2)){
  excess_rtn_5y <- c(excess_rtn_5y,prod(excess_rtn_yearly[(index2[i+1]+1):index2[i+2],]+1,na.rm = T)-1)
}
excess_rtn_5y <- unlist(excess_rtn_5y)
names(excess_rtn_5y) <- names(excess_rtn)

excess_rtn_daily_ari <- mean(excess_rtn_daily,na.rm = T)*252
excess_rtn_monthly_ari <- mean(excess_rtn_monthly)*12
excess_rtn_yearly_ari <- mean(excess_rtn_yearly)
excess_rtn_5y_ari <- mean(excess_rtn_5y)/5

excess_rtn_daily_geo <- (gMean(excess_rtn_daily)+1)^252-1
excess_rtn_monthly_geo <- (gMean(excess_rtn_monthly)+1)^12-1
excess_rtn_yearly_geo <- gMean(excess_rtn_yearly)
excess_rtn_5y_geo <- (gMean(excess_rtn_5y)+1)^(1/5)-1

excess_rtn_summary <- data.frame(excess_rtn_daily_ari,excess_rtn_daily_geo,excess_rtn_monthly_ari,excess_rtn_monthly_geo,excess_rtn_yearly_ari,excess_rtn_yearly_geo,excess_rtn_5y_ari,excess_rtn_5y_geo)
print(excess_rtn_summary)
##   excess_rtn_daily_ari excess_rtn_daily_geo excess_rtn_monthly_ari
## 1           0.04972862           0.03550732             0.06235727
##   excess_rtn_monthly_geo excess_rtn_yearly_ari excess_rtn_yearly_geo
## 1              0.0514069            0.04980363            0.03389081
##   excess_rtn_5y_ari excess_rtn_5y_geo
## 1          0.081677        0.05320609

Conclusion

The average 5-year return of S&P 500 and excess return over the treasury 5-year rate are higher than the other returns from 1/1/1973 through 1/1/2015. So the strategy of longing S&P 500 and shorting treasury 5-year rate performs better than the other strategies. So overlapping the longer-term series does actually lead to different inference.