R Markdown

library(tidyquant)
library(tidyverse)
library(dplyr)

###2004-2005

#ESG stock returns

ESGstock_returns_monthly2004 <- c("A", "TXN", "VOYA", "TIF", "BBY", "HPQ", "CSCO", "GWW", "AVT", "ADSK", "NVDA", "PVH", "CBRE", "MAN", "ON", "BLL", "ECL", "HAS", "MSI", "AVY", "VFC", "AWK", "ORA", "CLX", "K", "CL", "UNF", "NEE", "ADBE", "VZ", "CRM", "WSM", "APD", "HBI", "ITRI", "TROW", "OSK", "KEYS", "DAL", "PRU", "VAR", "MSFT", "CTL", "KO", "FSLR", "RHI", "LRCX", "ATR", "SBUX", "CMI") %>%
    tq_get(get  = "stock.prices",
           from = "2003-01-01",
           to   = "2005-12-31") %>%
    group_by(symbol) %>%
    tq_transmute(select     = adjusted, 
                 mutate_fun = periodReturn, 
                 period     = "monthly", 
                 col_rename = "Ra")
ESGstock_returns_monthly2004 
## # A tibble: 1,528 x 3
## # Groups:   symbol [44]
##    symbol date             Ra
##    <chr>  <date>        <dbl>
##  1 A      2003-01-31 -0.139  
##  2 A      2003-02-28 -0.199  
##  3 A      2003-03-31 -0.00379
##  4 A      2003-04-30  0.218  
##  5 A      2003-05-30  0.132  
##  6 A      2003-06-30  0.0783 
##  7 A      2003-07-31  0.112  
##  8 A      2003-08-29  0.119  
##  9 A      2003-09-30 -0.0909 
## 10 A      2003-10-31  0.127  
## # ... with 1,518 more rows

#Monthly Returns for individual ESG stocks

ESGmonthly2004 <- ESGstock_returns_monthly2004 %>%
    tq_repeat_df(n = 1)
ESGmonthly2004
## # A tibble: 1,528 x 4
## # Groups:   portfolio [1]
##    portfolio symbol date             Ra
##        <int> <chr>  <date>        <dbl>
##  1         1 A      2003-01-31 -0.139  
##  2         1 A      2003-02-28 -0.199  
##  3         1 A      2003-03-31 -0.00379
##  4         1 A      2003-04-30  0.218  
##  5         1 A      2003-05-30  0.132  
##  6         1 A      2003-06-30  0.0783 
##  7         1 A      2003-07-31  0.112  
##  8         1 A      2003-08-29  0.119  
##  9         1 A      2003-09-30 -0.0909 
## 10         1 A      2003-10-31  0.127  
## # ... with 1,518 more rows

weighting for ESG portfolio

weights <- c(.02439, .02439, 0, .02439, .02439, .02439, .02439, .02439, 0, 0,
.02439, .02439, .02439, .02439, .02439, .02439, .02439, .02439, .02439, .02439,
.02439, 0, .02439, 0, .02439, .02439, .02439, .02439, .02439, .02439,
.02439, .02439, .02439, 0, .02439, .02439, .02439, 0, 0, .02439,
.02439, .02439, .02439, .02439, 0, .02439, .02439, .02439, .02439, .02439)

ESGstocks <- c("A", "TXN", "VOYA", "TIF", "BBY", "HPQ", "CSCO", "GWW", "AVT", "ADSK", "NVDA", "PVH", "CBRE", "MAN", "ON", "BLL", "ECL", "HAS", "MSI", "AVY", "VFC", "AWK", "ORA", "CLX", "K", "CL", "UNF", "NEE", "ADBE", "VZ", "CRM", "WSM", "APD", "HBI", "ITRI", "TROW", "OSK", "KEYS", "DAL", "PRU", "VAR", "MSFT", "CTL", "KO", "FSLR", "RHI", "LRCX", "ATR", "SBUX", "CMI")

weights_table <-  tibble(ESGstocks) %>%
    tq_repeat_df(n = 1) %>%
    bind_cols(tibble(weights)) %>%
    group_by(portfolio)
weights_table
## # A tibble: 50 x 3
## # Groups:   portfolio [1]
##    portfolio ESGstocks weights
##        <int> <chr>       <dbl>
##  1         1 A          0.0244
##  2         1 TXN        0.0244
##  3         1 VOYA       0     
##  4         1 TIF        0.0244
##  5         1 BBY        0.0244
##  6         1 HPQ        0.0244
##  7         1 CSCO       0.0244
##  8         1 GWW        0.0244
##  9         1 AVT        0     
## 10         1 ADSK       0     
## # ... with 40 more rows

ESG portfolio returns

ESGportfolio2004  <-
  ESGmonthly2004 %>%
    tq_portfolio(assets_col  = symbol, 
                 returns_col = Ra, 
                 weights     = weights_table, 
                 col_rename  = "Ra")
ESGportfolio2004
## # A tibble: 36 x 3
## # Groups:   portfolio [1]
##    portfolio date             Ra
##        <int> <date>        <dbl>
##  1         1 2003-01-31 -0.0466 
##  2         1 2003-02-28 -0.00899
##  3         1 2003-03-31  0.0136 
##  4         1 2003-04-30  0.0745 
##  5         1 2003-05-30  0.111  
##  6         1 2003-06-30  0.0102 
##  7         1 2003-07-31  0.0449 
##  8         1 2003-08-29  0.0754 
##  9         1 2003-09-30 -0.0407 
## 10         1 2003-10-31  0.102  
## # ... with 26 more rows

S&P for baseline

baseline_returns_monthly2004 <- "^GSPC" %>%
    tq_get(get  = "stock.prices",
           from = "2003-01-01",
           to   = "2005-12-31") %>%
    tq_transmute(select     = adjusted, 
                 mutate_fun = periodReturn, 
                 period     = "monthly", 
                 col_rename = "Rb")
baseline_returns_monthly2004
## # A tibble: 36 x 2
##    date             Rb
##    <date>        <dbl>
##  1 2003-01-31 -0.0587 
##  2 2003-02-28 -0.0170 
##  3 2003-03-31  0.00836
##  4 2003-04-30  0.0810 
##  5 2003-05-30  0.0509 
##  6 2003-06-30  0.0113 
##  7 2003-07-31  0.0162 
##  8 2003-08-29  0.0179 
##  9 2003-09-30 -0.0119 
## 10 2003-10-31  0.0550 
## # ... with 26 more rows

