Climate Impact of Green Bonds at Country and Company Levels

Jun Fang
April 19th, 2024

Why does this matter?

Investors globally are looking to protect their finances while promoting sustainability, amid urgent global issues like climate change, biodiversity erosion, and poverty. For over a decade, bond markets have offered avenues to tackle these issues and progress towards the Sustainable Development Goals (SDGs). Since the World Bank’s inaugural green bond in 2008, the market for bonds funding environmental and social initiatives continues to expand.

Understanding the significance of green bonds is crucial, as they are designed to yield positive environmental impacts. However, assessing their effectiveness is challenging due to the primarily qualitative nature of the information on the environmental projects they fund.

This research aims to examine the correlation between green bond issuances and greenhouse gas (GHG) emissions. Critical climate-related factors about the issuer will be scrutinized, including:

  • The variability in emissions across different regions and industries for a comparable volume of green bond issuances, along with an exploration of the underlying reasons for such discrepancies.
  • The company level issuer’s emissions trajectory and its overall impact on the climate.

Methodology

To do this analysis, I combined four three sets.

· The Issuance by Region Data from Climate Bonds summarizes a green bonds issuance across regions and industry among the years.

· The International Monetary Fund’s Annual Greenhouse Gas (GHG) Air Emissions Accounts contains annual greenhouse gas emissions by industry and by region.

· The MSCI’s Green Bonds and Climate provides a concrete case study including bond- and company-level data

The foled code below provided outlines the process for importing, cleaning and merging the data.

Code
# options(repos = c(CRAN = "https://cran.rstudio.com/"))
library(here) 
library(purrr)
library(readxl)
library(tidyr)
library(dplyr)
library(tidyverse)
library(ggthemes)
library(plotly)
library(rworldmap)
library(ggrepel)
# knitr::opts_knit$set(root.dir = "/Users/fangjun/Desktop/Sais/Year 2/Term 2/Sustainable Finance/Final Paper")

Comparison by Region

This part examines the relationship between green bond issuance and green bond emissions among various regions.

Overall, there seems to be a trend where emissions decrease as more green bonds are issued, suggesting a positive correlation between green financing and sustainability outcomes. However, some fluctuations in this trend necessitate further investigation to understand the complexities behind these variations.


Asia-Pacific Emissions Increase with Issuance:
The sudden increase in emissions in the Asia-Pacific region with increased issuance could be due to a number of factors. One possibility is that the funds are being invested in long-term projects that initially increase emissions due to construction or development activities before they start yielding emission reductions. Alternatively, this could reflect a transitional phase where investments are made into cleaner, but not zero-emission, energy sources (like natural gas as a replacement for coal), which reduce overall emissions but not immediately to a level lower than before the investments. It might also suggest that while green bonds are being issued, the projects they are funding in the Asia-Pacific may not be as emission-efficient or -reductive as those in other regions, or there may be a time lag before the emissions benefits of these investments are realized.

Code
#Select specific columns
annual_greenhouse_gas_air_emissions <- read.csv("emission by region.csv")

selected_annual_greenhouse_gas_air_emissions <- select(annual_greenhouse_gas_air_emissions, 2, 11, 19:27)

renamed_selected_annual_greenhouse_gas_air_emissions <- selected_annual_greenhouse_gas_air_emissions %>%
  mutate(
    Region = case_when(
      Country %in% c("Northern Africa", "Sub-Saharan Africa") ~ "Africa",
      Country %in% c("Central Asia", "Eastern Asia", "South-eastern Asia", "Southern Asia", "Western Asia") ~ "Asia-Pacific",
      Country %in% c("Eastern Europe", "Northern Europe", "Southern Europe", "Western Europe") ~ "Europe",
      Country == "Latin America and the Caribbean" ~ "Latin America",
      Country %in% c("Americas", "Northern America") ~ "North America",
      TRUE ~ "Other"
    )
  )

#rearrange the columns to make "Region" the first column
renamed_selected_annual_greenhouse_gas_air_emissions <- renamed_selected_annual_greenhouse_gas_air_emissions %>%
  select(Region, everything())

