library(quantmod)
library(PerformanceAnalytics)

Are carbon emitters dragging the SENSEX down?

The markets are booming, Covid or no Covid, or maybe because of Covid. As of this writing, the BSE SENSEX is at an all-time-high, crossing 58,000, giving us a 1 year return of 50%. This is heady stuff. Is this a secular growth story? Is a rising tide lifting all boats? Or do some boats rise while others sink?

First, let’s look at the BSE SENSEX - over the last 3 years, encompassing the period before, during, and after(?) Covid lockdowns.

getSymbols(c("^BSESN", "BSE-500.BO"), src = "yahoo")
## [1] "^BSESN"     "BSE-500.BO"
#candleChart(`BSE-500.BO`, subset='last 3 years', main = "SENSEX", theme=chartTheme('white'))
candleChart(BSESN, subset='last 3 years', main = "SENSEX", theme=chartTheme('white'))

After the initial crash in March 2020, the markets have rebounded spectacularly, displaying the ‘V-shaped’ recovery that the ‘real’ economy refuses to give us. What is driving this incredible rally?

The BSE SENSEX is “designed to measure the performance of the 30 largest, most liquid and financially sound companies across key sectors of the Indian economy that are listed at BSE Ltd”

Across the ‘key sectors of the Indian Economy’, how are legacy, fossil-fuel based, emission-laden industries performing compared to their relatively ‘greener’ peers? Let’s break it down. The BSE SENSEX has numerous side-indices which can shed light on the matter.

Fossils in the SENSEX

The fossil-fuels sector of India is mainly comprised of:

  • Oil & Gas
  • Energy
  • Power (Excepting RE)

Let’s look at BSE-OIL GAS first:

BSE_OILGAS <- read.zoo(file = "data/BSE-OILGAS.csv", sep = ",", header = TRUE, format = "%d-%m-%Y", drop = FALSE)
BSE_OILGAS <- as.xts(BSE_OILGAS)
plot(BSE_OILGAS)

Another V-shaped recovery, but with a few stutters. Only a 26.4% 1-year recovery compared to the parent index, even from the bottom of the Covid crash.

How about the Energy sector?

BSE_ENERGY <- read.zoo(file = "data/BSE-ENERGY.csv", sep = ",", header = TRUE, format = "%d-%m-%Y", drop = FALSE)
BSE_ENERGY <- as.xts(BSE_ENERGY)
plot(BSE_ENERGY)

No recovery here, in fact a negative 1-Year return of 12.87%.

The Power sector, however, tells a different story:

BSE_POWER <- read.zoo(file = "data/BSE-POWER.csv", sep = ",", header = TRUE, format = "%d-%m-%Y", drop = FALSE)
BSE_POWER <- as.xts(BSE_POWER)
plot(BSE_POWER)

Our V-shaped recovery is back, with a 1-year return of almost 75%!

But this begs the question, unlike the Oil & Gas and Energy sectors - how much of this growth was due to renewable energy?

The BSE-POWER index is composed of the following Stocks - please pay attention to the trends:

power_stock_symbols <- c("ABB.BO", "ADANIGREEN.BO", "ADANIPOWER.BO", "ADANITRANS.BO",
                         "BHEL.BO", "IEX.BO", "JSWENERGY.BO", "KEC.BO",
                         "NHPC.BO", "NTPC.BO", "POWERGRID.BO", "RELINFRA.BO",
                         "SIEMENS.BO", "TATAPOWER.BO", "THERMAX.BO", "TORNTPOWER.BO")