Merged S&P and ESG

RaRb_single_portfolio2004 <- left_join(ESGportfolio2004 , 
                                   baseline_returns_monthly2004,
                                   by = "date")
RaRb_single_portfolio2004
## # A tibble: 36 x 4
## # Groups:   portfolio [1]
##    portfolio date             Ra       Rb
##        <int> <date>        <dbl>    <dbl>
##  1         1 2003-01-31 -0.0466  -0.0587 
##  2         1 2003-02-28 -0.00899 -0.0170 
##  3         1 2003-03-31  0.0136   0.00836
##  4         1 2003-04-30  0.0745   0.0810 
##  5         1 2003-05-30  0.111    0.0509 
##  6         1 2003-06-30  0.0102   0.0113 
##  7         1 2003-07-31  0.0449   0.0162 
##  8         1 2003-08-29  0.0754   0.0179 
##  9         1 2003-09-30 -0.0407  -0.0119 
## 10         1 2003-10-31  0.102    0.0550 
## # ... with 26 more rows

2003-2005 ESG CAPM Table, S&P 500 Baseline

RaRb_single_portfolio2004 %>%
    tq_performance(Ra = Ra, Rb = Rb, performance_fun = table.CAPM) %>%
  t()
##                      [,1]
## portfolio          1.0000
## ActivePremium      0.1514
## Alpha              0.0080
## AnnualizedAlpha    0.0998
## Beta               1.3731
## Beta-              1.0230
## Beta+              1.1221
## Correlation        0.8438
## Correlationp-value 0.0000
## InformationRatio   1.6398
## R-squared          0.7120
## TrackingError      0.0923
## TreynorRatio       0.1914
Dirtystock_returns_monthly2004 <- c("WMB", "DVN", "SLB", "BKR", "VLO", "PSX", "NBL", "KMI", "OKE", "HES","EMN", "ECL", "NBR", "VAL", "CF", "SEE", "NEM", "VMC", "MLM", "SWN", "MPC", "CWEN", "DUK", "COG", "XOM") %>%
    tq_get(get  = "stock.prices",
           from = "2003-01-01",
           to   = "2005-12-31") %>%
    group_by(symbol) %>%
    tq_transmute(select     = adjusted, 
                 mutate_fun = periodReturn, 
                 period     = "monthly", 
                 col_rename = "Rc")
Dirtystock_returns_monthly2004 
## # A tibble: 725 x 3
## # Groups:   symbol [21]
##    symbol date              Rc
##    <chr>  <date>         <dbl>
##  1 WMB    2003-01-31  0.149   
##  2 WMB    2003-02-28  0.176   
##  3 WMB    2003-03-31  0.206   
##  4 WMB    2003-04-30  0.517   
##  5 WMB    2003-05-30  0.138   
##  6 WMB    2003-06-30  0.000195
##  7 WMB    2003-07-31 -0.196   
##  8 WMB    2003-08-29  0.440   
##  9 WMB    2003-09-30  0.0318  
## 10 WMB    2003-10-31  0.0828  
## # ... with 715 more rows

Monthly Returns for individual Dirty Investing

Dirtymonthly2004 <- Dirtystock_returns_monthly2004 %>%
    tq_repeat_df(n = 1)
Dirtymonthly2004
## # A tibble: 725 x 4
## # Groups:   portfolio [1]
##    portfolio symbol date              Rc
##        <int> <chr>  <date>         <dbl>
##  1         1 WMB    2003-01-31  0.149   
##  2         1 WMB    2003-02-28  0.176   
##  3         1 WMB    2003-03-31  0.206   
##  4         1 WMB    2003-04-30  0.517   
##  5         1 WMB    2003-05-30  0.138   
##  6         1 WMB    2003-06-30  0.000195
##  7         1 WMB    2003-07-31 -0.196   
##  8         1 WMB    2003-08-29  0.440   
##  9         1 WMB    2003-09-30  0.0318  
## 10         1 WMB    2003-10-31  0.0828  
## # ... with 715 more rows

weighting for dirty portfolio

weights1 <- c(.05, .05, .05, .05, .05, 0, .05, 0, .05, .05,
.05, .05, .05, .05, 0, .05, .05, .05, .05, .05,
0, 0, .05, .05, .05)

Dirtystocks <- c("WMB", "DVN", "SLB", "BKR", "VLO", "PSX", "NBL", "KMI", "OKE", "HES","EMN", "ECL", "NBR", "VAL", "CF", "SEE", "NEM", "VMC", "MLM", "SWN", "MPC", "CWEN", "DUK", "COG", "XOM")

weights_table1 <-  tibble(Dirtystocks) %>%
    tq_repeat_df(n = 1) %>%
    bind_cols(tibble(weights1)) %>%
    group_by(portfolio)
weights_table1
## # A tibble: 25 x 3
## # Groups:   portfolio [1]
##    portfolio Dirtystocks weights1
##        <int> <chr>          <dbl>
##  1         1 WMB             0.05
##  2         1 DVN             0.05
##  3         1 SLB             0.05
##  4         1 BKR             0.05
##  5         1 VLO             0.05
##  6         1 PSX             0   
##  7         1 NBL             0.05
##  8         1 KMI             0   
##  9         1 OKE             0.05
## 10         1 HES             0.05
## # ... with 15 more rows

Dirty portfolio returns

Dirtyportfolio2004  <-
  Dirtymonthly2004 %>%
    tq_portfolio(assets_col  = symbol, 
                 returns_col = Rc, 
                 weights     = weights_table1, 
                 col_rename  = "Rc")
Dirtyportfolio2004
## # A tibble: 36 x 3
## # Groups:   portfolio [1]
##    portfolio date             Rc
##        <int> <date>        <dbl>
##  1         1 2003-01-31 -0.0622 
##  2         1 2003-02-28  0.0109 
##  3         1 2003-03-31  0.0194 
##  4         1 2003-04-30  0.0684 
##  5         1 2003-05-30  0.105  
##  6         1 2003-06-30 -0.00297
##  7         1 2003-07-31 -0.0314 
##  8         1 2003-08-29  0.103  
##  9         1 2003-09-30 -0.0207 
## 10         1 2003-10-31  0.0475 
## # ... with 26 more rows