# Group by 'Region' and then summarise each numerical column by summing up
combined_annual_greenhouse_gas_air_emissions <- renamed_selected_annual_greenhouse_gas_air_emissions %>%
  group_by(Region) %>%
  summarise(across(where(is.numeric), sum, na.rm = TRUE))

# Convert all year columns to numeric
green_bonds_emissions <- combined_annual_greenhouse_gas_air_emissions %>%
  mutate(across(-Region, as.numeric, .names = "converted_{.col}"))

green_bonds_emissions_long <- green_bonds_emissions %>%
  pivot_longer(
    cols = starts_with("converted_"),  # Now selecting the converted columns
    names_to = "Year",
    names_prefix = "converted_X",  # Remove the 'converted_' prefix from the year names
    values_to = "GreenBondsEmissions"
  )

library(here)
library(readxl)
# Construct the path
path_to_sheet <- "/Users/fangjun/Desktop/Sais/Year 2/Term 2/Sustainable Finance/Final Paper/green bond by region.xlsx"
# Read the Excel file
green_bond_by_region<- read_excel (path_to_sheet)

green_bond_issuance_by_region <- green_bond_by_region %>%
  rename(Region = Country)

green_bond_issuance_by_region <- green_bond_issuance_by_region %>%
  mutate(across(-Region, as.numeric, .names = "converted_{.col}"))

green_bonds_issuance_long <- green_bond_issuance_by_region %>%
  pivot_longer(
    cols = starts_with("converted_"),  # Now selecting the converted columns
    names_to = "Year",
    names_prefix = "converted_",  # Remove the 'converted_' prefix from the year names
    values_to = "GreenBondsIssuance"
  )

# Assuming emissions_long is also prepared
combined_green_bonds_emission_comparison <- left_join(green_bonds_issuance_long, green_bonds_emissions_long, by = c("Region", "Year"))

# Selecting specific columns
combined_green_bonds_emission_comparison2 <- combined_green_bonds_emission_comparison %>%
  na.omit()

p <- ggplot(combined_green_bonds_emission_comparison2, 
            aes(x = GreenBondsIssuance, y = GreenBondsEmissions, 
                size = GreenBondsEmissions, color = Region,
                text = paste("Year:", Year, "<br>",
                             "Issuance:", GreenBondsIssuance, "<br>",
                             "Emissions:", GreenBondsEmissions))) + 
  geom_point(alpha = 0.4) + 
  theme_pander() + 
  xlab("Green Bonds Issuance") + 
  ylab("Green Bonds Emissions") + 
  scale_x_log10() + 
  scale_y_log10() + 
  ggtitle("Relationship between Green Bonds Emissions and Issuance") + 
  theme(legend.position = "right")

# Convert to an interactive plot with customized tooltips
ggplotly_obj <- ggplotly(p, tooltip = "text")

# Print the plotly object to display the interactive plot
ggplotly_obj

Mapping Climate Impact by Continent

This map provides a more visualized summary analysis of GHC Emissions across the world.

Code
combined_green_bonds_emission_comparison2 %>% 
  select(-GreenBondsIssuance) %>% 
  na.omit() %>% 
  filter(Region %in% c("Africa", "Asia-Pacific", "Europe", "Latin America", "North America")) -> data.sub

data.sub %>% 
  mutate(Region = case_when(Region == "Asia-Pacific" ~ "Eurasia", 
                            Region == "Europe" ~ "Eurasia", 
                            Region == "Latin America" ~ "South America", 
                            Region == "North America" ~ "North America", 
                            Region == "Africa" ~ "Africa")) -> data.sub

# get coarse resolution world from rworldmap
sPDF <- getMap()
country_continent.df <- data.frame(Country = sPDF$ISO3, Region = sPDF$continent)
country_continent.df %>% 
  left_join(data.sub, by = "Region") -> country_continent.df2
  
plot_ly(country_continent.df2, type='choropleth', locations=country_continent.df2$Country, 
        z=country_continent.df2$GreenBondsEmissions, 
        text=country_continent.df2$Region, colors = "Greens") -> fig
# specify map projection/options
g <- list(
  showframe = F,
  showland = T,
  landcolor = toRGB("grey")
)

fig %>% 
  layout(title = "GHC Emissions By Continent", 
         geo = g)

Comparison by Industry

This research also examines the relationship between green bond issuance and green bond emissions across different industries.

Discrepancy in Emissions Between Building and Energy Industries:

Despite similar levels of bond issuance, the Building industry might be showing lower emissions compared to the Energy industry due to several factors. Buildings can implement green technologies like efficient insulation, smart energy systems, and renewable energy sources that result in immediate emission reductions. On the other hand, the Energy industry might be in the process of transitioning to greener alternatives, such as shifting from fossil fuels to renewable energy sources, which can be a long-term process with emissions reductions only realized over a more extended period.

Transport Industry’s Issuance vs. Emissions:

The Transport industry shows a decrease in emissions with increased bond issuance. This could be a result of the industry’s efforts in electrifying transportation, such as electric vehicles (EVs), which are less emission-intensive than traditional combustion engines. As more funds are allocated to such projects, the emissions per dollar of bond issuance could decline. For other industries, the volatility in emissions despite the increase in bond issuance may reflect the diverse nature of projects funded by green bonds. Some projects may have direct emission reduction impacts, while others may have indirect or longer-term benefits. Furthermore, it may also indicate varying efficiencies in how effectively each industry uses the proceeds from green bonds to achieve emission reductions.

These findings reinforces the need to explore more mechanisms that fitted in the natural of each industries, so as to maximize the climate impact of green bonds.

Code
renamed_industry_selected_annual_greenhouse_gas_air_emissions <- selected_annual_greenhouse_gas_air_emissions %>%
  mutate(
    Industries = case_when(
      Industry == "Electricity, Gas, Steam and Air Conditioning Supply" ~ "Energy",
      Industry == "Construction" ~ "Buildings",
      Industry == "Transportation and Storage" ~ "Transport",
      Industry == "Water supply; sewerage, waste management and remediation activities" ~ "Water",
      Industry == "Total Households" ~ "Land Use",
      TRUE ~ "Other"
    )
  )%>%
 filter(Industries != "Other")

path_to_sheet <- "/Users/fangjun/Desktop/Sais/Year 2/Term 2/Sustainable Finance/Final Paper/green bond by industry.xlsx" 
green_bond_by_industry <- read_excel(path_to_sheet)

renamed_green_bond_issuance_by_industry <- green_bond_by_industry%>%
rename(Industries = Industry) %>%
  filter(Industries %in% c("Energy", "Buildings", "Transport", "Water", "Land Use"))

# Convert all year columns to numeric
green_bonds_emissions_by_industry_sums <- renamed_industry_selected_annual_greenhouse_gas_air_emissions %>%
  group_by(Industries) %>%
  summarise(
    Sum2014 = sum(X2014, na.rm = TRUE),
    Sum2015 = sum(X2015, na.rm = TRUE),
    Sum2016 = sum(X2016, na.rm = TRUE),
    Sum2017 = sum(X2017, na.rm = TRUE),
    Sum2018 = sum(X2018, na.rm = TRUE),
    Sum2019 = sum(X2019, na.rm = TRUE),
    Sum2020 = sum(X2020, na.rm = TRUE),
    Sum2021 = sum(X2021, na.rm = TRUE),
    Sum2022 = sum(X2022, na.rm = TRUE),
  )

green_bonds_emissions_by_industry <- green_bonds_emissions_by_industry_sums %>%
  mutate(across(-Industries, as.numeric, .names = "converted_{.col}"))

green_bonds_emissions_by_industry_long <- green_bonds_emissions_by_industry %>%
  pivot_longer(
    cols = starts_with("converted_"),  # Now selecting the converted columns
    names_to = "Year",
    names_prefix = "converted_Sum",  # Remove the 'converted_' prefix from the year names
    values_to = "GreenBondsEmissions"
  )

converted_renamed_green_bond_issuance_by_industry <- renamed_green_bond_issuance_by_industry %>%
  mutate(across(-Industries, as.numeric, .names = "converted_{.col}"))

renamed_green_bond_issuance_by_industry_long <- converted_renamed_green_bond_issuance_by_industry %>%
  pivot_longer(
    cols = starts_with("converted_"),  # Now selecting the converted columns
    names_to = "Year",
    names_prefix = "converted_",  # Remove the 'converted_' prefix from the year names
    values_to = "GreenBondsIssuance"
  )

