Skip to content

aggregate-volatility-asset-pricing #2

Description

@Cindy481

library(readxl)
library(dplyr)
library(tseries)
library(psych)
library(moments)
df <- read_excel("C:/Users/Cindy/Desktop/毕业论文/data/data_daily.xlsx")

####ADF test
adf.test(df$VIX)
adf.test(df$Mkt-RF)
adf.test(df$SMB(FF3))
adf.test(df$HML)

adf.test(df$LO20_EXCESS)
adf.test(df$QNT2_EXCESS)
adf.test(df$QNT3_EXCESS)
adf.test(df$QNT4_EXCESS)
adf.test(df$HI20_EXCESS)
adf.test(df$SMB(FF5))
adf.test(df$RMW)
adf.test(df$CMA)

####describtion
vars <- df[, c(
"VIX",
"Mkt-RF",
"SMB(FF3)",
"SMB(FF5)",
"HML",
"RMW",
"CMA",
"COVID",
"LO20_EXCESS",
"QNT2_EXCESS",
"QNT3_EXCESS",
"QNT4_EXCESS",
"HI20_EXCESS"
)]
desc_table <- data.frame(
Variable = names(vars),
Mean = sapply(vars, mean, na.rm = TRUE),
Std.Dev = sapply(vars, sd, na.rm = TRUE),
Min = sapply(vars, min, na.rm = TRUE),
Max = sapply(vars, max, na.rm = TRUE),
Skewness = sapply(vars, skewness, na.rm = TRUE),
Kurtosis = sapply(vars, kurtosis, na.rm = TRUE)
)

desc_table[, -1] <- round(desc_table[, -1], 4)

desc_table

###FF3
ff3 <- lm(
LO20_EXCESS ~ Mkt-RF + SMB(FF3) + HML,
data = df
)

summary(ff3)

portfolios <- c(
"LO20_EXCESS",
"QNT2_EXCESS",
"QNT3_EXCESS",
"QNT4_EXCESS",
"HI20_EXCESS"
)

for (p in portfolios) {

model <- lm(
as.formula(
paste(p, "~ Mkt-RF + SMB(FF3) + HML")
),
data = df
)

cat("\n====================\n")
cat(p, "\n")
cat("====================\n")

print(summary(model))
}

###FF5
ff5 <- lm(
LO20_EXCESS ~ Mkt-RF + SMB(FF5) + HML + RMW + CMA,
data = df
)

summary(ff5)

portfolios <- c(
"LO20_EXCESS",
"QNT2_EXCESS",
"QNT3_EXCESS",
"QNT4_EXCESS",
"HI20_EXCESS"
)

for (p in portfolios) {

model <- lm(
as.formula(
paste(p, "~ Mkt-RF + SMB(FF5) + HML + RMW + CMA")
),
data = df
)

cat("\n====================\n")
cat(p, "\n")
cat("====================\n")

print(summary(model))
}

###FF3 and VIX
portfolios <- c(
"LO20_EXCESS",
"QNT2_EXCESS",
"QNT3_EXCESS",
"QNT4_EXCESS",
"HI20_EXCESS"
)

for (p in portfolios){

cat("\n====================\n")
cat(p,"\n")
cat("====================\n")

model <- lm(
as.formula(
paste(
p,
"~ Mkt-RF + SMB(FF3) + HML + VIX"
)
),
data=df
)

print(summary(model))
}

results_ff3_vix <- data.frame()

for (p in portfolios){

model <- lm(
as.formula(
paste(
p,
"~ Mkt-RF + SMB(FF3) + HML + VIX"
)
),
data=df
)

results_ff3_vix <- rbind(
results_ff3_vix,
data.frame(
Portfolio = p,
Alpha = coef(model)[1],
Beta_MKT = coef(model)[2],
Beta_SMB = coef(model)[3],
Beta_HML = coef(model)[4],
Gamma_VIX = coef(model)[5],
Adj_R2 = summary(model)$adj.r.squared,
AIC = AIC(model),
BIC = BIC(model)
)
)
}

results_ff3_vix

for (p in portfolios){

model <- lm(
as.formula(
paste(
p,
"~ Mkt-RF + SMB(FF3) + HML + VIX"
)
),
data = df
)

cat("\n====================\n")
cat(p,"\n")
cat("====================\n")

print(
coef(summary(model))["VIX", ]
)
}