Merged S&P and Dirty

RcRb_single_portfolio2004 <- left_join(Dirtyportfolio2004 , 
                                   baseline_returns_monthly2004,
                                   by = "date")
RcRb_single_portfolio2004
## # A tibble: 36 x 4
## # Groups:   portfolio [1]
##    portfolio date             Rc       Rb
##        <int> <date>        <dbl>    <dbl>
##  1         1 2003-01-31 -0.0622  -0.0587 
##  2         1 2003-02-28  0.0109  -0.0170 
##  3         1 2003-03-31  0.0194   0.00836
##  4         1 2003-04-30  0.0684   0.0810 
##  5         1 2003-05-30  0.105    0.0509 
##  6         1 2003-06-30 -0.00297  0.0113 
##  7         1 2003-07-31 -0.0314   0.0162 
##  8         1 2003-08-29  0.103    0.0179 
##  9         1 2003-09-30 -0.0207  -0.0119 
## 10         1 2003-10-31  0.0475   0.0550 
## # ... with 26 more rows
RcRb_single_portfolio2004 %>%
    tq_performance(Ra = Rc, Rb = Rb, performance_fun = table.CAPM) %>%
  t()
##                      [,1]
## portfolio          1.0000
## ActivePremium      0.3399
## Alpha              0.0236
## AnnualizedAlpha    0.3237
## Beta               1.0011
## Beta-              1.9649
## Beta+              0.7743
## Correlation        0.5243
## Correlationp-value 0.0010
## InformationRatio   2.1511
## R-squared          0.2749
## TrackingError      0.1580
## TreynorRatio       0.4509

Merged ESG and Dirty

RaRc_single_portfolio2004 <- left_join(Dirtyportfolio2004 , 
                                   ESGportfolio2004,
                                   by = "date")
RaRc_single_portfolio2004
## # A tibble: 36 x 5
## # Groups:   portfolio.x [1]
##    portfolio.x date             Rc portfolio.y       Ra
##          <int> <date>        <dbl>       <int>    <dbl>
##  1           1 2003-01-31 -0.0622            1 -0.0466 
##  2           1 2003-02-28  0.0109            1 -0.00899
##  3           1 2003-03-31  0.0194            1  0.0136 
##  4           1 2003-04-30  0.0684            1  0.0745 
##  5           1 2003-05-30  0.105             1  0.111  
##  6           1 2003-06-30 -0.00297           1  0.0102 
##  7           1 2003-07-31 -0.0314            1  0.0449 
##  8           1 2003-08-29  0.103             1  0.0754 
##  9           1 2003-09-30 -0.0207            1 -0.0407 
## 10           1 2003-10-31  0.0475            1  0.102  
## # ... with 26 more rows

2003-2005 Non-ESG CAPM Table, S&P 500 Baseline

RaRc_single_portfolio2004 %>%
    tq_performance(Ra = Ra, Rb = Rc, performance_fun = table.CAPM) %>%
  t()
##                       [,1]
## portfolio.x         1.0000
## ActivePremium      -0.1886
## Alpha               0.0072
## AnnualizedAlpha     0.0901
## Beta                0.4080
## Beta-               0.5901
## Beta+               0.5004
## Correlation         0.4787
## Correlationp-value  0.0031
## InformationRatio   -1.0649
## R-squared           0.2291
## TrackingError       0.1771
## TreynorRatio        0.6443
ggplot(ESGportfolio2004, 
       aes(x = Ra, fill = "Return Density")) +
  geom_density(alpha = 0.4) +
  labs(title = "ESG Returns 2003-2005",x = "Percentage Return", y = "Return Occurences (Monthly)")

ggplot(ESGportfolio2004,
       aes(x = date, 
           y = Ra)) +
  geom_line() +
  labs(title = "ESG Portfolio Returns 2003-2005",x = "Date", y = "Percentage Return")

ggplot(Dirtyportfolio2004, 
       aes(x = Rc, fill = "Return Density")) +
  geom_density(alpha = 0.4) +
  labs(title = "Non-ESG Portfolio Returns 2003-2005",x = "Percentage Return", y = "Return Occurences (Monthly)")

ggplot(Dirtyportfolio2004, 
       aes(x = date, 
           y = Rc)) +
  geom_line() +
  labs(title = "Non-ESG Portfolio Returns 2003-2005",x = "Date", y = "Percentage Return")

##2008-2010

ESG stock returns

ESGstock_returns_monthly2009 <- c("A", "TXN", "VOYA", "TIF", "BBY", "HPQ", "CSCO", "GWW", "AVT", "ADSK", "NVDA", "PVH", "CBRE", "MAN", "ON", "BLL", "ECL", "HAS", "MSI", "AVY", "VFC", "AWK", "ORA", "CLX", "K", "CL", "UNF", "NEE", "ADBE", "VZ", "CRM", "WSM", "APD", "HBI", "ITRI", "TROW", "OSK", "KEYS", "DAL", "PRU", "VAR", "MSFT", "CTL", "KO", "FSLR", "RHI", "LRCX", "ATR", "SBUX", "CMI") %>%
    tq_get(get  = "stock.prices",
           from = "2008-01-01",
           to   = "2010-12-31") %>%
    group_by(symbol) %>%
    tq_transmute(select     = adjusted, 
                 mutate_fun = periodReturn, 
                 period     = "monthly", 
                 col_rename = "Ra")
ESGstock_returns_monthly2009
## # A tibble: 1,725 x 3
## # Groups:   symbol [48]
##    symbol date            Ra
##    <chr>  <date>       <dbl>
##  1 A      2008-01-31 -0.0672
##  2 A      2008-02-29 -0.0960
##  3 A      2008-03-31 -0.0255
##  4 A      2008-04-30  0.0127
##  5 A      2008-05-30  0.238 
##  6 A      2008-06-30 -0.0495
##  7 A      2008-07-31  0.0146
##  8 A      2008-08-29 -0.0361
##  9 A      2008-09-30 -0.147 
## 10 A      2008-10-31 -0.252 
## # ... with 1,715 more rows

Monthly Returns for individual ESG stocks

ESGmonthly2009 <- ESGstock_returns_monthly2009 %>%
    tq_repeat_df(n = 1)
