I recently read an interesting article by Anatole Kaletsky on $50 a barrel representing a new ceiling for oil prices. In the article, he describes the tradeoff between competition and monopoly power as prime drivers of oil prices. Over the past 40 years real (inflation adjusted) oil prices have traded in two regimes: 1) a high price regime associated with monopoly power, and 2) a low price regime associated with competitive market power. The dividing line between the two regimes is an oil price of approximately $50 a barrel. Consider the following chart of real oil prices with 2014 as the base year. Oil priced at $50 a barrel does seem to represent a dividing line between high priced monopoly regimes and low priced competitive regimes.
From 1974 to 1985 the oil market operated in a monopoly pricing regime as OPEC exerted its monopoly power. Between 1986 and 2004 oil prices were determined by competitive pricing. During this time period, new oil from the North Sea and Alaska helped to restore more competition in the world oil market. More recently, from 2005 until the summer of 2014, oil prices were again determined by monopoly pricing power as oil demand increased faster than supply. If $50 is the divideing line between the competitive and monopolistic regimes, it also looks like $20 is the floor for oil prices in the competitive regime. It is thus possible that if oil prices have switched into a competitive regime, then we could see prices bottom out at $20.
In a competitive market, the price of oil is determined by the marginal cost of production. According to Kaletsky, the marginal cost of production for conventional oil is around $20 per barrel, while the marginal cost of production from US fracking is around $50 per barrel. If we have entered a new competitive pricing regime, then US frackers are the new "swing producers".
This led me to think about a way to empirically determine the threshold price for oil. In response, I estimated a self exciting threshold autoregressive (SETAR) model for real oil prices. SETAR models are designed to model data that changes its pattern depending upon what regime it is in. The SETAR approach chose $57.42 as the threshold value. This is slightly higher than $50 but consistent with what the marginal cost of US fracking could be. Here is what the regime switching plot looks like.
According to the plot, oil prices are still in a high price regime. Remember, one sudden drop in prices does not indicate a regime switch. If, however, oil prices do continue to stay below $57 a barrel signifying a switch into a low price regime, then $20 looks like a price floor.
The R code is posted below. The monthly oil price and CPI data comes from FRED. Notice, that the oil price series needs to be constructed by splicing the old FRED oil price series (OILPRICE) with the more recent one (MCOILWTICO). The resulting SETAR model fits well and the residuals show no discernible pattern.
#########################################################
# Economic forecasting and analysis
# Perry Sadorsky
# March 2015
# SETAR model of oil prices
##########################################################
# load libraries
library(fpp)
library(tsDyn)
##########################################################
## read in data and prepare data
##########################################################
# import data on monthly oil prices
cpi_oil <- read.csv("C:/oil prices/cpi_oil.csv")
View(cpi_oil)
# tell R that data set is a time series
cpi_oil = ts(cpi_oil, start=1947, frequency=12)
cpi_oil
oil = cpi_oil[,"OILPRICE"]
cpi = cpi_oil[,"CPIAUCSL"]
oil =window(oil,start=1973)
cpi =window(cpi,start=1973)
# rebase cpi
tail(cpi,14)
cpi2014 = mean( cpi[(816-11):816] )
cpi_2014 = cpi/cpi2014 * 100
## http://www.project-syndicate.org/commentary/oil-prices-ceiling-and-floor-by-anatole-kaletsky-2015-01
rop = oil/cpi_2014 *100
plot(rop,main="Real oil prices ($/bbl)",xlab="",ylab="",xaxt="n",lwd=4)
axis(1,at=c(seq(from=1974,to=2014,by=2)), las=2)
abline(h=50)
abline(h=20)
rop.ret = 100* diff(log(rop))
plot(rop.ret)
tsdisplay(rop.ret)
#### SETAR model
# select model
selectSETAR(rop, m=6, d=2, nthresh=1)
# estimate model
mod.setar <- setar(rop, m=6, thDelay=0, th= 57.42232 , mL=6, mH=3)
mod.setar
summary(mod.setar)
plot(mod.setar)
par(mfrow=c(1,1))
No comments:
Post a Comment