Single Index Model
Amath 462/Econ 424
Eric Zivot
Summer 2013
Updated: August 15, 2013

© Eric Zivot 2006

Example Data
Monthly continuously compounded returns on S&P
500, Starbucks, Microsoft, Nordstrom and Boeing from
1/1/98 – 1/1/2003 (5 years off monthly
thl ddata)t )> head(si.df)
sp500
sbuxsbumsft
s t
nordo dboeingboeg
1998-02-01 0.05744 0.06079 0.14155 0.31280 0.08202
1998-03-01 0.05484 0.19625 0.12835 -0.07138 -0.21923
1998-04-01 0.04019 -0.07471 0.23258 0.18243 0.061031998-05-01 -0.03282 0.01524 -0.15346 -0.03172 0.03069
1998-06-01 0.03806 0.05947 0.17738 0.01545 -0.04702
1998-07-01 0.03724 0.27495 -0.09734 -0.14975 0.17825© Eric Zivot 2006

Example Data: Returns© Eric Zivot 2006

Distribution of Market Returns© Eric Zivot 2006

Rsbux   sbux   sbux RM   sbux

sbux = 0.67

-00.2

returns

0.00.2Monthlyy cc returns on S&P 500 and Starbucks-0.4
4

SBUX and SP500 move together

S&P 500
SBUX
1999

2000

2001
Index© Eric Zivot 2006

2002

2003

Rsbux   sbux   sbux RM   sbux ,  sbux ~ N (0,  2, sbux )sbux,tsbux = 0.018
0 018 = intercept
Note: sbux = 0.13 is
the typical size of sbux

sbux = 0.67 = slope
R2 = 0.06 = percent ofRsbux explained by Rsp500© Eric Zivot 2006

Beta = 1.7

0.0-0..2-0.4
4

returns

0.2

Monthly cc returns on S&P 500 and Microsoft

S&P 500
MSFT1999

2000

2001
Index

© Eric Zivot 2006

20022003

Rmsft   msft   msft RM   msft

msft = 1.7 = slope
R2 = 0.386© Eric Zivot 2006

Beta = 1.5

0.0
-0.1
-0.2-0..3

returns

0.1

0.2

0.3

Monthly cc returns on S&P 500 and Nordstrom

S&P 500
NORD
1999

2000

2001
Index

© Eric Zivot 2006

2002

2003

Rnord   nord   nord RM   nord

nord = 1.5 = slope
R2 = 0.328© Eric Zivot 2006

Beta = 0.64

-0.1
-0.2
-0.3-0..4

returns

0.0

0.1

0.2
2

Monthly cc returns on S&P 500 and Boeing

1999

2000

2001
Index

© Eric Zivot 2006

20022003

Rboeing   boeing  boeing RM   boeing

Beta = 0.64

boeing = 0.6 = slope
R2 = 0.086© Eric Zivot 2006

SI Model for MSFT with =0 and =1

msft with =0and =1© Eric Zivot 2006

SI Model Fit by Least Squares

SI model with =0, =1

SI model fit by least squares
=0.001, = 1.67

© Eric Zivot 2006

Example Data
Monthly continuously compounded returns on S&P
500, Starbucks, Microsoft, Nordstrom and Boeing> head(si.df)
h d( i df)
sp500
sbuxmsftnordboeing
1 0.05744 0.06079 0.14155 0.31280 0.08202
2 00.05484
05484 00.19625
19625 00.12835
12835 -0.07138
0 07138 -0.21923
0 21923
3 0.04019 -0.07471 0.23258 0.18243 0.06103
4 -0.03282 0.01524 -0.15346 -0.03172 0.03069
5 0.03806 0.05947 0.17738 0.01545 -0.04702
0.04702
6 0.03724 0.27495 -0.09734 -0.14975 0.17825> colnames(si.df)[1] "sp500" "sbux""msft"© Eric Zivot 2006

"nord""boeing"Least Squares in R
> msft.fit = lm(msft~sp500,data=si.df)> class(msft.fit)[1] "lm“lm> names(msft.fit)[1] "coefficients" "residuals"[5] "fitt"fitted.values"dl" ""assign"i ""df.residual"[9] "xlevels""call"> msft.fit$coef(Intercept)
sp500
0.001199
1.697067

̂ˆ© Eric Zivot 2006

"effects“""qr"""rank""terms”"model"LM Print Method> msft.fitCall:lm(formula = msft ~ sp500, data = si.df)
Coefficients:(Intercept)
0.0012

̂sp500
1.6971ˆ© Eric Zivot 2006

LM Summary Method> summary(msft.fit)
Call:lm(formula = msft ~ sp500, data = si.df)
Residuals:
Min
1Q-0.3690 -0.0540

Median0.0050

3Q0.0469

Max0.2828

SE (ˆ )SE(ˆ )

