Testing predictability of stock returns using Fama-French approach 2018-04-23T13:16:05+00:00

Project Description

This is a mimic of an approach of Fama and French. They tested whether we can predict stock returns based on past data. Fama (1970) wrote: "A market in which prices always “fully reflect” available information is called “efficient”". Similarly, Jensen (1978) wrote: "A market is efficient with respect to information set X if it is impossible to make economic profitsby trading on the basis of information set X" .

This is just a replication of those and related papers where different researches proved that and maintained that efficient market hypothesis works.

Hansen–Jagannathan bound

Hansen–Jagannathan bound is a theorem in financial economics that says that the ratio of the standard deviation of a stochastic discount factor to its mean exceeds the Sharpe ratio attained by any portfolio. This result applies, among others, the Cauchy–Schwarz inequality.

This is based on the paper of Fama and French (1993). On related research topics, researchers found that if arbitrage opportunity exists, it won't exist for long (because sooner or later everyone would start exploiting it).

The Hansen-Jagannathan bound is calculated by first choosing (a class of) mt+1. Then we estimate​​ E(mt+1),​​ Var(mt+1),​​ ERt+1​​ and​​ Cov(Rt+1).

Then we find the Hansen-Jagannathan bound by:

Varmt+1β'CovRt+1β= ιJ-E(mt+1)ERt+1'Cov-1Rt+1ιJ-E(mt+1)ERt+1

Where:

  • J … number of asset portfolios. In our case J=5 because we took 4 industry portfolios and SML (small minus big factor)

  • mt+1… is the stochastic discount factor. It has one value every period so its size is 1x360

  • Rt+1… matrix with returns (5 asset portfolios times 360 time periods; 5x360)

  • CovRt+1… Variance-covariance matrix of returns (size 5x5)

We chose values of​​ E(mt+1)​​ to be between 0 and 1.5. ​​ We took a step size of 0.001 (so we made 1500 steps). The other values were calculated in our sample (we took 4 industry portfolios, namely consumer nondurables, consumer durables, manufacturing and energy portfolio and Fama-French SML factor). We tested that with r studio and we were interested in mean stochastic discount factor and standard deviation of the stochastic discount factor. We plot the results and got the following graph:

Next, we also drew a stohastic discount factor of CAPM model. We got an expectation of​​ 0.8044699​​ and standard deviation of​​ 0.0614768. We also calculated estimators of the Fama-French three factor model and also expectation (1.182032)​​ and standard deviation (0.3550003). Variance of the stochastic discount factor must be above the Hansen-Jagannathan bound. We draw the results on already plotted graph;

We can see that stochastic discount factor based on CAPM (mt+1CAPM​​ ) does not satisfy the equation​​ 

Varmt+1CAPMβ'CovRt+1β= ιJ-E(mt+1CAPM)ERt+1'Cov-1Rt+1ιJ-E(mt+1CAPM)ERt+1

Because

​​ Varmt+1CAPM=0.0038<ιJ-E(mt+1CAPM)ERt+1'Cov-1Rt+1ιJ-E(mt+1CAPM)ERt+1=0.09751207

 

Stohastic discount factor based on Fama and French three factor model (mt+1FF)​​ on the other hand satisfies the equation. We get

Varmt+1FF= 0.1260β'CovRt+1β= ιJ-Emt+1FFERt+1'Cov-1Rt+1ιJ-Emt+1FFERt+1=0.1023519

As a result we conclude stochastic discount factor based on Fama-French three factor model​​ satisfies Hansen-Jagannathan and stochastic discount factor based on CAPM model does not satisfy Hansen-Jagannathan.​​ 

Testing predictability of stock returns

 

Here we focus on past returns. We used the same portfolios as before, namely consumer nondurables, consumer durables, manufacturing and energy portfolio. We also used SML (small minus big) and HML (high minus low) Fama-French factors. While using monthly data, we used one, two, three and four month past returns. We are testing return predictability in​​ the asset returns using past returns:

Model:

Ri,t+1= α+ βRi,t+ ϵi,t+1

H0: No return predictability;​​ β=0

H1: there is return predictability when using past returns;​​ β0