###FF5 and VIX
portfolios <- c(
"LO20_EXCESS",
"QNT2_EXCESS",
"QNT3_EXCESS",
"QNT4_EXCESS",
"HI20_EXCESS"
)

for (p in portfolios){

cat("\n====================\n")
cat(p,"\n")
cat("====================\n")

model <- lm(
as.formula(
paste(
p,
"~ Mkt-RF + SMB(FF5) + HML + RMW + CMA + VIX"
)
),
data = df
)

print(summary(model))
}

results_ff5_vix <- data.frame()

for (p in portfolios){

model <- lm(
as.formula(
paste(
p,
"~ Mkt-RF + SMB(FF5) + HML + RMW + CMA + VIX"
)
),
data = df
)

results_ff5_vix <- rbind(
results_ff5_vix,
data.frame(
Portfolio = p,
Alpha = coef(model)[1],
Beta_MKT = coef(model)[2],
Beta_SMB = coef(model)[3],
Beta_HML = coef(model)[4],
Beta_RMW = coef(model)[5],
Beta_CMA = coef(model)[6],
Gamma_VIX = coef(model)[7],
Adj_R2 = summary(model)$adj.r.squared,
AIC = AIC(model),
BIC = BIC(model)
)
)
}

results_ff5_vix

for (p in portfolios){

model <- lm(
as.formula(
paste(
p,
"~ Mkt-RF + SMB(FF5) + HML + RMW + CMA + VIX"
)
),
data = df
)

cat("\n====================\n")
cat(p,"\n")
cat("====================\n")

print(
coef(summary(model))["VIX", ]
)
}

###VIX_COVID
df$VIX_COVID <- df$VIX * df$COVID

###return
portfolios <- c(
"LO20_EXCESS",
"QNT2_EXCESS",
"QNT3_EXCESS",
"QNT4_EXCESS",
"HI20_EXCESS"
)
results <- data.frame()

for(p in portfolios){

model <- lm(
as.formula(
paste(
p,
"~ Mkt-RF + SMB(FF5) + HML + RMW + CMA + VIX + COVID + VIX_COVID"
)
),
data = df
)

coef_table <- summary(model)$coefficients

results <- rbind(
results,
data.frame(

  Portfolio = p,
  
  Alpha = coef_table["(Intercept)", "Estimate"],
  
  Beta_MKT = coef_table["`Mkt-RF`", "Estimate"],
  Beta_SMB = coef_table["`SMB(FF5)`", "Estimate"],
  Beta_HML = coef_table["HML", "Estimate"],
  Beta_RMW = coef_table["RMW", "Estimate"],
  Beta_CMA = coef_table["CMA", "Estimate"],
  
  Gamma_VIX = coef_table["VIX", "Estimate"],
  P_VIX = coef_table["VIX", "Pr(>|t|)"],
  
  Gamma_COVID = coef_table["COVID", "Estimate"],
  P_COVID = coef_table["COVID", "Pr(>|t|)"],
  
  Gamma_Interaction = coef_table["VIX_COVID", "Estimate"],
  P_Interaction = coef_table["VIX_COVID", "Pr(>|t|)"],
  
  Adj_R2 = summary(model)$adj.r.squared,
  
  AIC = AIC(model),
  BIC = BIC(model)
)

)
}
results_table <- results

results_table[, -1] <- round(
results_table[, -1],
4
)

results_table

