BayesianFM {BayesianFactorZoo} | R Documentation |
Bayesian Fama-MacBeth
Description
This function provides the Bayesian Fama-MacBeth regression.
Usage
BayesianFM(f, R, sim_length)
Arguments
f |
A matrix of factors with dimension |
R |
A matrix of test assets with dimension |
sim_length |
The length of MCMCs; |
Details
BayesianFM
is similar to another twin function in this package, BayesianSDF
,
except that we estimate factors' risk premia rather than risk prices in this function.
Unlike BayesianSDF
, we use factor loadings, \beta_f
, instead of covariance exposures, C_f
,
in the Fama-MacBeth regression. In particular, after we obtain the posterior draws of \mu_{Y}
and \Sigma_{Y}
(details can be found in the section introducing BayesianSDF
function),
we calculate \beta_f
as follows: \beta_f = C_f \Sigma_f^{-1}
, and \beta = (1_N, \beta_f)
.
Bayesian Fama-MacBeth (BFM)
The posterior distribution of \lambda
conditional on \mu_{Y}
, \Sigma_{Y}
, and the data, is a Dirac distribution at
(\beta^\top \beta)^{-1} \beta^\top \mu_R
.
Bayesian Fama-MacBeth GLS (BFM-GLS)
The posterior distribution of \lambda
conditional on \mu_{Y}
, \Sigma_{Y}
, and the data, is a Dirac distribution at
(\beta^\top \Sigma_R^{-1} \beta)^{-1} \beta^\top \Sigma_R^{-1} \mu_R
.
Value
The return of BayesianFM
is a list of the following elements:
-
lambda_ols_path
: Asim_length
\times (k+1)
matrix of OLS risk premia estimates (Each row represents a draw. Note that the first column is\lambda_c
corresponding to the constant term. The nextk
columns are the risk premia estimates of thek
factors); -
lambda_gls_path
: Asim_length
\times (k+1)
matrix of the risk premia estimates\lambda
(GLS); -
R2_ols_path
: Asim_length
\times 1
matrix of theR^2_{OLS}
; -
R2_gls_path
: Asim_length
\times 1
matrix of theR^2_{GLS}
.
Examples
## <-------------------------------------------------------------------------------->
## Example: Bayesian Fama-MacBeth
## <-------------------------------------------------------------------------------->
library(reshape2)
library(ggplot2)
# Load Data
data("BFactor_zoo_example")
HML <- BFactor_zoo_example$HML
lambda_ols <- BFactor_zoo_example$lambda_ols
R2.ols.true <- BFactor_zoo_example$R2.ols.true
sim_f <- BFactor_zoo_example$sim_f
sim_R <- BFactor_zoo_example$sim_R
uf <- BFactor_zoo_example$uf
## <-------------------Case 1: strong factor---------------------------------------->
# the Frequentist Fama-MacBeth
# sim_f: simulated factor, sim_R: simulated return
# sim_f is the useful (i.e., strong) factor
results.fm <- Two_Pass_Regression(sim_f, sim_R)
# the Bayesian Fama-MacBeth with 10000 simulations
results.bfm <- BayesianFM(sim_f, sim_R, 2000)
# Note that the first element correspond to lambda of the constant term
# So we choose k=2 to get lambda of the strong factor
k <- 2
m1 <- results.fm$lambda[k]
sd1 <- sqrt(results.fm$cov_lambda[k,k])
bfm<-results.bfm$lambda_ols_path[1001:2000,k]
fm<-rnorm(20000,mean = m1, sd=sd1)
data<-data.frame(cbind(fm, bfm))
colnames(data)<-c("Frequentist FM", "Bayesian FM")
data.long<-melt(data)
p <- ggplot(aes(x=value, colour=variable, linetype=variable), data=data.long)
p+
stat_density(aes(x=value, colour=variable),
geom="line",position="identity", size = 2, adjust=1) +
geom_vline(xintercept = lambda_ols[2], linetype="dotted", color = "#8c8c8c", size=1.5)+
guides(colour = guide_legend(override.aes=list(size=2), title.position = "top",
title.hjust = 0.5, nrow=1,byrow=TRUE))+
theme_bw()+
labs(color=element_blank()) +
labs(linetype=element_blank()) +
theme(legend.key.width=unit(4,"line")) +
theme(legend.position="bottom")+
theme(text = element_text(size = 26))+
xlab(bquote("Risk premium ("~lambda[strong]~")")) +
ylab("Density" )
## <-------------------Case 2: useless factor--------------------------------------->
# uf is the useless factor
# the Frequentist Fama-MacBeth
results.fm <- Two_Pass_Regression(uf, sim_R)
# the Bayesian Fama-MacBeth with 10000 simulations
results.bfm <- BayesianFM(uf, sim_R, 2000)
# Note that the first element correspond to lambda of the constant term
# So we choose k=2 to get lambda of the useless factor
k <- 2
m1 <- results.fm$lambda[k]
sd1 <- sqrt(results.fm$cov_lambda[k,k])
bfm<-results.bfm$lambda_ols_path[1001:2000,k]
fm<-rnorm(20000,mean = m1, sd=sd1)
data<-data.frame(cbind(fm, bfm))
colnames(data)<-c("Frequentist FM", "Bayesian FM")
data.long<-melt(data)
p <- ggplot(aes(x=value, colour=variable, linetype=variable), data=data.long)
p+
stat_density(aes(x=value, colour=variable),
geom="line",position="identity", size = 2, adjust=1) +
geom_vline(xintercept = lambda_ols[2], linetype="dotted", color = "#8c8c8c", size=1.5)+
guides(colour = guide_legend(override.aes=list(size=2),
title.position = "top", title.hjust = 0.5, nrow=1,byrow=TRUE))+
theme_bw()+
labs(color=element_blank()) +
labs(linetype=element_blank()) +
theme(legend.key.width=unit(4,"line")) +
theme(legend.position="bottom")+
theme(text = element_text(size = 26))+
xlab(bquote("Risk premium ("~lambda[strong]~")")) +
ylab("Density" )