In order to test our hypothesis we do a regression of current return on past returns. We do the following​​ regressions:

Ri,t​​ is return of portfolio​​ i​​ in month t. The past return over the last​​ k​​ months is​​ Ri,t-1km. It holds that:

1+Ri,t-1km=1+Ri,t-1*1+Ri,t-2**(1+Ri,t-k). i is the portfolio, so i includes numbers​​ i={1,2,3,4,5,6}​​ (5 and 6 are for SML and HML)

  • 1+Ri,t= α+ β1+Ri,t-1+ ϵi,t ​​​​ for t=2,3,…,360. And​​ E(ϵi,t11+Ri,t-1)=0 t,i

  • 1+Ri,t= α+ β1+Ri,t-12m+ ϵi,t ​​​​ for t=3,4,…,360. And​​ E(ϵi,t11+Ri,t-1m)=0 t,i

  • 1+Ri,t= α+ β1+Ri,t-13m+ ϵi,t ​​​​ for t=4,5,…,360. And​​ E(ϵi,t11+Ri,t-13m)=0 t,i

  • 1+Ri,t= α+ β1+Ri,t-14m+ ϵi,t ​​​​ for t=5,6,…,360. And​​ E(ϵi,t11+Ri,t-14m)=0 t,i

 

Assumptions (beside already stated) are: time series​​ Rt​​ satisfies stationarity and ergodicity.

When we are regressing only a return on previous month we must used heteroscedasticity consistent estimator (Eicker–Huber–White estimator) and Newey-West estimator. We obtain the following results:

Table 1: Testing predictability of asset returns

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ returns

 

portfolio

1+Ri,t-1

1+Ri,t-12m

1+Ri,t-13m

1+Ri,t-14m

Consumer nondurables portfolio

.0858332

(.0596907)

.4940756

(.02552)

.316218 (.0254519)

.2262744 (.0228671)

Consumer durables portfolio

.1215562 (.0667638)

.5016395 (.0295277)

.3091223

(.0278729)

.2352102 (.0210257)

Manufacturing portfolio

.0553865 (.0660072)

.4962832

(.0293641)

.3152116 (.0319924)

.2360745 (.0271636)

Energy portfolio

-.0279207 (.0650193)

.492861

(.0251402)

.330025

(.0262667)

.2381039 (.0248111)

HML portfolio

​​ .1372222

(.0829833)

.4921031

(.0209439)

.3171294 (.0222609)

​​ .2379676

(.0214832)

SMB portfolio

-.0378716 (.1203001)

.5124551

(.0382973)

.349654 (.0331835)

.2470505 ​​ 

(.0410208)

Results of the regression of testing predictability of returns. The numbers stated are coeficient β and numbers in brackets are t-statistics that are testing H0:​​ β=0. H0​​ is rejected if absolute value of t-statistic is higher than 1.96.

We can that for all observed cases (for all observed portfolios in our period, including all sub periods) it holds that current return does not depend on past returns (because we cannot reject the null hypothesis). That means that we confirm the hypothesis of non-predictability​​ of stock returns for all six portfolios. We cannot explain current return based on past returns.

R studio code:

 

 

Calculating Hansen-Jagannathan bound and CAPM and Fama-French three factor model SDFs. Also plotting graphs;

 

data1 <-​​ read.table(“fama&french_monthly.txt", header=TRUE, quote="\"")

data2 <- read.table(“monthly2.txt", quote="\"")

install.packages('car')

# require('car')

k = data2[,2:6]

b = data1[,3]

# Getting the right data in data frame (called matrika).

matrika <- k

matrika[,5] <- b

# Calculate covariance

kov <- cov(matrika[1:360,1:5])

# Vector of ones.

one <- c(1, 1, 1, 1,1)

vektor = matrix(1,150,1)

a1 = mean(matrika[1: nrow(matrika),1])

a2 = mean(matrika[1: nrow(matrika),2])

a3 = mean(matrika[1: nrow(matrika),3])

a4 =​​ mean(matrika[1: nrow(matrika),4])

a5 <- mean(matrika[1: nrow(matrika),5])

# Create vector of means.

