Load libraries and personal ggplot theme
library(tidyquant)
library(tidyverse)
library(broom)
library(knitr)
library(kableExtra)
library(tsibble)
library(ggcorrplot)
library(ggfittext)
library(psych)
library(data.table)
library(ivreg)
library(janitor)
library(readxl)
library(fable)
library(mFilter)
library(ggrepel)
library(lmtest)
library(magrittr)
library(sandwich)
library(car)
library(slider)
library(tsibble)
library(feasts)
library(tseries)
library(ggfittext) # for geom_fit_text
library(ggalt) # for geom_encircle
library(stargazer) # for markdown printing: {r results = "asis", message=FALSE, warning=FALSE}
library(fixest)
library(patchwork)
library(roll)
theme <-
theme(
plot.title = element_text(size = 30, lineheight = .9, face = "bold", hjust = .5, vjust = .75, family = "serif"
),
plot.subtitle = element_text(hjust = .5, vjust = 1, family = "serif", size = 20),
plot.caption = element_text(hjust = .5, family = "serif", size = 15),
panel.background = element_rect(fill = "white"),
axis.title = element_text(family = "serif", size = 20),
axis.text = element_text(size = 20, family = "serif"),
axis.line.y = element_line(color = "black"),
axis.line.x = element_line(color = "black"),
strip.text = element_text(size = 15, family = "serif", face = "bold"),
strip.background.x = element_rect(fill = "lightblue"))
Load data from Yahoo.com
df <-
c("^GSPC") %>%
tq_get(get = "stock.prices", from = "2018-01-01") %>%
select(date, sp = adjusted)
df1 <-
c("^RUT") %>%
tq_get(get = "stock.prices", from = "2018-01-01") %>%
select(date, rut = adjusted)
df2 <-
c("^VIX") %>%
tq_get(get = "stock.prices", from = "2018-01-01") %>%
select(date, vix = adjusted)
df3 <-
c("DGS10") %>%
tq_get(get = "economic.data", from = "2018-01-01") %>%
select(date, ten = price) %>%
fill(ten, .direction = c("up"))
df4 <-
c("^FTSE") %>%
tq_get(get = "stock.prices", from = "2018-01-01") %>%
select(date, ftse = adjusted) %>%
fill(ftse, .direction = c("up"))
df5 <-
c("^GDAXI") %>%
tq_get(get = "stock.prices", from = "2018-01-01") %>%
select(date, dax = adjusted)
df6 <-
c("^N225") %>%
tq_get(get = "stock.prices", from = "2018-01-01") %>%
select(date, nikkei = adjusted)
df7 <-
c("^HSI") %>%
tq_get(get = "stock.prices", from = "2018-01-01") %>%
select(date, hsi = adjusted)
df_all <-
df %>%
left_join(df1, by = "date") %>%
left_join(df2, by = "date") %>%
left_join(df3, by = "date") %>%
left_join(df4, by = "date") %>%
left_join(df5, by = "date") %>%
left_join(df6, by = "date") %>%
left_join(df7, by = "date")
Add tariff day dummy variable
df_all <-
df_all %>%
mutate(sp_chg = 100*((sp / lag(sp, 1)) - 1),
rut_chg = 100*((rut / lag(rut, 1)) - 1),
ftse_chg = 100*((ftse / lag(ftse, 1)) - 1),
dax_chg = 100*((dax / lag(dax, 1)) - 1),
nikkei_chg = 100*((nikkei / lag(nikkei, 1)) - 1),
hsi_chg = 100*((hsi / lag(hsi, 1)) - 1),
vix_chg = vix - lag(vix, 1),
ten_chg = ten - lag(ten, 1),
time = row_number()) %>%
mutate(Tariff = ifelse(date == as.Date("2018-01-23") |
date == as.Date("2018-03-01") |
date == as.Date("2018-03-22") |
date == as.Date("2018-03-23") |
date == as.Date("2018-06-15") |
date == as.Date("2018-06-19") |
date == as.Date("2019-05-06") |
date == as.Date("2019-05-13") |
date == as.Date("2019-08-01") |
date == as.Date("2019-08-23"),
1, 0))
df_all %>%
filter(Tariff == 1) %>%
select(date, 10:17) %>%
mutate(date = factor(date)) %>%
add_row(date = 'MEAN', !!! colMeans(.[-1], na.rm = T))
## # A tibble: 11 × 9
## date sp_chg rut_chg ftse_chg dax_chg nikkei_chg hsi_chg vix_chg ten_chg
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2018-01-23 0.217 0.345 0.213 0.712 1.29 1.66 0.0700 -0.0300
## 2 2018-03-01 -1.33 -0.335 -0.778 -1.97 -1.56 0.647 2.62 -0.0600
## 3 2018-03-22 -2.52 -2.24 -1.23 -1.70 NA -1.09 5.48 -0.0600
## 4 2018-03-23 -2.10 -2.19 -0.442 -1.77 -4.51 -2.45 1.53 -0.0100
## 5 2018-06-15 -0.102 -0.0481 -1.70 -0.737 0.498 -0.429 -0.140 -0.0100
## 6 2018-06-19 -0.402 0.0585 -0.359 -1.22 -1.77 NA 1.04 -0.0300
## 7 2019-05-06 -0.447 0.0595 NA -1.01 NA -2.90 2.57 -0.0300
## 8 2019-05-13 -2.41 -3.18 -0.550 -1.52 -0.720 NA 4.51 -0.0700
## 9 2019-08-01 -0.900 -1.51 -0.0250 0.526 0.0904 -0.763 1.75 -0.120
## 10 2019-08-23 -2.59 -3.09 -0.466 -1.15 0.402 0.501 3.19 -0.100
## 11 MEAN -1.26 -1.21 -0.593 -0.984 -0.785 -0.604 2.26 -0.0520
df_all %>%
filter(Tariff == 1) %>%
select(date, 10:17) %>%
mutate(date = factor(date)) %>%
add_row(date = 'MEAN', !!! colMeans(.[-1], na.rm = T)) %>%
kbl(digits = 3) %>%
kable_paper(full_width = F) %>%
row_spec(11, bold = T, color = "black", background = "azure2") %>%
row_spec(0, bold = T, color = "black", background = "azure3") %>%
add_header_above(c(" " = 1, "U.S. Equity" = 2, "Foreign Equity" = 4, "Volatility" = 1, "Safety" =1)) %>%
add_indent(c(11)) %>%
save_kable("table.html", self_contained = T)
Regressions (Table 2)
mod1 <-
df_all %>%
lm(sp_chg ~ Tariff, data = .)
mod2 <-
df_all %>%
lm(rut_chg ~ Tariff, data = .)
mod3 <-
df_all %>%
lm(ftse_chg ~ Tariff, data = .)
mod4 <-
df_all %>%
lm(dax_chg ~ Tariff, data = .)
mod5 <-
df_all %>%
lm(nikkei_chg ~ Tariff, data = .)
mod6 <-
df_all %>%
lm(hsi_chg ~ Tariff, data = .)
mod7 <-
df_all %>%
lm(vix_chg ~ Tariff, data = .)
mod8 <-
df_all %>%
lm(ten_chg ~ Tariff, data = .)
mods <-
list(mod1, mod2, mod3, mod4, mod5, mod6, mod7, mod8)
stargazer(
mods,
ci = F,
ci.level = 0.95,
digits = 3,
omit.stat = c("f", "chi2", "ser", "adj.rsq"),
type = "html",
out = "tariff_regressions.html",
notes = c("Source: Yahoo Finance, author's regressions"),
dep.var.caption = "Dependent variable",
model.numbers = T)
##
## <table style="text-align:center"><tr><td colspan="9" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left"></td><td colspan="8">Dependent variable</td></tr>
## <tr><td></td><td colspan="8" style="border-bottom: 1px solid black"></td></tr>
## <tr><td style="text-align:left"></td><td>sp_chg</td><td>rut_chg</td><td>ftse_chg</td><td>dax_chg</td><td>nikkei_chg</td><td>hsi_chg</td><td>vix_chg</td><td>ten_chg</td></tr>
## <tr><td style="text-align:left"></td><td>(1)</td><td>(2)</td><td>(3)</td><td>(4)</td><td>(5)</td><td>(6)</td><td>(7)</td><td>(8)</td></tr>
## <tr><td colspan="9" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">Tariff</td><td>-1.321<sup>***</sup></td><td>-1.259<sup>**</sup></td><td>-0.605<sup>*</sup></td><td>-1.022<sup>***</sup></td><td>-0.818<sup>*</sup></td><td>-0.586</td><td>2.273<sup>***</sup></td><td>-0.053<sup>***</sup></td></tr>
## <tr><td style="text-align:left"></td><td>(0.393)</td><td>(0.506)</td><td>(0.343)</td><td>(0.390)</td><td>(0.461)</td><td>(0.522)</td><td>(0.660)</td><td>(0.018)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
## <tr><td style="text-align:left">Constant</td><td>0.062<sup>**</sup></td><td>0.045</td><td>0.013</td><td>0.038</td><td>0.033</td><td>-0.018</td><td>-0.011</td><td>0.001</td></tr>
## <tr><td style="text-align:left"></td><td>(0.030)</td><td>(0.038)</td><td>(0.025)</td><td>(0.030)</td><td>(0.033)</td><td>(0.037)</td><td>(0.050)</td><td>(0.001)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
## <tr><td colspan="9" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">Observations</td><td>1,744</td><td>1,744</td><td>1,680</td><td>1,690</td><td>1,550</td><td>1,590</td><td>1,744</td><td>1,743</td></tr>
## <tr><td style="text-align:left">R<sup>2</sup></td><td>0.006</td><td>0.004</td><td>0.002</td><td>0.004</td><td>0.002</td><td>0.001</td><td>0.007</td><td>0.005</td></tr>
## <tr><td colspan="9" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left"><em>Note:</em></td><td colspan="8" style="text-align:right"><sup>*</sup>p<0.1; <sup>**</sup>p<0.05; <sup>***</sup>p<0.01</td></tr>
## <tr><td style="text-align:left"></td><td colspan="8" style="text-align:right">Source: Yahoo Finance, author's regressions</td></tr>
## </table>
VIX line chart (Chart 1)
df_all %>%
select(date, sp, sp_chg, vix, Tariff) %>%
mutate(Tariff = factor(Tariff)) %>%
filter(between(year(date), 2018, 2019)) %>%
ggplot(aes(x = date)) +
geom_line(aes(y = vix)) +
geom_point(aes(y = vix, color = Tariff, shape = Tariff)) +
theme +
scale_color_manual(values = c("black", "red")) +
labs(x = NULL, y = "VIX level") +
theme(legend.position = "bottom")

