1 Introduction

As part of my course at DBA 4761 by Professor Rafa Nico, I re-engineer the Saudi Aramco IPO valutation taught in class.

1.1 Prospectus

The tabulizer and fuzzyjoin package is used to automate the extraction of data from the IPO prospectus sheet

1.1.1 Reserves Life

Saudi Aramco’s average reserve life is \(52\) years, against \(17\) years at ExxonMobil. Its crude reserves are about five times that of the combined oil reserves of the five major international oil companies, comprising ExxonMobil, Shell, Chevron, Total, and BP.

# 4.6.1.2 - Long reserves life

# lines_text <- raw_text %>% read_lines()
# lines_text[lines_text %>% str_which("proved reserves life")] %>%
inputs <- prospectus.pdf %>% 
  pdf_text() %>% read_lines() %>% 
  grep("proved reserves life", ., value = TRUE) %>% 
  str_match_all("[0-9]+") %>% 
  purrr::pluck(1) %>% 
  unlist %>% first() %>% as.numeric() %>% 
  set_names(c("LONG_RESERVES_LIFE")) %>% as.list

listviewer::jsonedit(inputs)

1.1.2 Gearing

Gearing is a measure of the degree to which Saudi Aramco’s operations are financed by debt. It is widely used by analysts and investors in the oil and gas industry to indicate a company’s financial health and flexibility.

# Table 42 - Gearing and reconciliation
inputs <- extract.values.f(prospectus.pdf, 220, 
  c("Total borrowings", "Cash and cash equivalents", "Total equity")
) %>% 
  set_names(c("TOTAL_BORROWINGS", "CASH_AND_CASH_EQUIVALENTS", "TOTAL_EQUITY")) %>%
  as.list %>% append(inputs)

listviewer::jsonedit(inputs)

1.1.3 Capital

Saudi Aramco has a comprehensive and disciplined internal approval process for capital allocation. Average capital employed is the average of Saudi Aramco’s total borrowings plus total equity at the beginning and end of the applicable period.

# Table 43 - Return on Average Capital Employed (ROACE) and reconciliation
inputs <- extract.values.f(prospectus.pdf, 221, 
  c("Capital employed")
) %>% 
  last() %>% 
  set_names(c("CAPITAL_EMPLOYED")) %>%
  as.list %>% append(inputs)

listviewer::jsonedit(inputs)

1.1.4 Income Statement

The numbers in the financial statement are impressive, painting a picture of the most profitable company in the world, with almost unassailable competitive advantages.

# Table 45 - Income statement
inputs <- extract.values.f(prospectus.pdf, 222, 
  c("Operating income", "Income taxes", "Income before income taxes", "Net income")
) %>% 
  set_names(c("OPERATING_INCOME", "INCOME_BEFORE_INCOME_TAXES", "INCOME_TAXES", "NET_INCOME")) %>%
  as.list %>% append(inputs)

listviewer::jsonedit(inputs)

1.1.5 Balance Sheet

Saudi Aramco’s unique reserves and resources base, operational flexibility, field management, and strong cash flow generation serve as a foundation for its low gearing and flexible balance sheet.

# Table 52 - Balance sheet
inputs <- extract.values.f(prospectus.pdf, 233, 
  c("Shareholders equity", "Investment in joint ventures and associates", 
    "Investment in securities", "Noncontrolling interests")) %>% 
  purrr::discard(is.na) %>% 
  set_names(c("INVESTMENT_JOINT_VENTURES_ASSOCIATES", "INVESTMENT_SECURITIES", 
              "SHAREHOLDERS_EQUITY", "NON_CONTROLLING_INTERESTS")) %>%
  as.list %>% append(inputs)

listviewer::jsonedit(inputs)

1.2 World Bank GDP

For Saudi Aramco, the growth rate in earnings corresponds closely to the growth in Saudi Arabia’s GDP. The reason is simple. Saudi Arabia derives almost \(80\%\) of its GDP from oil.

# World Development Indicators (WDI)
if (F){
  gdp_growth <- WDI::WDI(
    country=c("SAU"), 
    indicator="NY.GDP.MKTP.KD.ZG", # = GDP growth (annual %)
    start=2018, 
    end=2018
  )$NY.GDP.MKTP.KD.ZG[[1]] # 2.214969
  #save(gdp_growth, file="data/gdp_growth.rda")
}
load(file="data/gdp_growth.rda")

inputs <- gdp_growth %>%
  set_names(c("GDP_GROWTH")) %>% #  (annual %)
  as.list %>% append(inputs)