sredina <- c(a1, a2, a3, a4,a5)

i <- 1

# Below we get vector of deviations like in Hansen-Jagannathan.

while (i<=1500){

 ​​​​ vektor[i] <- t(one-i*0.001*sredina)%*%solve(kov)%*%(one-i*0.001*sredina)

 ​​​​ vektor[i] <- sqrt(vektor[i])

 ​​​​ i <- i + 1

}

vec2 = seq(from=0, to=1.499, by=0.001)

 

 

# We plot everything

plot(vec2,vektor,col="red",xlab="mean ",ylab="Standard deviation")

legend("topright", "Hansen-Jagannathan​​ bound",

 ​​ ​​ ​​ ​​ ​​ ​​​​ pch = 15, col = 'red', title = "Legend")

 

 

 

plot(vec2,vektor,col="red", xlim=c(0,1.5), ylim=c(0,0.5),xlab="mean ",ylab="Standard deviation")

 

# discount factors were obtained from elsewhere (see Stata code below).

# CAPM discount factor

b0 <-.794951​​ 

b1 <- ​​ .0136277​​ 

point1 <- b0 + b1 * homework[,2]

povprecje <-mean(point1)

deviation <- sd(point1)

points(povprecje, deviation,col="blue", ​​ pch = 19)

 

#Fama-French three factor model

beta0 <- 1.177317 ​​ 

beta1 <- -.026906 ​​ 

beta2 <- .1154602​​ 

beta3 <- ​​ .0560836  ​​​​ 

threefactor <- beta0 + beta1 * data1 [,2] + beta2 * data1 [,3]+beta3 * data1 [,4]

povpt <- mean(threefactor)

dev <- sd(threefactor)

points(povpt, dev,col="green", ​​ pch = 19)

legend("topright", c("Hansen-Jagannathan bound",

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​  ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ "SDF by CAPM","SDF by Fama-French 3 factor"),

pch = c(15,19,19), col = c('red',"blue","green"), title = "Legend")

 

 

 

Stata code:

Testing predictability of stock returns;

Here we edit the data and apply the aforementioned equations to test​​ predictability;

*opisi data

use "\\studfiles.campus.uvt.nl\files\home\home07\u1268030\empirical finance\included\saved.dta", clear

 

tsset year

** get percentage returns.

g nodur1 = 1+ nodur/100

g durb1 = 1 + durbl/100

g manuf1 = 1 + manuf/100

g enrgy1 = 1​​ +enrgy/100

g mkt_rf1 = 1 + mkt_rf/100

g SMB1 = 1 + SMB/100

g HML1 = 1 + HML/100

 

** Set up equations with lags.

g rSMB2m = SMB1 * l.SMB1

g rSMB3m = SMB1* l.SMB1 * l.l.SMB1

g rSMB4m = SMB1* l.SMB1 * l.l.SMB1 * l.l.l.SMB1

 

g rnodur2m = nodur1 * l.nodur1

g​​ rnodur3m = nodur1 * l.nodur1 * l.l.nodur1

g rnodur4m = nodur1 * l.nodur1 * l.l.nodur1 * l.l.l.nodur1

 

 

g rdurb2m = durb1 * l.durb1

g rdurb3m = durb1 * l.durb1 * l.l.durb1

g rdurb4m = durb1 * l.durb1 * l.l.durb1 * l.l.l.durb1

 

g rmanuf2m = manuf1 * l.manuf1

g rmanuf3m = manuf1 * l.manuf1 * l.l.manuf1

g rmanuf4m = manuf1 * l.manuf1 * l.l.manuf1 * l.l.l.manuf1

 

g rmkr_rf2m = mkt_rf1 * l.mkt_rf1​​ 

g rmkt_rf3m = mkt_rf1 * l.mkt_rf1 * l.l.mkt_rf1

g rmkt_rf4m = mkt_rf1 * l.mkt_rf1 * l.l.mkt_rf1 * l.l.l.mkt_rf1

 

g rHML2m = HML1 * l.HML1

g rHML3m = HML1 * l.HML1 * l.l.HML1

g rHML4m = HML1 * l.HML1 * l.l.HML1 * l.l.l.HML1

 