ABB.BO <- read.zoo(file = "data/ABB.BO.csv", sep = ",", header = TRUE, format = "%d-%m-%Y", drop = FALSE); ABB.BO <- as.xts(ABB.BO)
ADANIGREEN.BO <- read.zoo(file = "data/ADANIGREEN.BO.csv", sep = ",", header = TRUE, format = "%d-%m-%Y", drop = FALSE); ADANIGREEN.BO <- as.xts(ADANIGREEN.BO)
ADANIPOWER.BO <- read.zoo(file = "data/ADANIPOWER.BO.csv", sep = ",", header = TRUE, format = "%d-%m-%Y", drop = FALSE); ADANIPOWER.BO <- as.xts(ADANIPOWER.BO)
ADANITRANS.BO <- read.zoo(file = "data/ADANITRANS.BO.csv", sep = ",", header = TRUE, format = "%d-%m-%Y", drop = FALSE); ADANITRANS.BO <- as.xts(ADANITRANS.BO)
BHEL.BO <- read.zoo(file = "data/BHEL.BO.csv", sep = ",", header = TRUE, format = "%d-%m-%Y", drop = FALSE); BHEL.BO <- as.xts(BHEL.BO)
IEX.BO <- read.zoo(file = "data/IEX.BO.csv", sep = ",", header = TRUE, format = "%d-%m-%Y", drop = FALSE); IEX.BO <- as.xts(IEX.BO)
JSWENERGY.BO <- read.zoo(file = "data/JSWENERGY.BO.csv", sep = ",", header = TRUE, format = "%d-%m-%Y", drop = FALSE); JSWENERGY.BO <- as.xts(JSWENERGY.BO)
KEC.BO <- read.zoo(file = "data/KEC.BO.csv", sep = ",", header = TRUE, format = "%d-%m-%Y", drop = FALSE); KEC.BO <- as.xts(KEC.BO)
NHPC.BO <- read.zoo(file = "data/NHPC.BO.csv", sep = ",", header = TRUE, format = "%d-%m-%Y", drop = FALSE); NHPC.BO <- as.xts(NHPC.BO)
NTPC.BO <- read.zoo(file = "data/NTPC.BO.csv", sep = ",", header = TRUE, format = "%d-%m-%Y", drop = FALSE); NTPC.BO <- as.xts(NTPC.BO)
POWERGRID.BO <- read.zoo(file = "data/POWERGRID.BO.csv", sep = ",", header = TRUE, format = "%d-%m-%Y", drop = FALSE); POWERGRID.BO <- as.xts(POWERGRID.BO)
RELINFRA.BO <- read.zoo(file = "data/RELINFRA.BO.csv", sep = ",", header = TRUE, format = "%d-%m-%Y", drop = FALSE); RELINFRA.BO <- as.xts(RELINFRA.BO)
SIEMENS.BO <- read.zoo(file = "data/SIEMENS.BO.csv", sep = ",", header = TRUE, format = "%d-%m-%Y", drop = FALSE); SIEMENS.BO <- as.xts(SIEMENS.BO)
TATAPOWER.BO <- read.zoo(file = "data/TATAPOWER.BO.csv", sep = ",", header = TRUE, format = "%d-%m-%Y", drop = FALSE); TATAPOWER.BO <- as.xts(TATAPOWER.BO)
THERMAX.BO <- read.zoo(file = "data/THERMAX.BO.csv", sep = ",", header = TRUE, format = "%d-%m-%Y", drop = FALSE); THERMAX.BO <- as.xts(THERMAX.BO)
TORNTPOWER.BO <- read.zoo(file = "data/TORNTPOWER.BO.csv", sep = ",", header = TRUE, format = "%d-%m-%Y", drop = FALSE); TORNTPOWER.BO <- as.xts(TORNTPOWER.BO)

chartSeries(ADANIGREEN.BO, theme = 'white')

chartSeries(ABB.BO, theme = 'white')

chartSeries(ADANIPOWER.BO, theme = 'white')

chartSeries(ADANITRANS.BO, theme = 'white')

chartSeries(BHEL.BO, theme = 'white')

chartSeries(IEX.BO, theme = 'white')

chartSeries(JSWENERGY.BO, theme = 'white')

chartSeries(KEC.BO, theme = 'white')

chartSeries(NHPC.BO, theme = 'white')

chartSeries(NTPC.BO, theme = 'white')

chartSeries(POWERGRID.BO, theme = 'white')

chartSeries(RELINFRA.BO, theme = 'white')

chartSeries(SIEMENS.BO, theme = 'white')

chartSeries(TATAPOWER.BO, theme = 'white')

chartSeries(THERMAX.BO, theme = 'white')

chartSeries(TORNTPOWER.BO, theme = 'white')

Looking at these graphs, we see a great deal of variation. Particularly, ADANIGREEN and ADANITRANS are big over-performers, while NHPC, NTPC, RELINFRA and BHEL have lost a lot of value.

Is there a pattern here? ADANIGREEN is obviously a Renewable Energy company, and what’s more, is the second biggest constituent of the index. What about the other over-and-under-performers? What happens to the index if we remove the gains due to Renewable Energy?

This is how the BSE-POWER index is constructed:

Stock Weightage
ADANI TRANSMISSION LTD 20.19%
ADANI GREEN ENERGY LTD 18.67%
POWER GRID CORPORATION OF INDIA LTD 13.55%
NTPC LTD 12.38%
SIEMENS LTD 9.01%
TATA POWER COMPANY LTD 4.72%
ADANI POWER LTD 4.41%
ABB INDIA LTD 4.41%
NHPC LTD 3.04%
TORRENT POWER LTD 2.60%
BHARAT HEAVY ELECTRICALS LTD 2.12%
INDIAN ENERGY EXCHANGE LTD 1.86%
THERMAX LTD 1.86%
KEC INTERNATIONAL LTD 1.20%

