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()`).