combined_green_bonds_emission_industry_comparison <- left_join(renamed_green_bond_issuance_by_industry_long, green_bonds_emissions_by_industry_long, by = c("Industries", "Year"))

# Selecting specific columns
combined_green_bonds_emission_industry_comparison2 <- combined_green_bonds_emission_industry_comparison %>%
  select(Industries, Year, GreenBondsIssuance, GreenBondsEmissions)

# Selecting specific columns
combined_green_bonds_emission_industry_comparison3 <- combined_green_bonds_emission_industry_comparison2 %>%
  select(Industries, Year, GreenBondsIssuance, GreenBondsEmissions) %>%
  na.omit()

p <- ggplot(combined_green_bonds_emission_industry_comparison3, 
            aes(x = GreenBondsIssuance, y = GreenBondsEmissions, 
                size = GreenBondsEmissions, color = Industries,
                text = paste("Emissions:", GreenBondsEmissions, "<br>",
                             "Year:", Year, "<br>",
                             "Issuance:", GreenBondsIssuance))) + 
  geom_point(alpha = 0.4) + 
  theme_pander() + 
  xlab("Green Bonds Issuance") + 
  ylab("Green Bonds Emissions") + 
  scale_x_log10() + 
  scale_y_log10() + 
  ggtitle("Relationship between Green Bonds Emissions and Issuance (Industry)") + 
  theme(legend.position = "right")

# Use ggplotly to convert the plot to an interactive plot
ggplotly_obj <- ggplotly(p, tooltip = "text")  # Tooltip will display text defined in ggplot

# Print the plotly object to display it
ggplotly_obj

Green bonds and climate: Company level case study

One of the key attractions of green bonds is the green projects that they finance. Yet information on these projects is highly qualitative, making it hard to compare green bonds.

This study adopted a financed-emissions metric from the International Capital Markets Association’s (ICMA) and MSCI, with TPF green bond method to estimate the tCO2E/USD million of bond outstanding for 15 bondds. With aiming to provide a quantitative basis to compare climate impact of green bonds, this study also try to find out if there’re certain consistency between green bonds with higher climate return.

This case study chooses 18 green bonds issued by 14 European firms. Of the 14 firms, three have ITRs (which represents climate impact) below 1.5°C: Iberdrola, PostNL, and Prologis Inc. However, all have negative Climate VaRs (climate risk).

Higher values of EUR outstanding amount are distributed across a range of Climate VaRs, which suggests that there isn’t a simple linear relationship between how much a company has issued in green bonds and the associated climate risk.

A commercially-minded investor might seek out firms with postive Climate VaR readings. Impact investors might seek out firms with positive Climate VaR readings, while also looking to avoid bonds issued by firms with high ITR figures.

Code
path_to_sheet <- "/Users/fangjun/Desktop/Sais/Year 2/Term 2/Sustainable Finance/Final Paper/ bond and company level data.xlsx" 
X_bond_and_company_level_data <- read_excel(path_to_sheet)

X_bond_and_company_level_data %>% 
  rename("Climate VaR" = "Climate\r\nVaR") %>% 
  rename("EUROutstanding Amount" = "EUROutstanding\r\nAmount") %>% 
  mutate(`Climate VaR` = `Climate VaR` %>% as.numeric(), 
         `EUROutstanding Amount` = `EUROutstanding Amount` %>% as.numeric()) %>% 
  na.omit() %>% 
  ggplot() + 
  geom_point(aes(x = `Climate VaR`, y = `EUROutstanding Amount`, color = IssuerName, size = `Climate VaR`), 
             alpha = 1) + 
  theme_pander() + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
  scale_x_continuous(n.breaks = 10) + 
  geom_label_repel(aes(x = `Climate VaR`, y = `EUROutstanding Amount`, label = IssuerName, color = IssuerName), 
                   box.padding   = unit (.25,"lines"),
                  point.padding = unit (.25, "lines"),
                  segment.color = 'grey50', 
                  show_guide=T) + 
  theme(legend.position = "none")