ESGmonthly2009
## # A tibble: 1,725 x 4
## # Groups:   portfolio [1]
##    portfolio symbol date            Ra
##        <int> <chr>  <date>       <dbl>
##  1         1 A      2008-01-31 -0.0672
##  2         1 A      2008-02-29 -0.0960
##  3         1 A      2008-03-31 -0.0255
##  4         1 A      2008-04-30  0.0127
##  5         1 A      2008-05-30  0.238 
##  6         1 A      2008-06-30 -0.0495
##  7         1 A      2008-07-31  0.0146
##  8         1 A      2008-08-29 -0.0361
##  9         1 A      2008-09-30 -0.147 
## 10         1 A      2008-10-31 -0.252 
## # ... with 1,715 more rows

weighting for ESG portfolio

weights <- c(.02222, .02222, 0, .02222, .02222, .02222, .02222, .02222, 0, 0,
.02222, .02222, .02222, .02222, .02222, .02222, .02222, .02222, .02222, .02222,
.02222, .02222, .02222, 0, .02222, .02222, .02222, .02222, .02222, .02222,
.02222, .02222, .02222, .02222, .02222, .02222, .02222, 0, .02222, .02222,
.02222, .02222, .02222, .02222, .02222, .02222, .02222, .02222, .02222, .02222)

ESGstocks <- c("A", "TXN", "VOYA", "TIF", "BBY", "HPQ", "CSCO", "GWW", "AVT", "ADSK", "NVDA", "PVH", "CBRE", "MAN", "ON", "BLL", "ECL", "HAS", "MSI", "AVY", "VFC", "AWK", "ORA", "CLX", "K", "CL", "UNF", "NEE", "ADBE", "VZ", "CRM", "WSM", "APD", "HBI", "ITRI", "TROW", "OSK", "KEYS", "DAL", "PRU", "VAR", "MSFT", "CTL", "KO", "FSLR", "RHI", "LRCX", "ATR", "SBUX", "CMI")

weights_table <-  tibble(ESGstocks) %>%
    tq_repeat_df(n = 1) %>%
    bind_cols(tibble(weights)) %>%
    group_by(portfolio)
weights_table
## # A tibble: 50 x 3
## # Groups:   portfolio [1]
##    portfolio ESGstocks weights
##        <int> <chr>       <dbl>
##  1         1 A          0.0222
##  2         1 TXN        0.0222
##  3         1 VOYA       0     
##  4         1 TIF        0.0222
##  5         1 BBY        0.0222
##  6         1 HPQ        0.0222
##  7         1 CSCO       0.0222
##  8         1 GWW        0.0222
##  9         1 AVT        0     
## 10         1 ADSK       0     
## # ... with 40 more rows

ESG portfolio returns

ESGportfolio2009  <-
  ESGmonthly2009 %>%
    tq_portfolio(assets_col  = symbol, 
                 returns_col = Ra, 
                 weights     = weights_table, 
                 col_rename  = "Ra")
ESGportfolio2009
## # A tibble: 36 x 3
## # Groups:   portfolio [1]
##    portfolio date             Ra
##        <int> <date>        <dbl>
##  1         1 2008-01-31 -0.0593 
##  2         1 2008-02-29 -0.0274 
##  3         1 2008-03-31 -0.00972
##  4         1 2008-04-30  0.0770 
##  5         1 2008-05-30  0.0343 
##  6         1 2008-06-30 -0.0894 
##  7         1 2008-07-31 -0.0181 
##  8         1 2008-08-29  0.0324 
##  9         1 2008-09-30 -0.0967 
## 10         1 2008-10-31 -0.226  
## # ... with 26 more rows

S&P for baseline

baseline_returns_monthly2009 <- "^GSPC" %>%
    tq_get(get  = "stock.prices",
           from = "2008-01-01",
           to   = "2010-12-31") %>%
    tq_transmute(select     = adjusted, 
                 mutate_fun = periodReturn, 
                 period     = "monthly", 
                 col_rename = "Rb")
baseline_returns_monthly2009
## # A tibble: 36 x 2
##    date             Rb
##    <date>        <dbl>
##  1 2008-01-31 -0.0474 
##  2 2008-02-29 -0.0348 
##  3 2008-03-31 -0.00596
##  4 2008-04-30  0.0475 
##  5 2008-05-30  0.0107 
##  6 2008-06-30 -0.0860 
##  7 2008-07-31 -0.00986
##  8 2008-08-29  0.0122 
##  9 2008-09-30 -0.0908 
## 10 2008-10-31 -0.169  
## # ... with 26 more rows

Merged S&P and ESG

RaRb_single_portfolio2009 <- left_join(ESGportfolio2009 , 
                                   baseline_returns_monthly2009,
                                   by = "date")
RaRb_single_portfolio2009
## # A tibble: 36 x 4
## # Groups:   portfolio [1]
##    portfolio date             Ra       Rb
##        <int> <date>        <dbl>    <dbl>
##  1         1 2008-01-31 -0.0593  -0.0474 
##  2         1 2008-02-29 -0.0274  -0.0348 
##  3         1 2008-03-31 -0.00972 -0.00596
##  4         1 2008-04-30  0.0770   0.0475 
##  5         1 2008-05-30  0.0343   0.0107 
##  6         1 2008-06-30 -0.0894  -0.0860 
##  7         1 2008-07-31 -0.0181  -0.00986
##  8         1 2008-08-29  0.0324   0.0122 
##  9         1 2008-09-30 -0.0967  -0.0908 
## 10         1 2008-10-31 -0.226   -0.169  
## # ... with 26 more rows

2008-2010 ESG CAPM Table, S&P 500 Baseline

RaRb_single_portfolio2009 %>%
    tq_performance(Ra = Ra, Rb = Rb, performance_fun = table.CAPM) %>%
  t()
##                      [,1]
## portfolio          1.0000
## ActivePremium      0.0997
## Alpha              0.0099
## AnnualizedAlpha    0.1249
## Beta               1.2152
## Beta-              1.1908
## Beta+              1.0933
## Correlation        0.9669
## Correlationp-value 0.0000
## InformationRatio   1.1698
## R-squared          0.9349
## TrackingError      0.0852
## TreynorRatio       0.0444
Dirtystock_returns_monthly2009 <- c("WMB", "DVN", "SLB", "BKR", "VLO", "PSX", "NBL", "KMI", "OKE", "HES","EMN", "ECL", "NBR", "VAL", "CF", "SEE", "NEM", "VMC", "MLM", "SWN", "MPC", "CWEN", "DUK", "COG", "XOM") %>%
    tq_get(get  = "stock.prices",
           from = "2008-01-01",
           to   = "2010-12-31") %>%
    group_by(symbol) %>%
    tq_transmute(select     = adjusted, 
                 mutate_fun = periodReturn, 
                 period     = "monthly", 
                 col_rename = "Rc")