star <- function(p){

if(p < 0.01){
return("")
}else if(p < 0.05){
return("
")
}else if(p < 0.10){
return("
")
}else{
return("")
}

}

paper_table <- data.frame(

Portfolio = results$Portfolio,

VIX =
paste0(
round(results$Gamma_VIX,4),
sapply(results$P_VIX, star)
),

COVID =
paste0(
round(results$Gamma_COVID,4),
sapply(results$P_COVID, star)
),

Interaction =
paste0(
round(results$Gamma_Interaction,4),
sapply(results$P_Interaction, star)
),

Adj_R2 = round(results$Adj_R2,4),

AIC = round(results$AIC,2),

BIC = round(results$BIC,2)
)

paper_table

library(openxlsx)

write.xlsx(
paper_table,
"FF5_VIX_COVID_Interaction.xlsx",
rowNames = FALSE
)

###logVIX
df$logVIX <- log(df$VIX)
df$logVIX_COVID <- df$logVIX * df$COVID
portfolios <- c(
"LO20_EXCESS",
"QNT2_EXCESS",
"QNT3_EXCESS",
"QNT4_EXCESS",
"HI20_EXCESS"
)

results <- data.frame()

for(p in portfolios){

model <- lm(
as.formula(
paste(
p,
"~ Mkt-RF + SMB(FF5) + HML + RMW + CMA + logVIX + COVID + logVIX_COVID"
)
),
data = df
)

coef_table <- summary(model)$coefficients

results <- rbind(
results,
data.frame(

  Portfolio = p,
  
  Alpha = coef_table["(Intercept)", "Estimate"],
  
  Beta_MKT = coef_table["`Mkt-RF`", "Estimate"],
  Beta_SMB = coef_table["`SMB(FF5)`", "Estimate"],
  Beta_HML = coef_table["HML", "Estimate"],
  Beta_RMW = coef_table["RMW", "Estimate"],
  Beta_CMA = coef_table["CMA", "Estimate"],
  
  Gamma_logVIX =
    coef_table["logVIX", "Estimate"],
  
  P_logVIX =
    coef_table["logVIX", "Pr(>|t|)"],
  
  Gamma_COVID =
    coef_table["COVID", "Estimate"],
  
  P_COVID =
    coef_table["COVID", "Pr(>|t|)"],
  
  Gamma_Interaction =
    coef_table["logVIX_COVID", "Estimate"],
  
  P_Interaction =
    coef_table["logVIX_COVID", "Pr(>|t|)"],
  
  Adj_R2 =
    summary(model)$adj.r.squared,
  
  AIC = AIC(model),
  BIC = BIC(model)
)

)
}

star <- function(p){

if(p < 0.01){
return("")
}else if(p < 0.05){
return("
")
}else if(p < 0.10){
return("
")
}else{
return("")
}

}

paper_table <- data.frame(

Portfolio = results$Portfolio,

logVIX =
paste0(
round(results$Gamma_logVIX,4),
sapply(results$P_logVIX, star)
),

COVID =
paste0(
round(results$Gamma_COVID,4),
sapply(results$P_COVID, star)
),

Interaction =
paste0(
round(results$Gamma_Interaction,4),
sapply(results$P_Interaction, star)
),

Adj_R2 =
round(results$Adj_R2,4),

AIC =
round(results$AIC,2),

BIC =
round(results$BIC,2)
)

paper_table

###△VIX
library(dplyr)

df <- df %>%
arrange(Date) %>%
mutate(
DeltaVIX = VIX - lag(VIX)
)

summary(df$DeltaVIX)
df2 <- na.omit(df)
df2$DeltaVIX_COVID <- df2$DeltaVIX * df2$COVID

portfolios <- c(
"LO20_EXCESS",
"QNT2_EXCESS",
"QNT3_EXCESS",
"QNT4_EXCESS",
"HI20_EXCESS"
)

results <- data.frame()

for(p in portfolios){

model <- lm(
as.formula(
paste(
p,
"~ Mkt-RF + SMB(FF5) + HML + RMW + CMA +
DeltaVIX + COVID + DeltaVIX_COVID"
)
),
data = df2
)

coefs <- summary(model)$coefficients

results <- rbind(
results,
data.frame(
Portfolio = p,

  DeltaVIX = coefs["DeltaVIX","Estimate"],
  P_DeltaVIX = coefs["DeltaVIX","Pr(>|t|)"],
  
  COVID = coefs["COVID","Estimate"],
  P_COVID = coefs["COVID","Pr(>|t|)"],
  
  Interaction =
    coefs["DeltaVIX_COVID","Estimate"],
  P_Interaction =
    coefs["DeltaVIX_COVID","Pr(>|t|)"],
  
  Adj_R2 = summary(model)$adj.r.squared,
  
  AIC = AIC(model),
  BIC = BIC(model)
)

)
}

results

star <- function(beta,p){

if(p < 0.01){
paste0(round(beta,4),"")
} else if(p < 0.05){
paste0(round(beta,4),"
")
} else if(p < 0.10){
paste0(round(beta,4),"
")
} else {
round(beta,4)
}

}

paper_table <- data.frame(
Portfolio = results$Portfolio,

DeltaVIX =
mapply(star,
results$DeltaVIX,
results$P_DeltaVIX),

COVID =
mapply(star,
results$COVID,
results$P_COVID),

Interaction =
mapply(star,
results$Interaction,
results$P_Interaction),

Adj_R2 = round(results$Adj_R2,4),
AIC = round(results$AIC,2),
BIC = round(results$BIC,2)
)

paper_table

###Δln(VIX)
library(dplyr)

df <- df %>%
mutate(
logVIX = log(VIX),
DlogVIX = logVIX - lag(logVIX)
)
df2 <- na.omit(df)
df2$DlogVIX_COVID <- df2$DlogVIX * df2$COVID

portfolios <- c(
"LO20_EXCESS",
"QNT2_EXCESS",
"QNT3_EXCESS",
"QNT4_EXCESS",
"HI20_EXCESS"
)

results <- data.frame()

for(p in portfolios){

model <- lm(
as.formula(
paste(
p,
"~ Mkt-RF + SMB(FF5) + HML + RMW + CMA +
DlogVIX + COVID + DlogVIX_COVID"
)
),
data = df2
)

coefs <- summary(model)$coefficients

results <- rbind(
results,
data.frame(
Portfolio = p,

  DlogVIX =
    coefs["DlogVIX","Estimate"],
  
  COVID =
    coefs["COVID","Estimate"],
  
  Interaction =
    coefs["DlogVIX_COVID","Estimate"],
  
  P_DlogVIX =
    coefs["DlogVIX","Pr(>|t|)"],
  
  P_COVID =
    coefs["COVID","Pr(>|t|)"],
  
  P_Interaction =
    coefs["DlogVIX_COVID","Pr(>|t|)"],
  
  Adj_R2 =
    summary(model)$adj.r.squared,
  
  AIC =
    AIC(model),
  
  BIC =
    BIC(model)
)

)
}

results
star <- function(x){

if(x < 0.01) return("")
if(x < 0.05) return("
")
if(x < 0.10) return("
")

return("")
}

table_out <- data.frame(

Portfolio = results$Portfolio,

DlogVIX =
paste0(
round(results$DlogVIX,4),
sapply(results$P_DlogVIX, star)
),

COVID =
paste0(
round(results$COVID,4),
sapply(results$P_COVID, star)
),

Interaction =
paste0(
round(results$Interaction,4),
sapply(results$P_Interaction, star)
),

Adj_R2 =
round(results$Adj_R2,4),

AIC =
round(results$AIC,2),

BIC =
round(results$BIC,2)
)

table_out

###HI20 - LO20

df <- df %>%
mutate(
HI20_LO20 = HI20_EXCESS - LO20_EXCESS
)

T_obs <- nrow(df)
nw_lag <- ceiling(T_obs^(1/3))

run_model <- function(formula, label){

model <- lm(formula, data=df)

nw <- coeftest(
model,
vcov = NeweyWest(
model,
lag = nw_lag,
prewhite = FALSE
)
)

cat("\n=================================\n")
cat(label,"\n")
cat("=================================\n")

print(nw)

cat(
sprintf(
"\nAdjusted R² = %.4f\n",
summary(model)$adj.r.squared
)
)

return(model)
}

###FF5

m1 <- run_model(

HI20_LO20 ~
Mkt-RF +
HML +
RMW +
CMA,

"FF5"
)

###FF5 + VIX
m2 <- run_model(

HI20_LO20 ~
Mkt-RF +
HML +
RMW +
CMA +
VIX,

"FF5 + VIX"
)

###FF5 + VIX + COVID
m3 <- run_model(

HI20_LO20 ~
Mkt-RF +
HML +
RMW +
CMA +
VIX +
COVID,

"FF5 + VIX + COVID"
)

cat("\n==============================\n")
cat("Alpha comparison\n")
cat("==============================\n")

alpha1 <- coef(m1)[1]
alpha2 <- coef(m2)[1]
alpha3 <- coef(m3)[1]

print(
data.frame(

Model = c(
  "FF5",
  "FF5+VIX",
  "FF5+VIX+COVID"
),

Alpha = c(
  alpha1,
  alpha2,
  alpha3
)

)
)

coefs <- summary(m3)$coefficients

data.frame(
Portfolio = "HI20_LO20",
VIX = round(coefs["VIX","Estimate"],4),
COVID = round(coefs["COVID","Estimate"],4),
Interaction = round(coefs["VIX:COVID","Estimate"],4),
Adj_R2 = round(summary(m3)$adj.r.squared,4),
AIC = round(AIC(m3),2),
BIC = round(BIC(m3),2)
)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions