Sustainable Finance Week 3 Homework

Author

Ryan Showman

library(tidyverse) 
-- Attaching packages --------------------------------------- tidyverse 1.3.1 --
v ggplot2 3.3.5     v purrr   0.3.4
v tibble  3.1.6     v dplyr   1.0.7
v tidyr   1.1.4     v stringr 1.4.0
v readr   2.1.1     v forcats 0.5.1
-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
# assign the url to `github_raw_csv_url`
github_raw_csv_url <- "https://raw.githubusercontent.com/t-emery/sais-susfin_data/main/datasets/blackrock_etf_screener_2022-08-30.csv"

# read in the data, and assign it to the object `blackrock_etf_data`
blackrock_etf_data <- read_csv(github_raw_csv_url)
Rows: 393 Columns: 22
-- Column specification --------------------------------------------------------
Delimiter: ","
chr (14): ticker, name, incept_date, net_assets_as_of, asset_class, sub_asse...
dbl  (8): gross_expense_ratio_percent, net_expense_ratio_percent, net_assets...

i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.
blackrock_etf_data
# A tibble: 393 x 22
   ticker name    incept_date gross_expense_r~ net_expense_rat~ net_assets_usd_~
   <chr>  <chr>   <chr>                  <dbl>            <dbl>            <dbl>
 1 IVV    iShare~ 5/15/00                 0.03             0.03          297663.
 2 IEFA   iShare~ 10/18/12                0.07             0.07           84222.
 3 AGG    iShare~ 9/22/03                 0.04             0.03           82344.
 4 IJR    iShare~ 5/22/00                 0.06             0.06           66533.
 5 IEMG   iShare~ 10/18/12                0.09             0.09           64920.
 6 IWF    iShare~ 5/22/00                 0.18             0.18           61831.
 7 IJH    iShare~ 5/22/00                 0.05             0.05           61424.
 8 IWM    iShare~ 5/22/00                 0.19             0.19           53048.
 9 IWD    iShare~ 5/22/00                 0.18             0.18           51913.
10 EFA    iShare~ 8/14/01                 0.32             0.32           44144.
# ... with 383 more rows, and 16 more variables: net_assets_as_of <chr>,
#   asset_class <chr>, sub_asset_class <chr>, region <chr>, market <chr>,
#   location <chr>, investment_style <chr>,
#   sustainability_characteristics_msci_esg_fund_ratings_msci_esg_fund_rating_aaa_ccc <chr>,
#   msci_esg_quality_score_0_10 <dbl>,
#   msci_weighted_average_carbon_intensity_tons_co2e_m_sales <dbl>,
#   msci_esg_percent_coverage <dbl>, sustainable_classification <chr>, ...
blackrock_etf_data <- blackrock_etf_data |> 
  # we are transforming both date columns (currently character strings) into date objects
  # so we can work with them.
  # this syntax is a bit confusing, but selects all columns containing `date` and applies
  # lubridate::mdy() function to them to turn them into date objects. 
  mutate(across(contains("date"), lubridate::mdy)) |>
  # Billions is a more useful magnitude than millions, so we'll create a column with 
  # the assets in billions by dividing by `net_assets_millions` by 1,000 (10^3)
  # If we wanted trillions, we could divide by 1,000,000 (10^6)
  mutate(net_assets_usd_bn = net_assets_usd_mn/10^3) |> 
  # this column doesn't add anything to our analysis - it says that the data is from 8/30/22
  select(-net_assets_as_of)
mini_blackrock_data <- blackrock_etf_data |> 
  # group by whether the fund is an ESG fund or not
  group_by(is_esg) |> 
  # take the top 5 from each group, by net assets
  slice_max(order_by = net_assets_usd_bn, n = 5) |> 
  # select the following columns 
  select(ticker, fund_name = name_wo_ishares_etf, asset_class, sub_asset_class, region, incept_date, net_assets_usd_bn,
         msci_weighted_average_carbon_intensity_tons_co2e_m_sales) |> 
  # rename to `co2_intensity` because the full name is a mouthful, if descriptive.
  rename(co2_intensity = msci_weighted_average_carbon_intensity_tons_co2e_m_sales) |> 
  # always good to ungroup() if you've used a group_by().  We'll discuss later.
  ungroup()