Coefficients:
Estimate Std. Error t value Pr(>|t|)(Intercept)
00.00120012
0.01400 0140
0.09
0 09
0.93
0 93
sp500
1.69710.28086.04 1.2e-07 ***--Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’
Residual standard error: 0.109 on 58 degrees of freedom
Multiple R-squared: 0.386, Adjusted R-squared: 0.376
F-statistic:
Fstatistic: 36.5 on 1 and 58 DF, p-value:
p value: 1.16e-07
1.16e 07
R2
© Eric Zivot 2006

ˆScatterplot with Regression Line> plot(si.df$sp500, si.df$msft, pch=16, lwd=2, col="blue")> abline(msft.fit, col="orange", lwd=2)> abline(h=0, v=0)
© Eric Zivot 2006

95% Confidence Intervals

ˆ  2  SE ( ˆ )1 697  2  (01.697(0.2808)
2808)
 [[1.135,, 2.259]]
Note: 95%% confidence interval is pprettyy big!
g=>  is not very precisely estimated forindividual stocks© Eric Zivot 2006

Confidence Intervals In R

> confint(msft.fit, level=0.95)
2 5 % 97
2.597.5
5 %(Intercept) -0.02688 0.02928
sp500
p1.13489 2.25925© Eric Zivot 2006

LM Extractor Functions> coef(msft.fit)(Intercept)
sp500
0.001199
1.697067

ˆ t  R t  ˆ  ˆ R M t> residuals(msftresiduals(msft.fit)[1:5]fit)[1:5]
1998-02-01 1998-03-01 1998-04-01 1998-05-01 1998-06-01
0.04286
0.03408
0.16318-0.09897
0.11159

R t  ˆ   R M t> fitted(msft.fit)[1:5]
1998-02-01 1998-03-01 1998-04-01 1998-05-01 1998-06-01
0.09869
0.09427
0.06941-0.05449
0.06579ˆ© Eric Zivot 2006

ˆ

SI Model for 4 Asset Portfolio> port = (si.df$sbux + si.df$msft + si.df$nord ++si.df$boeing)/4> new.data
new data = data.frame(si.df,port)
data frame(si df port)> port.fit = lm(port~sp500,data=new.data)> summary(port.fit)
Call: lm(formula = port ~ sp500, data = new.data)
Residuals:
Min1QMedian
3Q
Max-0.1776 -0.03609 -0.002005 0.04635 0.1264
Coefficients:
Value Std
Std. Error t value Pr(>|t|)(Intercept) 0.0065 0.0075
0.8616 0.3924
sp500 1.1276 0.1510
7.4668 0.0000
Residual standard error: 0.05842 on 58 degrees of freedom
Multiple R-Squared: 0.4901© Eric Zivot 2006 = 1.27, R2 = 0.49

© Eric Zivot 2006

Portfolio Beta
# show beta of portfolio = weighted avg of individual betas> beta.sbux = coef(lm(sbux~sp500,data=si.df))[2]> beta.msft = coef(lm(msft~sp500,data=si.df))[2]> beta.nord = coef(lm(nordcoef(lm(nord~sp500,data=si.df))[2]
sp500,data si.df))[2]> beta.boeing = coef(lm(boeing~sp500,data=si.df))[2]> (beta.sbux + beta.msft + beta.nord + beta.boeing)/4
sp500
500
1.127567> coef(port.fit)[2](p)[ ]
sp500
1.127567© Eric Zivot 2006

Single Index Model Fit
Asset

SE()

R2

Boeing
g

0.638

0.273

0.106

0.09

Msft

1.697

0.281

0.109

0.39

Nord1.508

0.283

0.110

0.33

Sbux

0 667
0.667

0 342
0.342

0 132
0.132

0 06
0.06

port

1.128

0.151

0.058

0.49

© Eric Zivot 2006