listviewer::jsonedit(inputs)

1.3 U.S.Treasuries

We use the \(10\) year U.S. treasury rate because the currency choice for the Saudi Aramco discounted cash flow valuation is U.S. dollars.

if (F){
  treasury.rates.f <- function(year=2019){
    require(dplyr)
    require(quantmod)
      # year=calendar year to pull results for
      
    getSymbols.FRED("DGS10", env = environment())
    rates_raw <- na.locf(DGS10)
    
    rates_raw <- rates_raw[paste0(year, "/")] %>%
      timetk::tk_tbl(rename_index="date") %>%
      rename(trates=DGS10)
  
    # Returns treasury rates for the given duration
    rates <- rates_raw %>%
      # clean_names(.) %>%
      mutate(
        date = as.Date(date, "%m/%d/%y"),
        month = factor(months(date), levels=month.name)
      ) %>%
      mutate_at(
        vars(-one_of("date", "month")),
        as.numeric
      )
    
    summary <- rates %>%
      select(-date) %>%
      group_by(month) %>%
      summarise_all(list(mean))
    
    return(summary)
  }
  treasury_rates <- treasury.rates.f(2019) # 1.792
  save(treasury_rates, file="data/treasury_rates.rda")
}

load(file="data/treasury_rates.rda")

inputs <- treasury_rates %>% 
  set_names(c("TREASURY_YIELD_10YR")) %>%
  as.list %>% append(inputs)

listviewer::jsonedit(inputs)

1.4 Damodaran Online

1.4.1 Risk Premium

Damodaran’s equity risk premium is calculated by adding the mature market premium estimated for the US to the country-specific risk premium. To arrive at Saudi Arabia’s equity risk premium, Damodaran augmented the default spread by a scaling factor to reflect the higher risk of equity.

risk.premium.f <- function(){
  require(tidyxl) # It does not support the binary file formats '.xlsb' or '.xls'.
  
  # data_file <- file.path("data", "ctrypremJuly19.xlsx")
  url <- 'http://pages.stern.nyu.edu/~adamodar/pc/datasets/ctrypremJuly19.xlsx'
  data_file <- download.f(url)
  tidy_table <- xlsx_cells(data_file, sheets = "ERPs by country") %>% 
    filter(!is_blank, row >= 7 & row <=162) %>%
    select(row, col, data_type, character, numeric)
  # equity risk premium with a country risk premium for Saudi Arabia added to 
  # the mature market premium estimated for the US. 
  i <- tidy_table %>% filter(character=="Saudi Arabia") %>% pull(row)
  j <- tidy_table %>% filter(character=="Total Equity Risk Premium") %>% pull(col)
  v = tidy_table %>% filter(row == i & col == j) %>% pull(numeric)
  return(v * 100)
}

erp <- risk.premium.f()
inputs <- erp %>%
  set_names(c("EQUITY_RISK_PREMIUM")) %>%
  as.list %>% append(inputs)

listviewer::jsonedit(inputs)

1.4.2 Credit Spread

We use a credit spread that lenders would charge a large integrated oil & gas company with a specific credit rating, and add it to the avg. 10 year U.S. treasury rate to arrive at Saudi Aramco’s cost of debt.

rating.spread.f <- function(){
  require(readxl)
  # data_file <- file.path("data", "ratings.xls")
  # Ratings, Interest Coverage Ratios and Default Spread
  url <- 'http://www.stern.nyu.edu/~adamodar/pc/ratings.xls'
  data_file <- download.f(url)
  v <- read_excel(
    data_file, sheet = "Start here Ratings sheet", 
    range = "A18:D33") %>% # A18:D33 -> rating table for large manufacturing firms
    janitor::clean_names() %>%
    filter(rating_is=="A1/A+") %>%
    # https://www.bloomberg.com/news/articles/2019-04-01/saudi-oil-giant-aramco-starts-bond-roadshow-gets-a-rating
    pull(spread_is)
  return(v * 100)
}

cs <- rating.spread.f()
inputs <- cs %>%
  set_names(c("CREDIT_SPREAD")) %>%
  as.list %>% append(inputs)

listviewer::jsonedit(inputs)

1.4.3 Unlevered Beta

In calculating the cost of equity, we use an unlevered beta for Saudi Aramco based on integrated oil companies for both cash flow models: (1) cash flows after reinvestment needs and taxes, but before debt payments (FCFF); and (2) cash flows after taxes, reinvestments, and debt payments (FCFE).