Adding missing grouping variables: `is_esg`
mini_blackrock_data
# A tibble: 10 x 9
   is_esg       ticker fund_name  asset_class sub_asset_class region incept_date
   <chr>        <chr>  <chr>      <chr>       <chr>           <chr>  <date>     
 1 ESG Fund     ESGU   ESG Aware~ Equity      Large/Mid Cap   North~ 2016-12-01 
 2 ESG Fund     ESGD   ESG Aware~ Equity      Large/Mid Cap   Global 2016-06-28 
 3 ESG Fund     ICLN   Global Cl~ Equity      All Cap         Global 2008-06-24 
 4 ESG Fund     ESGE   ESG Aware~ Equity      Large/Mid Cap   Global 2016-06-28 
 5 ESG Fund     DSI    MSCI KLD ~ Equity      Large/Mid Cap   North~ 2006-11-14 
 6 Regular Fund IVV    Core S&P ~ Equity      Large Cap       North~ 2000-05-15 
 7 Regular Fund IEFA   Core MSCI~ Equity      All Cap         Global 2012-10-18 
 8 Regular Fund AGG    Core U.S.~ Fixed Inco~ Multi Sectors   North~ 2003-09-22 
 9 Regular Fund IJR    Core S&P ~ Equity      Small Cap       North~ 2000-05-22 
10 Regular Fund IEMG   Core MSCI~ Equity      All Cap         Global 2012-10-18 
# ... with 2 more variables: net_assets_usd_bn <dbl>, co2_intensity <dbl>
blackrock_etf_data |> 
  glimpse()
Rows: 393
Columns: 22
$ ticker                                                                            <chr> ~
$ name                                                                              <chr> ~
$ incept_date                                                                       <date> ~
$ gross_expense_ratio_percent                                                       <dbl> ~
$ net_expense_ratio_percent                                                         <dbl> ~
$ net_assets_usd_mn                                                                 <dbl> ~
$ asset_class                                                                       <chr> ~
$ sub_asset_class                                                                   <chr> ~
$ region                                                                            <chr> ~
$ market                                                                            <chr> ~
$ location                                                                          <chr> ~
$ investment_style                                                                  <chr> ~
$ sustainability_characteristics_msci_esg_fund_ratings_msci_esg_fund_rating_aaa_ccc <chr> ~
$ msci_esg_quality_score_0_10                                                       <dbl> ~
$ msci_weighted_average_carbon_intensity_tons_co2e_m_sales                          <dbl> ~
$ msci_esg_percent_coverage                                                         <dbl> ~
$ sustainable_classification                                                        <chr> ~
$ name_wo_ishares_etf                                                               <chr> ~
$ is_esg                                                                            <chr> ~
$ years_from_inception                                                              <dbl> ~
$ year_launched                                                                     <dbl> ~
$ net_assets_usd_bn                                                                 <dbl> ~
blackrock_etf_data |> 
  ggplot(aes(y = gross_expense_ratio_percent)) +
  geom_boxplot() +
  facet_wrap(~is_esg, ncol = 1)

This graph demonstrates that ESG funds have a lower on average gross expense ratio. According to investopedia, this is “the total percentage of a fund’s assets that are devoted to running the fund”. While both regular and ESG funds have low gross expense ratios, ESG funds seem to have lower one’s on average. Since a lower gross expense ratio is typically consider good, ESG funds seem to be more profitable (when looking at this aspect at least) because they should have a higher return on investment. If one is a proponent of ESG funds, then this is good news and might explain why Blackrock’s CEO supports ESG funds while not being very pro climate.