VIX table
df_all %>%
select(date, sp, sp_chg, vix, Tariff) %>%
mutate(Tariff = factor(Tariff)) %>%
filter(between(year(date), 2018, 2019)) %>%
mutate(pre_Tariff = ifelse(Tariff == 1, lag(vix, 1), 0),
post_one = ifelse(Tariff == 1, lead(vix, 1), 0),
post_three = ifelse(Tariff == 1, lead(vix, 3), 0),
post_five = ifelse(Tariff == 1, lead(vix, 5), 0),
post_ten = ifelse(Tariff == 1, lead(vix, 10), 0)) %>%
filter(Tariff == 1) %>%
select(-sp, -sp_chg, - Tariff, Tariff = vix) %>%
select(date, pre_Tariff, Tariff, 4:7) %>%
kbl(digits = 3) %>%
kable_paper(full_width = F) %>%
save_kable("table2.html", self_contained = T)
VIX autocorr
df_all %>%
select(date, sp, sp_chg, vix, Tariff) %>%
mutate(Tariff = factor(Tariff)) %>%
filter(between(year(date), 2018, 2019)) %>%
mutate(vix_chg = vix - lag(vix),
autocorr = roll_cor(vix_chg, lag(vix_chg, 1), width = 5)) %>%
ggplot(aes(x = date)) +
geom_line(aes(y = autocorr))
## Warning: Removed 6 rows containing missing values or values outside the scale range
## (`geom_line()`).