As we can see, ADANIGREEN represents 18.67%, or almost one-fifths of the index. ADANITRANS, the leader at 20.19%, is a transmission company and not involved in generation, fossil-fueled or otherwise. If we reconstitute the index after removing these stocks, what will the returns look like?

This is what the newly reconsituted index will look like:

library(knitr)
NEW_BSE_POWER_Weightage <- BSE_POWER_Weightage[-c(1,2), c(1,2)]
NEW_BSE_POWER_Weightage$Weightage <- as.numeric(sub("%", "", NEW_BSE_POWER_Weightage$Weightage))
NEW_BSE_POWER_Weightage$New_Weights <- 100 * NEW_BSE_POWER_Weightage$Weightage/(100 - (18.67+20.19))
kable(NEW_BSE_POWER_Weightage)
Stock Weightage New_Weights
3 POWER GRID CORPORATION OF INDIA LTD 13.55 22.162251
4 NTPC LTD 12.38 20.248610
5 SIEMENS LTD 9.01 14.736670
6 TATA POWER COMPANY LTD 4.72 7.719987
7 ADANI POWER LTD 4.41 7.212954
8 ABB INDIA LTD 4.41 7.212954
9 NHPC LTD 3.04 4.972195
10 TORRENT POWER LTD 2.60 4.252535
11 BHARAT HEAVY ELECTRICALS LTD 2.12 3.467452
12 INDIAN ENERGY EXCHANGE LTD 1.86 3.042198
13 THERMAX LTD 1.86 3.042198
14 KEC INTERNATIONAL LTD 1.20 1.962708

Note: To check our math, please click the ‘code’ button above the table to the right.

How does this new, ‘Brown-Power’ index perform?

BSE_BROWNER_POWER <- POWERGRID.BO$Close.Price * 0.22162251 +
                     NTPC.BO$Close.Price * 0.20248610 + 
                     SIEMENS.BO$Close.Price * 0.14736670 +
                     TATAPOWER.BO$Close.Price * 0.07719987 +
                     ADANIPOWER.BO$Close.Price *  0.07212954 + 
                     ABB.BO$Close.Price * 0.07212954 + 
                     NHPC.BO$Close.Price * 0.04972195 +
                     TORNTPOWER.BO$Close.Price * 0.04252535 + 
                     BHEL.BO$Close.Price * 0.03467452 +
                     IEX.BO$Close.Price * 0.03042198 +
                     THERMAX.BO$Close.Price * 0.03042198 +
                     KEC.BO$Close.Price * 0.01962708


{plot(BSE_POWER, theme = 'white', main = "BSE POWER with & without ADANIGREEN/TRANS", col = "green", ylim = c(0, max(BSE_POWER$Price)))
lines(BSE_BROWNER_POWER$Close.Price, col = 'brown')}

That’s a pretty stark difference. The index literally flatlines with the removal of ADANIGREEN and ADANITRANS.

Taking this fact into consideration with the under-performing BSE-ENERGY and BSE-OILGAS, is there a larger pattern here? Are the ‘fossils in the BSE 500’ dragging the entire index down?

BROWN vs GREEN - the canary in the coalmine

For every lakh of rupees you invested in fossil fuels instead of renewables, how much money did you lose?

The BROWNEX index is designed to represent the opportunity cost of investing in ‘brown’ fossil fuel based companies, compared to ‘green’ renewable energy based companies. To arrive at this, we first identify two separate sets of stocks to form two sub-indices:

BROWN: The top 25 purely fossil fuel based companies in the SENSEX 500, weighted by market cap

GREEN: The top 25 purely renewable energy companies in the SENSEX 500, weighted by market cap

The BROWNEX is then calculated by subtracting the return on a 1-Lakh investment in the GREEN from the return on a 1-lakh investment in the BROWN, starting from the year 2018. In other words, this index tracks the opportunity cost of investing in fossil-fuels-based stocks vs renewable-energy-based stocks. When this number is positive, it means your investment in fossil-fuels was the right choice - but when it is negative, it means you would have made more money by choosing to invest in renewables instead.

The BROWN sub-index

To constitute the BROWN index, we first combined the constituents of the BSE OIL & GAS, ENERGY and POWER indices. We first removed all companies who are not directly consuming or producing fossil fuels. We then removed all companies which derived greater than 25% from renewables. Then the top 25 were selected based on market capitalization. These 25 stocks, weighted by market cap, form the BROWN sub-index:

The GREEN index

To constiture the GREEN index, we identified all Renewable energy companies in the BSE 500. WE then removed all companies which derived greater than 25% from fossil fuels. Then, the top 25 were selected based on market capitalization. These 25 stocks, weights by market cap, form the GREEN sub-index:

BROWNEX

The BROWNEX