blackrock_etf_data |> 
  ggplot(aes(x = asset_class)) +
  geom_bar() + 
  facet_wrap(~is_esg, ncol = 1)

Here we can see that, compared to regular funds, a greater percentage of ESG funds seem to be concentrated in equity. This makes sense since many actors participating in ESG activities are likely to be companies with equity. It also makes sense that there are no ESG funds in categories such as commodities, because commodities are often unsustainable or their processing do not meet ESG goals. However, narrowing down to equity category, I wonder if there is a difference in the sub asset classes within equity between the two different fund types?

blackrock_etf_data |> 
  filter(asset_class == "Equity") %>% 
  ggplot(aes(x = asset_class, fill = sub_asset_class )) +
  geom_bar() + 
  facet_wrap(~is_esg, ncol = 1)

Here we see a large difference in the diversity of the sub asset classes of equity in ESG versus Regular funds. ESG funds seem to be composed of either high/mid cap or All Cap sub asset classes while regular funds seem to be more diverse in their sub asset classes. This would make sense because ESG funds are very specific while Regular funds are a broader category so they might have more diversity within themselves.

etf_comparison_data_github_url <- "https://raw.githubusercontent.com/t-emery/sais-susfin_data/main/datasets/etf_comparison-2022-10-03.csv"

etf_comparison <- read_csv(etf_comparison_data_github_url)
Rows: 537 Columns: 14
-- Column specification --------------------------------------------------------
Delimiter: ","
chr (4): ticker, company_name, sector, esg_uw_ow
dbl (7): esg_etf, standard_etf, esg_tilt, esg_tilt_z_score, esg_tilt_rank, e...
lgl (3): in_esg_only, in_standard_only, in_on_index_only

i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.
etf_comparison %>% 
  filter(standard_etf < 2) %>% 
  ggplot(aes(x = standard_etf, y = esg_etf)) +
  geom_point() +
  geom_smooth(method = lm)
`geom_smooth()` using formula 'y ~ x'

etf_comparison %>% 
  ggplot(aes(x = standard_etf, y = esg_etf)) +
  geom_point() +
  geom_smooth(method = lm)
`geom_smooth()` using formula 'y ~ x'

Here, we have a graph comparing the relationship between standard and esf etf’s. Here we see a strong positively correlated relationship between standard etf values and esg etf values. When removing outliers, the trend line did not change much. This makes sense because it shows that companies with high standard etf’s tend to also have high esg etf’s. This makes sense because the reputation of the company may be more significant than whether they have a standard or esg etf.

etf_comparison %>% 
  ggplot(aes(x = sector, y = esg_tilt)) +
  geom_point()

etf_comparison %>% 
  group_by(sector) %>% 
  mutate(mean_esg_tilt_sector = mean(esg_tilt)) %>% 
  ggplot(aes(x = sector, y = mean_esg_tilt_sector)) +
  geom_point()

This graph shows the different esg tilts by sector. Here it seems that esg tilt does not greatly by sector. Each sector has actors with low esg tilts and actors with high esg tilts. From this visual alone it is difficult to calculate which sector might have a higher average esg tilt. When actually calculating the mean by industry, the second graph shows that the information technology industry has the highest on average esg tilt while the communications industry has on average the lowest esg tilt. This is interesting because it shows what industries still need work regarding esg ambitions.

etf_comparison %>% 
  ggplot(aes( x = esg_tilt)) +
  geom_histogram() +
  stat_bin(bins = 100) +
 facet_wrap(~esg_uw_ow, ncol = 1)
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Here we can see a strong correlation between whether an esg fund is overweight and underweight and esg_tilt. Funds with a greater esg tilt were more likely to be overweight while funds with a smaller esg tilt were more likely to be underweight. This makes sense, but it is interesting that there is some overlap, meaning that esg tilt is not the only factor that determines whether or not a fund is overweight or underweight. This is important because it shows a correlation between whether a fund is overweight or underweight and its esg tilt, which can be used to better understand the impact and properties of esg tilts.