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)
)
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(
)
}
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(
)
}
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,
)
}
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,
)
}
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(
)
)
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)
)