Exotic Option Pricing

In this project we will build code to price some exotic options. The term exotic is used for all options that do not have a contract structure similar to the regular options; European and American options (also called vanilla options). As opposed to vanilla options that are well traded in financial markets, exotic options have features that make them more complex than the vanillas and mostly do not have established markets. An example would be what is called an Asian option that has a payoff equal to the average stock price during a period. For this project, each group will choose one non-dividend paying stock and evaluate one exotic option on this stock. In class, we used historical estimates of stock return volatility to price a simple European option. However, we also saw that the option price we calculated in class was really not that close to the option price from the market. The primary reason for this is that the historical prices are not accurate estimates of what the market believes for the future. So in this project, we will not use historical data. Instead, we will get a call option price from the market and find the volatility that best matches this option price and then use this estimated volatility (also called implied volatility) to estimate the exotic options price.

Specific steps

1.Problem Statement 1

First choose one non-dividend paying stock a stock that did not pay any dividend inthe last calendar year and has no plans for dividends this calendar year. Use financialwebsites such as Yahoo! Finance to help you choose. For non-dividend paying assets the price of American and European Call options are the same. Though the prices that you see in the market are mostly prices for American options, by picking non-dividend paying call options, we can assume that these are the right prices for an European option and hence use the European Call option pricier to estimate the stock parameters.

1.1 Non Dividend Paying Company

With exploration of data in fianacial sites, it’s been identified that the non dividend paying company is that Berkshire Hathaway Inc.

1.2 Current Stok Price

1.3 Calls forJanuary 19, 2018

2.Problem Statement 2

Next use Yahoo! Finance to find the call option closest in strike to the current stockprice and has an expiry closest to 6-months from now. Note down the price, C, ofthis option as the average of the ask and the bid quotes. Also note down the strike Kand calculate T, the time to expiry in number of business days (approx.) from today.Make sure you report all of this clearly in your report. In this step you will have to write a R function that prices a European option for a given stock. The function will be have the following inputs and outputs in this order:

           opionPrice=callPricer(p0,K,T,r,sigma,N)

where p0 is the initial price of the underlying stock K is the strike T is the number of business days to expiry r is the risk free rate per business day sigma is the standard deviation of daily stock return N is the number of simulations to use. This code is nothing more than a modified version of the code from class. You just have to make the code a function.

2.1 Required Information for Option Price Function

Current Price - $148.75
Strike (K) - $150.00
T (Time to exp) - 108 days
Bid price - $05.24
Ask price - $05.40
Average (Bid, Ask) - $05.32

2.2 R - Option Price Function

The below R function will illustrate the code for Option price.

# p0 = Price today
# K = Strike Price
# T = Number of business days 
# r = risk free rate per business day 
# sigma = standard deviation - annual 
# N = number of simulations to use = 10,000

callprice <- function(p0, K, T, r, sigma, N)
{
  
  optionPayOffs=vector();
  
  dt = 1/260              # Number of periods per year
  mu = r                  # risk neutral pricing
  muInt = mu          
  sigmaInt = sigma*sqrt(dt) # Convert to daily
  Periods = T             # Since T is in days
  
  
  for(i in 1:N){
    returns=rnorm(Periods,muInt,sigmaInt)
    prices=p0*cumprod(returns+1)
    optionPayOffs[i]=max(prices[Periods]-K,0)
  }
  
  optPrice=mean(optionPayOffs)/(1+r)^T
}

3.Problem Statement 3

Next use the function above to estimate the volatility of the stock, which is sigma, forthe stock you choose. The way you do this is to come up with a long list of possiblechoices for sigma and for each choice, use the function above and find the one thatgives the price closest to the price you found on Yahoo! Finance. Use a constant r=0since risk free interest rates, especially for short term, are currently very low. Use atleast 12 different annual volatilities from 5% to 60%. Remember that sigma in ourcalculations and code is daily volatilities. Choose an exotic option. Use the Internet, especially websites like Investopedia and Wikipedia to look up descriptions of various exotic options. You can choose any option (other than European and American). Just make sure that it is an option on one stock and not on a set of stocks. I would suggest running your choice by us before working on the next step to price it. This is just to make sure you will not have an unnecessarily complicated next step because you chose something way too complicated.