Dirtystock_returns_monthly2009 
## # A tibble: 756 x 3
## # Groups:   symbol [21]
##    symbol date            Rc
##    <chr>  <date>       <dbl>
##  1 WMB    2008-01-31 -0.106 
##  2 WMB    2008-02-29  0.127 
##  3 WMB    2008-03-31 -0.0811
##  4 WMB    2008-04-30  0.0764
##  5 WMB    2008-05-30  0.0715
##  6 WMB    2008-06-30  0.0634
##  7 WMB    2008-07-31 -0.205 
##  8 WMB    2008-08-29 -0.0317
##  9 WMB    2008-09-30 -0.234 
## 10 WMB    2008-10-31 -0.113 
## # ... with 746 more rows

Monthly Returns for individual Dirty Investing

Dirtymonthly2009 <- Dirtystock_returns_monthly2009 %>%
    tq_repeat_df(n = 1)
Dirtymonthly2009
## # A tibble: 756 x 4
## # Groups:   portfolio [1]
##    portfolio symbol date            Rc
##        <int> <chr>  <date>       <dbl>
##  1         1 WMB    2008-01-31 -0.106 
##  2         1 WMB    2008-02-29  0.127 
##  3         1 WMB    2008-03-31 -0.0811
##  4         1 WMB    2008-04-30  0.0764
##  5         1 WMB    2008-05-30  0.0715
##  6         1 WMB    2008-06-30  0.0634
##  7         1 WMB    2008-07-31 -0.205 
##  8         1 WMB    2008-08-29 -0.0317
##  9         1 WMB    2008-09-30 -0.234 
## 10         1 WMB    2008-10-31 -0.113 
## # ... with 746 more rows

weighting for dirty portfolio

weights1 <- c(.047619, .047619, .047619, .047619, .047619, 0, .047619, 0, .047619, .047619,
.047619, .047619, .047619, .047619, .047619, .047619, .047619, .047619, .047619, .047619,
0, 0, .047619, .047619, .047619)

Dirtystocks <- c("WMB", "DVN", "SLB", "BKR", "VLO", "PSX", "NBL", "KMI", "OKE", "HES","EMN", "ECL", "NBR", "VAL", "CF", "SEE", "NEM", "VMC", "MLM", "SWN", "MPC", "CWEN", "DUK", "COG", "XOM")

weights_table1 <-  tibble(Dirtystocks) %>%
    tq_repeat_df(n = 1) %>%
    bind_cols(tibble(weights1)) %>%
    group_by(portfolio)
weights_table1
## # A tibble: 25 x 3
## # Groups:   portfolio [1]
##    portfolio Dirtystocks weights1
##        <int> <chr>          <dbl>
##  1         1 WMB           0.0476
##  2         1 DVN           0.0476
##  3         1 SLB           0.0476
##  4         1 BKR           0.0476
##  5         1 VLO           0.0476
##  6         1 PSX           0     
##  7         1 NBL           0.0476
##  8         1 KMI           0     
##  9         1 OKE           0.0476
## 10         1 HES           0.0476
## # ... with 15 more rows

Dirty portfolio returns

Dirtyportfolio2009  <-
  Dirtymonthly2009 %>%
    tq_portfolio(assets_col  = symbol, 
                 returns_col = Rc, 
                 weights     = weights_table1, 
                 col_rename  = "Rc")
Dirtyportfolio2009
## # A tibble: 36 x 3
## # Groups:   portfolio [1]
##    portfolio date             Rc
##        <int> <date>        <dbl>
##  1         1 2008-01-31 -0.0549 
##  2         1 2008-02-29  0.0475 
##  3         1 2008-03-31 -0.0255 
##  4         1 2008-04-30  0.107  
##  5         1 2008-05-30  0.0560 
##  6         1 2008-06-30  0.00951
##  7         1 2008-07-31 -0.124  
##  8         1 2008-08-29  0.00759
##  9         1 2008-09-30 -0.155  
## 10         1 2008-10-31 -0.210  
## # ... with 26 more rows

Merged S&P and Dirty

RcRb_single_portfolio2009 <- left_join(Dirtyportfolio2009 , 
                                   baseline_returns_monthly2009,
                                   by = "date")
RcRb_single_portfolio2009
## # A tibble: 36 x 4
## # Groups:   portfolio [1]
##    portfolio date             Rc       Rb
##        <int> <date>        <dbl>    <dbl>
##  1         1 2008-01-31 -0.0549  -0.0474 
##  2         1 2008-02-29  0.0475  -0.0348 
##  3         1 2008-03-31 -0.0255  -0.00596
##  4         1 2008-04-30  0.107    0.0475 
##  5         1 2008-05-30  0.0560   0.0107 
##  6         1 2008-06-30  0.00951 -0.0860 
##  7         1 2008-07-31 -0.124   -0.00986
##  8         1 2008-08-29  0.00759  0.0122 
##  9         1 2008-09-30 -0.155   -0.0908 
## 10         1 2008-10-31 -0.210   -0.169  
## # ... with 26 more rows

2008-2010 Non-ESG CAPM Table, S&P 500 Baseline

RcRb_single_portfolio2009 %>%
    tq_performance(Ra = Rc, Rb = Rb, performance_fun = table.CAPM) %>%
  t()
##                       [,1]
## portfolio           1.0000
## ActivePremium       0.0429
## Alpha               0.0048
## AnnualizedAlpha     0.0593
## Beta                1.0244
## Beta-               1.0143
## Beta+               1.1701
## Correlation         0.8285
## Correlationp-value  0.0000
## InformationRatio    0.2805
## R-squared           0.6864
## TrackingError       0.1529
## TreynorRatio       -0.0027

Merged ESG and Dirty

RaRc_single_portfolio2009 <- left_join(Dirtyportfolio2009 , 
                                   ESGportfolio2009,
                                   by = "date")