Single stocks vs. portfolio• Portfolio  is closer to 1
• Portfolio is estimated more p
preciselyy ((SEis smaller)• Portfolio  is smaller (diversificationeffect)• Portfolio R2 is higher (diversification effect)© Eric Zivot 2006

Estimating Covariances> beta.vec
SBUXMSFTNORD BOEING
0.6666 1.6971 1.5080 0.6386> sig2.sp500[1] 0.002537> cov.market = sig2.sp500*(beta.vec%*%t(beta.vec))> cov.market
SBUXMSFTNORD
BOEING[1,] 0.001127 0.002870 0.002550 0.001080[2 ] 0[2,]0.002870
002870 00.007307
007307 00.006493
006493 00.002750
002750[3,] 0.002550 0.006493 0.005769 0.002443[4,] 0.001080 0.002750 0.002443 0.001035© Eric Zivot 2006

Estimating Covariances> D.mat =diag(c(sig2e.sbux,sig2e.msft,sig2e.nord,sig2e.boeing))> DD.matt[,1]
[,2]
[,3]
[,4]
[1,] 0.01719 0.00000 0.00000 0.00000[2 ] 0[2,]0.00000
00000 00.01161
01161 00.00000
00000 00.00000
00000[3,] 0.00000 0.00000 0.01179 0.00000[4,] 0.00000 0.00000 0.00000 0.01101> cov.si = cov.market + D.mat> cov.si
SBUX
MSFT
NORD
BOEING[1,] 0.01832 0.002870 0.002550 0.001080[2,] 0.00287 0.018913 0.006493 0.002750[3,] 0.00255 0.006493 0.017564 0.002443[4,] 0.00108 0.002750 0.002443 0.012045© Eric Zivot 2006

Estimating Covariances# compare with sample covariance matrix> print(cov.hat,digits=4)
i t(h t di it 4)
sbux
msft
nord
boeingsbux 0.0183176 0.0055003 0.002735 0.0001221
msft 0.0055003
0 0055003 00.0189132
0189132 0
0.006987
006987 00.0001189
0001189
nord 0.0027354 0.0069870 0.017564 0.0037662
boeing 0.0001221 0.0001189 0.003766 0.0120446> print(cov.si,digits=4)
SBUX
MSFT
NORD
BOEING[1,] 0.01832 0.002870 0.002550 0.001080[2,] 0.00287 0.018913 0.006493 0.002750[3,] 0.00255 0.006493 0.017564 0.002443[4,] 0.00108 0.002750 0.002443 0.012045© Eric Zivot 2006

Estimating Correlations> print(cor.hat,digits=4)
sbux
msft
nord
boeingsbux 1.000000 0.295506 0.1525 0.008218
msft 0.295506 1.000000 0.3833 0.007876
nord 0.152500 0.383348 1.0000 0.258940
boeing 0.008218 0.007876 0.2589 1.000000> print(cor.si,digits=4)
sbsbuxmsft
nord boeing
sbux 1.00000 0.1542 0.1422 0.07271
msft 0.15419 1.0000 0.3562 0.18218
nord 0.14218
0 14218 00.3562
3562 11.0000
0000 00.16798
16798
boeing 0.07271 0.1822 0.1680 1.00000© Eric Zivot 2006

Minimum Variance Portfolios# use sample covariance matrix> mu.hat = colMeans(si.df[, 2:5])> gmin.port.sample = globalMin.portfolio(muhat, cov.hat)> gmin.port.sample
Call:globalMin.portfolio(er = muhat, cov.mat = cov.hat)Portfolio expected return:Portfolio
o t o o sta
standardda d dedeviation:
at o :
Portfolio weights:
sbux
msft
nord boeing
0.2410 0.1907 0.1252 0.4430

0.005430.07655# use single index model covariance matrix> gmin.port.si = globalMin.portfolio(muhat, cov.si)> gmin.port.si
Call:globalMin.portfolio(er = muhat, cov.mat = cov.si)
Portfolio expected return:Portfolio standard deviation:
Portfolio weights:
sbux
msft
nord boeing
0.2528 0.1545 0.1918 0.4009

0.0057840.07743© Eric Zivot 2006

Minimum Variance Portfolio Weights© Eric Zivot 2006

t-Values
In the R summary output, the t values are t-statistics fort ti thetestingth hypothesishth i ththatt theth truetcoefficientffi i t isi equall ttozero

ˆ
.0012
t 0 
 .0855
SE (ˆ ) .0140
0140
ˆ
1.6971t 0 
 6.0426
SE ( ˆ ) .2808© Eric Zivot 2006

T-Stats for Specific Values
H 0 :  i  1 (asset has same risk as market)
H 1 :  i  1 (asset risk is different than market)> msft.summaryft= summary(msft.fit)( ft fit)> names(msft.summary)[1] "call""terms"[5] "aliased""sigma"[9] ""adj.r.squared"
djd" "f"fstatistic"t ti ti ""residuals""df"""cov.unscaled"l d""coefficients""r.squared"> msft.summary$coef
Estimate Std. Error t value Pr(>|t|)(I t(Intercept)t) 0.001199
0 001199
00.01403
01403 00.08545
08545 99.322e-01
322 01sp500
1.697067
0.28085 6.04264 1.159e-07> colnames(msft.summary$coef)[1] "Estimate""Std. Error" "t value""Pr(>|t|)"> se.betab t = msft.summary$coef[2,ft$
f[2 "Std"Std. Error"]E"]# t-stat for beta = 1> t.stat = (coef(msft.fit)[2] - 1)/se.beta> t.statt stat
sp500
2.482
© Eric Zivot 2006

In the Single Index model the errors should behave like White Noise© Eric Zivot 2006

In the Single Index model the errors should be Normally Distributed© Eric Zivot 2006

In the Single Index model the errors should behave like White Noise© Eric Zivot 2006

Rolling Regression# Use PerformanceAnalytics
yfunction# chart.RollingRegression for 24-month rolling regression> chart.RollingRegression(si.z[,"msft",drop=F],+
si z[ "sp500" drop=F] width=24)
si.z[,"sp500",drop=F],# Add horizonal line at full sample regression estimate> abline(h=beta.vals["msft"], lwd=2, col="red")© Eric Zivot 2006

24 month rolling ’s for MSFT

Full sample : 1.69

Full sample  = 1.7

24 month rolling ’s for SBUX

Full sample  = 0.67

24 month rolling ’s for NORD

Full sample  = 1.5

24 month rolling ’s for Boeing

Full sample  = 0.64