# Effective Tax rate, Unlevered beta
unlevered.beta.f <- function(){
  require(readxl)
  # data_file <- file.path("data", "betaGlobal.xls")
  # Unlevered Betas (Global)
  url <- 'http://www.stern.nyu.edu/~adamodar/pc/datasets/betaGlobal.xls'
  data_file <- download.f(url)
  # A10:F106 -> Industry Name, Number of firms, Beta, D/E Ratio, 
  v <- read_excel(data_file, sheet = "Industry Averages", range = "A10:F106") %>%
    janitor::clean_names() %>%
    filter(industry_name=="Oil/Gas (Integrated)") %>%
    pull(unlevered_beta)
  return(v)
}

ub <- unlevered.beta.f()
inputs <- ub %>%
  set_names(c("UNLEVERED_BETA")) %>%
  as.list %>% append(inputs)

listviewer::jsonedit(inputs)

1.4.4 Marginal Tax

The marginal tax rate is the number we use to compute Saudi Aramco’s after-tax cost of debt. Given Saudi Aramco’s marginal corporate tax rate, the after-tax cost of debt equates to the treasury rate plus the credit spread that lenders would charge Saudi Aramco multiplied by one minus the marginal tax rate.

marginal.tax.f <- function(){
  require(readxl)
  # data_file <- file.path("data", "countrytaxrates.xls")
  url <- 'http://www.stern.nyu.edu/~adamodar/pc/datasets/countrytaxrates.xls'
  data_file <- download.f(url)
  # Corporate Marginal Tax Rates - By country
  v <- read_excel(data_file, sheet = "Sheet1") %>%
    janitor::clean_names() %>%
    filter(country=="Saudi Arabia") %>%
    pull(x2018)
  return(v * 100)
}

mtr <- marginal.tax.f()
inputs <- mtr %>%
  set_names(c("MARGINAL_TAX_RATE")) %>%
  as.list %>% append(inputs)

listviewer::jsonedit(inputs)

2 DCF Valuation

  • Calculate the discount rate or rates to use in the valuation for Saudi Aramco.

    • cost of equity for equity investors (FCFE)
    • cost of capital for all claimholders (FCFF)
  • Calculate the current earnings and cash flows of Saudi Aramco for equity investors and for all claimholders.

  • Calculate the future earnings and cash flows of Saudi Aramco by estimating an expected growth rate in earnings (GDP growth).

  • Calculate Saudi Aramco’s Discounted Cash Flow valuations.

2.1 Summary

Below, I valued Saudi Aramco using a weighted DCF equity valuation: \(50\%\) for Operating income & FCFF and \(50\%\) for Equity income & FCFE.

Saudi Aramco Equity Valuation ($ trillions)
Weighted FCFF FCFE
$1.76 $1.83 $1.69

2.2 Sensitivity

It is very likely that investors will reward Saudi Aramco for:

  • Ultralong reserve life
  • Lower gearing than each of the five major international oil companies
  • Ability to execute some of the world’s largest upstream and downstream capital projects
  • Higher operating cash flow, free cash flow, EBIT, EBITDA, and Return on Average Capital Employed (ROACE) than each of the five major international oil companies

However, investors could also penalize Saudi Aramco for the geopolitical risk and the central banking conspiracy to keep interest rates low.

2.2.1 Risk Premium

Given the risk of attacks against Saudi Aramco’ oil and gas infrastructure, there is a chance that the equity risk premium and the cost of capital could go up. However, if we remove that geopolitical risk from consideration and look at the remaining risk, Aramco is a remarkably safe investment, with the mind-boggling profits and cash flows and access to huge oil reserves consisting of \(201.4\) billion barrels of crude oil and condensate, \(25.4\) billion barrels of NGLs, and \(185.7\) trillion standard cubic feet of natural gas.

2.2.2 Treasury Yield

Central banks around the world have conspired to keep interest rates low and artificially push up the price of financial assets. The end game in this story is that the central banks will eventually be forced to face reality, where the U.S. \(10\) Year Treasury will rise to normal levels and the value of Saudi Aramco could decrease.

2.2.3 Reserves Life

Saudi Aramco’s oil equivalent reserves were sufficient for proved reserves life of \(52\) years, which was significantly longer than the \(9\) to \(17\) year proved reserves life of any of the five major international oil companies based on publicly available information.

The report was produced using RStudio/knittr
on 2023-10-29 at 22:20:58 (+08, GMT+0800)