RaRc_single_portfolio2009
## # A tibble: 36 x 5
## # Groups:   portfolio.x [1]
##    portfolio.x date             Rc portfolio.y       Ra
##          <int> <date>        <dbl>       <int>    <dbl>
##  1           1 2008-01-31 -0.0549            1 -0.0593 
##  2           1 2008-02-29  0.0475            1 -0.0274 
##  3           1 2008-03-31 -0.0255            1 -0.00972
##  4           1 2008-04-30  0.107             1  0.0770 
##  5           1 2008-05-30  0.0560            1  0.0343 
##  6           1 2008-06-30  0.00951           1 -0.0894 
##  7           1 2008-07-31 -0.124             1 -0.0181 
##  8           1 2008-08-29  0.00759           1  0.0324 
##  9           1 2008-09-30 -0.155             1 -0.0967 
## 10           1 2008-10-31 -0.210             1 -0.226  
## # ... with 26 more rows

To find Correlation between ESG and Dirty 2008-2010

RaRc_single_portfolio2009 %>%
    tq_performance(Ra = Ra, Rb = Rc, performance_fun = table.CAPM) %>%
  t()
##                      [,1]
## portfolio.x        1.0000
## ActivePremium      0.0568
## Alpha              0.0052
## AnnualizedAlpha    0.0644
## Beta               0.8192
## Beta-              0.7876
## Beta+              0.8565
## Correlation        0.8060
## Correlationp-value 0.0000
## InformationRatio   0.3312
## R-squared          0.6496
## TrackingError      0.1714
## TreynorRatio       0.0659
ggplot(ESGportfolio2009, 
       aes(x = Ra, fill = "Return Density")) +
  geom_density(alpha = 0.4) +
  labs(title = "ESG Returns 2008-2010",x = "Percentage Return", y = "Return Occurences (Monthly)")

ggplot(ESGportfolio2009, 
       aes(x = date, 
           y = Ra)) +
  geom_line() +
  labs(title = "ESG Portfolio Returns 2008-2010",x = "Date", y = "Percentage Return")

ggplot(Dirtyportfolio2009, 
       aes(x = Rc, fill = "Return Density")) +
  geom_density(alpha = 0.4) +
  labs(title = "Non-ESG Portfolio Returns 2008-2010",x = "Percentage Return", y = "Return Occurences (Monthly)")

ggplot(Dirtyportfolio2009, 
       aes(x = date, 
           y = Rc)) +
  geom_line() +
  labs(title = "Non-ESG Portfolio Returns 2008-2010",x = "Date", y = "Percentage Return")

###2017-2019

ESG stock returns

ESGstock_returns_monthly2017 <- c("A", "TXN", "VOYA", "TIF", "BBY", "HPQ", "CSCO", "GWW", "AVT", "ADSK", "NVDA", "PVH", "CBRE", "MAN", "ON", "BLL", "ECL", "HAS", "MSI", "AVY", "VFC", "AWK", "ORA", "CLX", "K", "CL", "UNF", "NEE", "ADBE", "VZ", "CRM", "WSM", "APD", "HBI", "ITRI", "TROW", "OSK", "KEYS", "DAL", "PRU", "VAR", "MSFT", "CTL", "KO", "FSLR", "RHI", "LRCX", "ATR", "SBUX", "CMI") %>%
    tq_get(get  = "stock.prices",
           from = "2017-01-01",
           to   = "2019-12-31") %>%
    group_by(symbol) %>%
    tq_transmute(select     = adjusted, 
                 mutate_fun = periodReturn, 
                 period     = "monthly", 
                 col_rename = "Ra")
ESGstock_returns_monthly2017
## # A tibble: 1,800 x 3
## # Groups:   symbol [50]
##    symbol date             Ra
##    <chr>  <date>        <dbl>
##  1 A      2017-01-31  0.0533 
##  2 A      2017-02-28  0.0476 
##  3 A      2017-03-31  0.0332 
##  4 A      2017-04-28  0.0412 
##  5 A      2017-05-31  0.0961 
##  6 A      2017-06-30 -0.0149 
##  7 A      2017-07-31  0.00809
##  8 A      2017-08-31  0.0825 
##  9 A      2017-09-29 -0.00803
## 10 A      2017-10-31  0.0618 
## # ... with 1,790 more rows

Monthly Returns for individual ESG stocks

ESGmonthly2017 <- ESGstock_returns_monthly2017 %>%
    tq_repeat_df(n = 1)
ESGmonthly2017
## # A tibble: 1,800 x 4
## # Groups:   portfolio [1]
##    portfolio symbol date             Ra
##        <int> <chr>  <date>        <dbl>
##  1         1 A      2017-01-31  0.0533 
##  2         1 A      2017-02-28  0.0476 
##  3         1 A      2017-03-31  0.0332 
##  4         1 A      2017-04-28  0.0412 
##  5         1 A      2017-05-31  0.0961 
##  6         1 A      2017-06-30 -0.0149 
##  7         1 A      2017-07-31  0.00809
##  8         1 A      2017-08-31  0.0825 
##  9         1 A      2017-09-29 -0.00803
## 10         1 A      2017-10-31  0.0618 
## # ... with 1,790 more rows

weighting for ESG portfolio

weights <- c(.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02,.02)

ESGstocks <- c("A", "TXN", "VOYA", "TIF", "BBY", "HPQ", "CSCO", "GWW", "AVT", "ADSK", "NVDA", "PVH", "CBRE", "MAN", "ON", "BLL", "ECL", "HAS", "MSI", "AVY", "VFC", "AWK", "ORA", "CLX", "K", "CL", "UNF", "NEE", "ADBE", "VZ", "CRM", "WSM", "APD", "HBI", "ITRI", "TROW", "OSK", "KEYS", "DAL", "PRU", "VAR", "MSFT", "CTL", "KO", "FSLR", "RHI", "LRCX", "ATR", "SBUX", "CMI")

weights_table <-  tibble(ESGstocks) %>%
    tq_repeat_df(n = 1) %>%
    bind_cols(tibble(weights)) %>%
    group_by(portfolio)
weights_table
## # A tibble: 50 x 3
## # Groups:   portfolio [1]
##    portfolio ESGstocks weights
##        <int> <chr>       <dbl>
##  1         1 A            0.02
##  2         1 TXN          0.02
##  3         1 VOYA         0.02
##  4         1 TIF          0.02
##  5         1 BBY          0.02
##  6         1 HPQ          0.02
##  7         1 CSCO         0.02
##  8         1 GWW          0.02
##  9         1 AVT          0.02
## 10         1 ADSK         0.02
## # ... with 40 more rows