g renrgy2m = enrgy1 * l.enrgy1

g renrgy3m = enrgy1 * l.enrgy1 * l.l.enrgy1

g renrgy4m = enrgy1 * l.enrgy1 * l.l.enrgy1 * l.l.l.enrgy1

 

** Regress and use estimators to get relevant statistics.

reg nodur1 l.nodur1, robust

 

 

newey nodur1 l.nodur1, lag(0)​​ 

newey nodur1 rnodur2m, lag(1)

newey nodur1 rnodur3m, lag(2)

newey nodur1 rnodur4m, lag(3)

 

 

reg durb1 l.durb1, robust

 

 

newey durb1 l.durb1, lag(0)​​ 

newey durb1 rdurb2m, lag(1)

newey durb1 rdurb3m, lag(2)

newey durb1 rdurb4m, lag(3)

 

 

reg manuf1 l.manuf1, robust

 

 

newey manuf1 l.manuf1, lag(0)​​ 

newey manuf1 rmanuf2m, lag(1)

newey manuf1 rmanuf3m, lag(2)

newey manuf1 rmanuf4m, lag(3)

 

 

reg SMB1 l.SMB1,​​ robust

 

 

newey SMB1 l.SMB1, lag(0)​​ 

newey SMB1 rSMB2m, lag(1)

newey SMB1 rSMB3m, lag(2)

newey SMB1 rSMB4m, lag(3)

 

 

reg HML1 l.HML1, robust

 

 

newey HML1 l.HML1, lag(0)​​ 

newey HML1 rHML2m, lag(1)

newey HML1 rHML3m, lag(2)

newey HML1 rHML4m, lag(3)

 

 

 

reg​​ enrgy1 l.enrgy1, robust

 

 

newey enrgy1 l.enrgy1, lag(0)​​ 

newey enrgy1 renrgy2m, lag(1)

newey enrgy1 renrgy3m, lag(2)

newey enrgy1 renrgy4m, lag(3)

 

 

 

Testing validity of CAPM, estimating SDFs and testing hypothesis of the SDFs are jointly significant;

 

 

 

** CAPM and 3 factor model estimations

** const = alfa, std error is test statistic

** CAPM

** Here we get CAPM estimates

g ndrf = nodur - rf

reg ndrf mkt_rf

 

g drf = durbl - rf

reg drf mkt_rf

 

g manufrf = manuf - rf

reg manufrf mkt_rf

 

g enrgyrf = enrgy -​​ rf

reg enrgyrf mkt_rf

 

 

** Three-factor model:

** Here we get three-factor model estimates

 

reg ndrf mkt_rf SMB HML

reg drf mkt_rf SMB HML

reg manufrf mkt_rf SMB HML

reg enrgyrf mkt_rf SMB HML

 

 

 

 

 

g drf = durbl - rf

reg drf mkt_rf

 

 

 

gmm ( ({b0} + {b1}*mkt_rf)*nodur - 1 ) ​​ ( ({b0} + {b1}*mkt_rf)*durbl - 1 ) ( ({b0} + {b1}*mkt_rf)*manuf - 1 ) ( ({b0} + {b1}*mkt_rf)*enrgy - 1 ) ( ({b0} + {b1}*mkt_rf)*SMB - 1 ) ​​ , winitial(identity)

 

estat overid

test [b0]_cons [b1]_cons

 

gmm ( ({b0} + {b1}*mkt_rf + {b2}*SMB​​ + {b3}*HML)*nodur - 1 ) ​​ ( ({b0} + {b1}*mkt_rf + {b2}*SMB + {b3}*HML)*durbl - 1 ) ( ({b0} + {b1}*mkt_rf + {b2}*SMB + {b3}*HML)*manuf - 1 ) ( ({b0} + {b1}*mkt_rf + {b2}*SMB + {b3}*HML)*enrgy - 1 ) (({b0} + {b1}*mkt_rf + {b2}*SMB + {b3}*HML)*SMB - 1 ) , winitial(identity)

 

​​ 

estat overid

test [b0]_cons [b1]_cons [b2]_cons [b3]_cons

 

 

error: Content is protected !!