As part of my course at DBA 4761 by Professor Rafa Nico, I re-engineer the Saudi Aramco IPO valutation taught in class.
The tabulizer and fuzzyjoin package is used
to automate the extraction of data from the IPO prospectus sheet
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
Calculate the discount rate or rates to use in the valuation for Saudi Aramco.
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.
Below, I valued Saudi Aramco using a weighted DCF equity valuation: \(50\%\) for Operating income & FCFF and \(50\%\) for Equity income & FCFE.
| Weighted | FCFF | FCFE |
|---|---|---|
| $1.76 | $1.83 | $1.69 |
It is very likely that investors will reward Saudi Aramco for:
However, investors could also penalize Saudi Aramco for the geopolitical risk and the central banking conspiracy to keep interest rates low.
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.
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)