ESG portfolio returns

ESGportfolio2017  <-
  ESGmonthly2017 %>%
    tq_portfolio(assets_col  = symbol, 
                 returns_col = Ra, 
                 weights     = weights_table, 
                 col_rename  = "Ra")
ESGportfolio2017
## # A tibble: 36 x 3
## # Groups:   portfolio [1]
##    portfolio date            Ra
##        <int> <date>       <dbl>
##  1         1 2017-01-31 0.0104 
##  2         1 2017-02-28 0.0403 
##  3         1 2017-03-31 0.0132 
##  4         1 2017-04-28 0.00948
##  5         1 2017-05-31 0.0359 
##  6         1 2017-06-30 0.00779
##  7         1 2017-07-31 0.0268 
##  8         1 2017-08-31 0.00712
##  9         1 2017-09-29 0.0250 
## 10         1 2017-10-31 0.0551 
## # ... with 26 more rows

S&P for baseline

baseline_returns_monthly2017 <- "^GSPC" %>%
    tq_get(get  = "stock.prices",
           from = "2017-01-01",
           to   = "2019-12-31") %>%
    tq_transmute(select     = adjusted, 
                 mutate_fun = periodReturn, 
                 period     = "monthly", 
                 col_rename = "Rb")
baseline_returns_monthly2017
## # A tibble: 36 x 2
##    date              Rb
##    <date>         <dbl>
##  1 2017-01-31  0.00932 
##  2 2017-02-28  0.0372  
##  3 2017-03-31 -0.000389
##  4 2017-04-28  0.00909 
##  5 2017-05-31  0.0116  
##  6 2017-06-30  0.00481 
##  7 2017-07-31  0.0193  
##  8 2017-08-31  0.000546
##  9 2017-09-29  0.0193  
## 10 2017-10-31  0.0222  
## # ... with 26 more rows

Merged S&P and ESG

RaRb_single_portfolio2017 <- left_join(ESGportfolio2017 , 
                                   baseline_returns_monthly2017,
                                   by = "date")
RaRb_single_portfolio2017
## # A tibble: 36 x 4
## # Groups:   portfolio [1]
##    portfolio date            Ra        Rb
##        <int> <date>       <dbl>     <dbl>
##  1         1 2017-01-31 0.0104   0.00932 
##  2         1 2017-02-28 0.0403   0.0372  
##  3         1 2017-03-31 0.0132  -0.000389
##  4         1 2017-04-28 0.00948  0.00909 
##  5         1 2017-05-31 0.0359   0.0116  
##  6         1 2017-06-30 0.00779  0.00481 
##  7         1 2017-07-31 0.0268   0.0193  
##  8         1 2017-08-31 0.00712  0.000546
##  9         1 2017-09-29 0.0250   0.0193  
## 10         1 2017-10-31 0.0551   0.0222  
## # ... with 26 more rows

2017-2019 ESG CAPM Table, S&P 500 Baseline

RaRb_single_portfolio2017 %>%
    tq_performance(Ra = Ra, Rb = Rb, performance_fun = table.CAPM) %>%
  t()
##                      [,1]
## portfolio          1.0000
## ActivePremium      0.0680
## Alpha              0.0035
## AnnualizedAlpha    0.0427
## Beta               1.1650
## Beta-              1.3241
## Beta+              1.2751
## Correlation        0.9628
## Correlationp-value 0.0000
## InformationRatio   1.5360
## R-squared          0.9269
## TrackingError      0.0443
## TreynorRatio       0.1663
Dirtystock_returns_monthly2017 <- c("WMB", "DVN", "SLB", "BKR", "VLO", "PSX", "NBL", "KMI", "OKE", "HES","EMN", "ECL", "NBR", "VAL", "CF", "SEE", "NEM", "VMC", "MLM", "SWN", "MPC", "CWEN", "DUK", "COG", "XOM") %>%
    tq_get(get  = "stock.prices",
           from = "2017-01-01",
           to   = "2019-12-31") %>%
    group_by(symbol) %>%
    tq_transmute(select     = adjusted, 
                 mutate_fun = periodReturn, 
                 period     = "monthly", 
                 col_rename = "Rc")
Dirtystock_returns_monthly2017
## # A tibble: 900 x 3
## # Groups:   symbol [25]
##    symbol date            Rc
##    <chr>  <date>       <dbl>
##  1 WMB    2017-01-31 -0.0833
##  2 WMB    2017-02-28 -0.0173
##  3 WMB    2017-03-31  0.0549
##  4 WMB    2017-04-28  0.0351
##  5 WMB    2017-05-31 -0.0663
##  6 WMB    2017-06-30  0.0697
##  7 WMB    2017-07-31  0.0495
##  8 WMB    2017-08-31 -0.0645
##  9 WMB    2017-09-29  0.0196
## 10 WMB    2017-10-31 -0.0503
## # ... with 890 more rows

Monthly Returns for individual Dirty Investing

Dirtymonthly2017 <- Dirtystock_returns_monthly2017 %>%
    tq_repeat_df(n = 1)
Dirtymonthly2017
## # A tibble: 900 x 4
## # Groups:   portfolio [1]
##    portfolio symbol date            Rc
##        <int> <chr>  <date>       <dbl>
##  1         1 WMB    2017-01-31 -0.0833
##  2         1 WMB    2017-02-28 -0.0173
##  3         1 WMB    2017-03-31  0.0549
##  4         1 WMB    2017-04-28  0.0351
##  5         1 WMB    2017-05-31 -0.0663
##  6         1 WMB    2017-06-30  0.0697
##  7         1 WMB    2017-07-31  0.0495
##  8         1 WMB    2017-08-31 -0.0645
##  9         1 WMB    2017-09-29  0.0196
## 10         1 WMB    2017-10-31 -0.0503
## # ... with 890 more rows

weighting for dirty portfolio

weights1 <- c(.04,.04,.04,.04,.04,.04,.04,.04,.04,.04,.04,.04,.04,.04,.04,.04,.04,.04,.04,.04,.04,.04,.04,.04,.04)

