Single-Period Binomial Option Pricing
Table of Contents
1. Overview
The theory and mechanics of option valuation in complete markets can be understood through the simple one period binomial option pricing model. Extending the valuation to more real-world settings is then just and exercise in mathematics, but the idea doesn't change. Additionally, if you understand valuation in this simple setting, you will understand how options interact with other financial markets—why we trade a VIX index for example.
2. Complete Markets
The idea of a complete market is that we can replicate any security in the market through trading in other securities.
- For example, a market with a risk-free bond, a stock, and an option on that stock is complete if we can create an option through trading in the bond and the stock.
- The actual option is a 'redundant' security.
- Moreover, if the market is complete, then the value of the option is simply the cost of recreating it with the bond and the stock. So we don't value the option per se, we create something that is exactly the same as the option and note its cost to create.
3. Arbitrage
Could the option price be any different than the value of recreating it? No. If it were this would afford an arbitrage. If the option cost more than the cost to create it, we could sell the option, create it, and net the difference. A similar arbitrage obtains if the replication cost is above the option price.
4. Binomial Option Valuation
We start option valuation with the one-period binomial method. If you understand this, you will understand everything of importance with respect to option valuation. Beyond this, is simply applying mathematics to make the argument work in more realistic settings. The underlying economic argument is the same.
Say we have the following securities:
One-year zero-coupon risk-free bond with 5% yield. |
Stock priced at $100 today. The stock will either be $110 or $90 in one year. |
Call option on the stock struck at $105 with a 1 year tenor. The option will either be worth $5 or $0 in 1 year. |
Put option on the stock struck at $105 with a 1 year tenor. The option will either be worth $0 or $15 in 1 year. |
5. Bond and Stock Replicating an Option
First, we will use the bond and the stock to create a portfolio which pays the same as the option in both states of the world—that is we will replicate the option.
5.1. Call Option
Replicating portfolio:
Security | Cash Flow Today |
---|---|
Sell $90 Face Value Zero-Coupon Bond (5% coupon) | $90/(1 + 0.05) = $85.71 |
Buy one share of stock | -$100 |
Total | -$100 + $85.71 = -$14.29 |
This portfolio costs us $100 - $85.71 = $14.29 to create. In one year the portfolio will pay $20 in the up-state (the stock is $110), and $0 in the down state (the stock is $90). The option pays $5 in the up-state and $0 in the down-state.
Thus, the replicating portfolio we created is exactly 4 options, and therefore the cost to create the portfolio must be 4 times the cost of a single option. This gives us the option's value:
\[\frac{14.29}{4} = $3.57\]
If the market price is not $3.57, can you create an arbitrage?
5.2. Put Option
Replicating portfolio:
Security | Cash Flow Today |
---|---|
Buy $110 Face Value Zero-Coupon Bond (5% coupon) | -$110/(1 + 0.05) = $104.762 |
Sell short one share of stock | +$100 |
Total | +$100 - $104.762 = -$4.762 |
This portfolio costs us $4.762 to create. In one year the portfolio will pay $0 in the up-state (the stock is $110), and $20 in the down state (the stock is $90). The option pays $0 in the up-state and $15 in the down-state.
Thus, the replicating portfolio we created is exactly \(\frac{20}{15} = 1.3333\) options, and therefore the cost to create the portfolio must be 1.3333 times the cost of a single option. This gives us the option's value:
\[\frac{4.762}{1.3333} = $3.5716\]
Note the value of the call and put will not always be the same!!
If the market price is not $3.57, can you create an arbitrage?
6. Option and Stock Replicating a Bond
Now, we will create a portfolio of the option and stock which pays the same as the bond in both states of the world.
6.1. Call Option
First calculate the call option's \(\Delta\). \(\Delta\) is defined as the amount that the option will change if the stock increases by $1. In this case we have:
\[\Delta = \frac{C_{up} - C_{down}}{S_{up} - S_{down}} = \frac{5 - 0}{110 - 90} = \frac{5}{20} = \frac{1}{4}\]
Replicating portfolio:
Security | Cash Flow |
---|---|
Sell 1 call option with $105 strike (exp. in 1 year) | +\(C_0\) |
Buy \(\Delta\) (which is 1/4 here) shares of stock | -$25 |
Total | \(C_0 - 25\) |
So, at time 0 we have a cash flow of \(C_0 - 25\), where \(C_0\) is the price of the call option. At time 1, the replicating portfolio will pay:
- up-state: \(\frac{110}{4} - 5 = 22.50\)
- down-state: \(\frac{90}{4} - 0 = 22.50\)
So no matter what happens, the replicating portfolio will pay $22.50 in one year. This is a risk-free zero-coupon bond, and therefore the price today is \(\frac{22.50}{(1+0.05)} = 21.43\). So we have:
\[C_0 - 25 = -21.43 \Rightarrow C_0 = 3.57\]
This is exactly the same call option value we got using the first method.
Again, if the market price is not $3.57, can you create an arbitrage?
6.2. Put Option
\[\Delta = \frac{P_{up} - P_{down}}{S_{up} - S_{down}} = \frac{0 - 15}{110 - 90} = \frac{-15}{20} = -\frac{3}{4}\]
Security | Cash Flow |
---|---|
Buy 1 put option with $105 strike (exp. in 1 year) | -\(P_0\) |
Sell \(\Delta\) (here 3/4) shares of stock | +75 |
Total | \(-P_0 + 75\) |
So, at time 0 we have a cash flow of \(75 - P_0\), where \(P_0\) is the price of the put option. At time 1, the replicating portfolio will pay:
- up-state: -\(110(\frac{3}{4}) + 0 = -82.50\)
- down-state: -\(90(\frac{3}{4}) + 15 = -82.50\)
So no matter what happens, the replicating portfolio will pay $82.50 in one year. This is a risk-free zero-coupon bond, and therefore the price today is \(\frac{82.50}{(1+0.05)} = 78.5714\). So we have:
\[75 - P_0 = 78.5714 \Rightarrow P_0 = 3.57\]
Which is the same put value as we calculated above. Again, if the put traded for a different value you could create an arbitrage with the portfolios we used in this section.
7. We Didn't Need Probabilities!!
Notice we didn't need the probabilities of an increase or decrease in the stock price. If we had these we could calculate the expected return in the stock, and option pricing would be much easier.
8. Interactive App (in R)
Need to push to s server or translate this into javascript.
```{r message=FALSE, echo=FALSE, warning=FALSE, eval = FALSE} # library(fOptions) sidebarLayout( sidebarPanel( sliderInput(inputId = "stockToday", label = "Stock Price Today", min = 91, max = 109, step = 1, value = 100), sliderInput(inputId = "strike", label = "Strike Price", min = 91, max = 109, step = 1, value = 105), sliderInput(inputId = "stockUp", label = "Stock Price in Up-State", min = 110, max = 120, step = 1, value = 110), sliderInput(inputId = "stockDn", label = "Stock Price in Down-State", min = 80, max = 90, step = 1, value = 90), sliderInput(inputId = "rf", label = "Risk-Free Rate", min = .01, max = .05, step = .01, value = .01) ), mainPanel( renderVisNetwork({ ## calculate value of option using first approach ---- ## we'll first try using the fOptions package ## scratch that -- use the fOptions for the binomial tree -- calculate by hand below ---- if((input$rf + 1) * input$stockToday > input$stockUp) { visNetwork(nodes = data.frame(id = 1, label = "Why bother with the option when you can have free money!", shape = "diamond", color = "darkred")) } else { ### calculating by replicating a bond optionUp <- input$stockUp - input$strike optionDn <- max(input$stockDn - input$strike, 0) delta <- (optionUp - optionDn) / (input$stockUp - input$stockDn) ## replicating port: sell call and buy delta shares of stock. At time 1 it is worth: portVal1 <- input$stockUp * delta - optionUp portVal0 <- portVal1 / (1 + input$rf) callValue <- input$stockToday * delta - portVal0 nodes <- data.frame(id = 1:3, label = c(paste0("Call Today = $", round(callValue, 2)), paste0("Call Up State = $", round(optionUp, 2)), paste0("Call Down State = $", round(optionDn, 2))), shape = c("circle", "diamond", "diamond"), group = c("C", "D", "D"), color = c("orange", "grey", "grey") ) edges <- data.frame(from = c(1,1), to = c(2,3), arrows = c("to", "to")) visNetwork(nodes, edges, height = "1000px", width = "100%") } }) ) # } ) ```
9. The Importance of Zeros
Note above we used zero-coupon bonds. Zeros are important for derivative valuation because we know exactly what our return will be when we hold them (unlike with coupon bonds).