3.1 Option Price Function Call for Different values of Sigma

underLyingPrice <- 148.75
numberOfDays    <- 108
strikePrice     <- 150

cp1  <- callprice(underLyingPrice, strikePrice, numberOfDays, 0, 0.05, 10000)
cp2  <- callprice(underLyingPrice, strikePrice, numberOfDays, 0, 0.1 , 10000)
cp3  <- callprice(underLyingPrice, strikePrice, numberOfDays, 0, 0.15, 10000)
cp4  <- callprice(underLyingPrice, strikePrice, numberOfDays, 0, 0.2 , 10000)
cp5  <- callprice(underLyingPrice, strikePrice, numberOfDays, 0, 0.25, 10000)
cp6  <- callprice(underLyingPrice, strikePrice, numberOfDays, 0, 0.3 , 10000)
cp7  <- callprice(underLyingPrice, strikePrice, numberOfDays, 0, 0.35, 10000)
cp8  <- callprice(underLyingPrice, strikePrice, numberOfDays, 0, 0.4 , 10000)
cp9  <- callprice(underLyingPrice, strikePrice, numberOfDays, 0, 0.45, 10000)
cp10 <- callprice(underLyingPrice, strikePrice, numberOfDays, 0, 0.5 , 10000)
cp11 <- callprice(underLyingPrice, strikePrice, numberOfDays, 0, 0.55, 10000)
cp12 <- callprice(underLyingPrice, strikePrice, numberOfDays, 0, 0.6 , 10000)

3.2 Output of Option Price Function

cp1
## [1] 1.32848
cp2
## [1] 3.185874
cp3
## [1] 5.159249
cp4
## [1] 7.137524
cp5
## [1] 9.25978
cp6
## [1] 11.08379
cp7
## [1] 12.63656
cp8
## [1] 14.71461
cp9
## [1] 16.91817
cp10
## [1] 18.73938
cp11
## [1] 20.84628
cp12
## [1] 22.04715

3.3 Tabluar format of sigma

3.4 Summary

Call Price Output - $5.1512

Average of bid and ask price - $5.2750

From above we can conclude that the call price output at standard deviation 15% is approximately eaqual to average of bid and ask price.

4.Problem Statement 4

Finally write a R code that prices this option. The code does not have to be afunction and can be a script. Use the estimated volatility from step 3 as yourvolatility estimate of the returns to price this option. Again use r=0.

4.1 Simulating a single stock price

# Input

p0    = 148.75         # Current stock price
T     = 108/260        # no of years to run simulation until 20th Jan
mu    = 0              # expected returns per year and this is equal to mu_f in our case as risk free rate
sigma =  0.15          # volatility per year received from the call price function.
N     = 1000           # 1000 simulations to run
dt    = 1/260          # no of periods per year


Periods=T/dt
SimulatedPrices=matrix(NA,Periods,N)

muInt=mu*dt
sigmaInt=sigma*sqrt(dt)

SimulatedPrices=matrix(NA,Periods,N)

prices = rep(NA,Periods)

for(i in 1:N){
  for (t in 1:Periods){
    r=rnorm(1,muInt,sigmaInt)
    if(t>1){
      prices[t]=prices[t-1]*(1+r)
    }
    else{
      prices[t]=p0*(1+r)
    }
    
  }
  SimulatedPrices[,i]=prices
  
}


#Calc probability of being greater than 120
prob=mean(SimulatedPrices[108,]>148.75)

4.1 Simulated stock price

mean(SimulatedPrices[108,])
## [1] 149.1347

Actual Stock Price : $148.75