Dirtystocks <- c("WMB", "DVN", "SLB", "BKR", "VLO", "PSX", "NBL", "KMI", "OKE", "HES","EMN", "ECL", "NBR", "VAL", "CF", "SEE", "NEM", "VMC", "MLM", "SWN", "MPC", "CWEN", "DUK", "COG", "XOM")

weights_table1 <-  tibble(Dirtystocks) %>%
    tq_repeat_df(n = 1) %>%
    bind_cols(tibble(weights1)) %>%
    group_by(portfolio)
weights_table1
## # A tibble: 25 x 3
## # Groups:   portfolio [1]
##    portfolio Dirtystocks weights1
##        <int> <chr>          <dbl>
##  1         1 WMB             0.04
##  2         1 DVN             0.04
##  3         1 SLB             0.04
##  4         1 BKR             0.04
##  5         1 VLO             0.04
##  6         1 PSX             0.04
##  7         1 NBL             0.04
##  8         1 KMI             0.04
##  9         1 OKE             0.04
## 10         1 HES             0.04
## # ... with 15 more rows

Dirty portfolio returns

Dirtyportfolio2017  <-
  Dirtymonthly2017 %>%
    tq_portfolio(assets_col  = symbol, 
                 returns_col = Rc, 
                 weights     = weights_table1, 
                 col_rename  = "Rc")
Dirtyportfolio2017
## # A tibble: 36 x 3
## # Groups:   portfolio [1]
##    portfolio date             Rc
##        <int> <date>        <dbl>
##  1         1 2017-01-31 -0.0113 
##  2         1 2017-02-28 -0.0327 
##  3         1 2017-03-31 -0.00751
##  4         1 2017-04-28 -0.0255 
##  5         1 2017-05-31 -0.0366 
##  6         1 2017-06-30  0.00816
##  7         1 2017-07-31  0.0223 
##  8         1 2017-08-31 -0.0305 
##  9         1 2017-09-29  0.0640 
## 10         1 2017-10-31 -0.0118 
## # ... with 26 more rows

Merged S&P and Dirty

RcRb_single_portfolio2017 <- left_join(Dirtyportfolio2017, 
                                   baseline_returns_monthly2017,
                                   by = "date")
RcRb_single_portfolio2017
## # A tibble: 36 x 4
## # Groups:   portfolio [1]
##    portfolio date             Rc        Rb
##        <int> <date>        <dbl>     <dbl>
##  1         1 2017-01-31 -0.0113   0.00932 
##  2         1 2017-02-28 -0.0327   0.0372  
##  3         1 2017-03-31 -0.00751 -0.000389
##  4         1 2017-04-28 -0.0255   0.00909 
##  5         1 2017-05-31 -0.0366   0.0116  
##  6         1 2017-06-30  0.00816  0.00481 
##  7         1 2017-07-31  0.0223   0.0193  
##  8         1 2017-08-31 -0.0305   0.000546
##  9         1 2017-09-29  0.0640   0.0193  
## 10         1 2017-10-31 -0.0118   0.0222  
## # ... with 26 more rows

2017-2019 Non-ESG CAPM Table, S&P 500 Baseline

RcRb_single_portfolio2017 %>%
    tq_performance(Ra = Rc, Rb = Rb, performance_fun = table.CAPM) %>%
  t()
##                       [,1]
## portfolio           1.0000
## ActivePremium      -0.1222
## Alpha              -0.0100
## AnnualizedAlpha    -0.1137
## Beta                1.0925
## Beta-               1.2132
## Beta+               1.0397
## Correlation         0.7732
## Correlationp-value  0.0000
## InformationRatio   -1.1229
## R-squared           0.5978
## TrackingError       0.1088
## TreynorRatio        0.0032

Merged ESG and Dirty

RaRc_single_portfolio2017 <- left_join(Dirtyportfolio2017 , 
                                   ESGportfolio2017,
                                   by = "date")
RaRc_single_portfolio2017
## # A tibble: 36 x 5
## # Groups:   portfolio.x [1]
##    portfolio.x date             Rc portfolio.y      Ra
##          <int> <date>        <dbl>       <int>   <dbl>
##  1           1 2017-01-31 -0.0113            1 0.0104 
##  2           1 2017-02-28 -0.0327            1 0.0403 
##  3           1 2017-03-31 -0.00751           1 0.0132 
##  4           1 2017-04-28 -0.0255            1 0.00948
##  5           1 2017-05-31 -0.0366            1 0.0359 
##  6           1 2017-06-30  0.00816           1 0.00779
##  7           1 2017-07-31  0.0223            1 0.0268 
##  8           1 2017-08-31 -0.0305            1 0.00712
##  9           1 2017-09-29  0.0640            1 0.0250 
## 10           1 2017-10-31 -0.0118            1 0.0551 
## # ... with 26 more rows

To find Correlation between ESG and Dirty 2017-2019

RaRc_single_portfolio2017 %>%
    tq_performance(Ra = Ra, Rb = Rc, performance_fun = table.CAPM) %>%
  t()
##                      [,1]
## portfolio.x        1.0000
## ActivePremium      0.1902
## Alpha              0.0148
## AnnualizedAlpha    0.1927
## Beta               0.6408
## Beta-              1.0293
## Beta+              0.5486
## Correlation        0.7482
## Correlationp-value 0.0000
## InformationRatio   1.6574
## R-squared          0.5598
## TrackingError      0.1148
## TreynorRatio       0.3024
ggplot(ESGportfolio2017, 
       aes(x = Ra, fill = "Return Density")) +
  geom_density(alpha = 0.4) +
  labs(title = "ESG Returns 2017-2019",x = "Percentage Return", y = "Return Occurences (Monthly)")

ggplot(ESGportfolio2017, 
       aes(x = date, 
           y = Ra)) +
  geom_line() +
  labs(title = "ESG Portfolio Returns 2017-2019",x = "Date", y = "Percentage Return")

ggplot(Dirtyportfolio2017, 
       aes(x = Rc, fill = "Return Density")) +
  geom_density(alpha = 0.4) +
  labs(title = "Non-ESG Portfolio Returns 2017-2019",x = "Percentage Return", y = "Return Occurences (Monthly)")

ggplot(Dirtyportfolio2017, 
       aes(x = date, 
           y = Rc)) +
  geom_line() +
  labs(title = "Non-ESG Portfolio Returns 2017-2019",x = "Date", y = "Percentage Return")