A Practical Introduction to Options - Part 3

In the third post in this series on volatility and options trading we investigate the effects and trading implications of input behaviours on the option price.

In the first two articles we discussed various aspects of options and options trading, which are necessary background for the more interesting discussions: option behaviour when the inputs change, and the implications of these behaviours in real-world usage.

In this article we start this exploration, but be warned, we only have time to scratch the surface: there is much more content than we have time for in this series so we will look at a few different things, perhaps suggest a few more avenues of investigation, and try to bring it all together in the fourth and final post of this series.

Most of my personal experience with options is for equities and ETFs (exchange-traded funds) which are a financial instrument that closely tracks an underlying index, but behaves in most respects like an equity. Options on other instruments also exist: bonds, futures and currencies for example. Whilst there are subtle differences between these options that are crucial understanding how to use them, for our purposes here they behave in similar ways.

For the first few sections we hold volatility vol constant: a huge and unrealistic simplification. The behaviour of implied vol is a major component of options trading, and we discuss it in the final article. For now, we have enough complexity with vol constant!

Recall that vol is the standard deviation of the lognormal distribution we assume the price returns are drawn from. Higher vol means asset price changes are relatively larger - technology, biotech and internet stocks tend to have a higher vol, whereas utility companies and older, stable companies have a lower vol.

Finally, we focus on options with a shorter expiration - in most cases 40 trading days or less. The majority of trading liquidity in exchange-traded options is short-term, although some have longer expirations out to a few years in some cases.

That said, some behaviours discussed do not hold for all options, especially for options with longer expirations, so beware!

In particular, we investigate the phenomenon of put-call parity, theta-decay, and the non-linear response of options to changes in underlying: three hugely consequential behaviours of options.

Quick Recap on Units of Greeks

Recall that options are traded as contracts for 100 shares, but are quoted in terms of a single share. We quote values for the Greeks consistent with convention, so we quote the deltas and gammas in terms of contracts, multiplying their value by 100 when quoting them.

In contrast, vega and theta are quoted on a per-share basis. This convention is likely due to both vega and theta being quoted in units of currency.

As discussed in the previous article, theta is quoted in terms of change per vol 'click', so from 20% to 21% say. Thus, if an option has a price of 3 USD at vol level 20% and a vega of 0.50, we expect the price at 21% to be about 3.50 USD.1

Similarly, theta is quoted in time units of one day, so if an option with 10 trading days remaining is worth 2 USD and has a theta of -0.20, we expect the price at the same time tomorrow to be about 1.80 USD.

We also largely ignore interest-rate effects on pricing as we focus on more short term maturities of two months or less - 40 trading days.

Revisiting Put-Call Parity

We have discussed a few times in previous posts the close relationship between the price of a call and put option. For future brevity, I will introduce one more piece of terminology in options - the line, a specific combination of expiration and strike price.

Historically, option prices were quoted in expiration and strike order, with the strike prices in a column down the centre, the call prices on the left of this column and the put prices on the right.

Hence a particular combination of strike and expiration was a line in the price column.

The reason for this close relationship between calls and puts on the same line is somewhat counter-intuitive: from an optionality point of view, call and put options are the same - that is, the only difference between between a call and put option is 100 deltas. This is exactly true for European options but still holds approximately for American options.

This seems like quite a bold claim so we should check it. We take a series of values for stock price ($S$), strike price ($K$), time to maturity ($T$), vol etc, calculate the various option prices, and see how they compare.

##         S   K      T vol d_delta    d_gamma       d_vega d_theta
##    1:  25  25 0.0198 0.1 100.056 -0.2304823  5.76078e-06       0
##    2:  25  25 0.0397 0.1 100.093 -0.2730571  1.34209e-05       0
##    3:  25  25 0.0794 0.1 100.161 -0.3296385  3.18621e-05       0
##    4:  25  25 0.2381 0.1 100.364 -0.4431122  1.12114e-04       0
##    5:  25  25 0.4762 0.1 100.613 -0.5409007  2.34390e-04       0
##   ---                                                           
## 1916: 100 100 0.0397 0.5 100.280 -0.0423972  1.12027e-04       0
## 1917: 100 100 0.0794 0.5 100.494 -0.0539391  2.22366e-04       0
## 1918: 100 100 0.2381 0.5 101.166 -0.0783729  2.98899e-04       0
## 1919: 100 100 0.4762 0.5 102.008 -0.1014833 -5.68220e-04       0
## 1920: 100 100 1.0000 0.5 103.585 -0.1361755 -6.01381e-03       0

The statement appears to hold. The theta differences are not surprising as it is the amount of value decay due to time, and it is reasonable for the higher price contract to have a higher theta value: it has more value to decay in the same time period.

We check the data for differences:

compare_dt[abs(d_delta - 100) > 1 | abs(d_gamma) > 1 | abs(d_vega) > 0.01]

##      contract_id price_call price_put   S   K    r         T vol d_delta
##   1:           6   1.121309  0.890916  25  25 0.01 1.0000000 0.1 101.079
##   2:          10   0.548161  0.437205  25  25 0.02 0.2380952 0.1 101.001
##   3:          11   0.808668  0.591177  25  25 0.02 0.4761905 0.1 101.671
##   4:          12   1.254245  0.805035  25  25 0.02 1.0000000 0.1 102.895
##   5:          13   0.151491  0.128593  25  25 0.05 0.0198413 0.1 100.592
##  ---                                                                    
## 266:        1896  20.318469 12.024390 100 100 0.10 1.0000000 0.4 104.585
## 267:        1914  21.792604 17.468477 100 100 0.05 1.0000000 0.5 101.426
## 268:        1918  10.836351  8.679525 100 100 0.10 0.2380952 0.5 101.166
## 269:        1919  15.807519 11.663842 100 100 0.10 0.4761905 0.5 102.008
## 270:        1920  23.926745 15.690441 100 100 0.10 1.0000000 0.5 103.585
##         d_gamma       d_vega d_theta
##   1: -0.6773249  4.68145e-04       0
##   2: -1.2612045  2.68612e-04       0
##   3: -1.5456791  4.97775e-04       0
##   4: -1.9442048  7.56843e-04       0
##   5: -2.5364599  5.64106e-05       0
##  ---                                
## 266: -0.2178702 -5.62447e-03       0
## 267: -0.0510880 -2.16932e-03       0
## 268: -0.0783729  2.98899e-04       0
## 269: -0.1014833 -5.68220e-04       0
## 270: -0.1361755 -6.01381e-03       0

Numerical rounding and precision is an issue in the calculations of the Greeks here, but we can see that there is almost no difference between any of the Greeks along a line.

What is the consequence of this in practical terms?

It means that being long 1 'call' contract (of 100 shares) and short 100 shares gives the same profit and loss (the PnL) as being long 1 'put' contract. Conversely, being long 1 'put' and long 100 shares is the same as being long 1 'call' contract.

PnL Check

To check this, we start with an option with a strike price of 100 with a vol of 20%. Suppose we are 40 days out and the underlying stock is at 95. We buy the 100 call (the call option at the 100 strike), paying the price. Suppose after one day's trading the underlying has moved up to 100. What is the PnL in this case, and how does it compare to being long the 100 put and long the stock instead?

If our previous assertion is correct, they are the same.

I have created a little utility function option_pricer which calculates the call and put price with the above parameters for a given underlying price and time.

op_day1 <- option_pricer(S = 95,  t = 40/252)  
op_day2 <- option_pricer(S = 100, t = 39/252)

pnl_call     <- (op_day2['c'] - op_day1['c'])  
pnl_putstock <- (op_day2['p'] - op_day1['p']) + (100 - 95)

print(op_day1, digits = 5)  
print(op_day2, digits = 5)  
print(c(pnl_call, pnl_putstock), digits = 5)

##      c      p 
## 1.2552 6.1112

##      c      p 
## 3.2220 3.0722

##      c      p 
## 1.9668 1.9610

It is worth spending time unpicking all this as there are a few things to consider. Note the calculations should be exact except for small rounding discrepancies.

We start with the calculation for the call.

On day 1, 40 days to expiration, the call is worth about 1.25 USD and the stock is at 95 USD. We buy the call, so our account has a 100 call and a negative cash balance of -1.25 USD, the price we paid for the call.

After one day, the stock moved up to 100 USD, and we need to recalculate the price of the call for the new stock price and time to maturity. We also need to account for the interest rate charge on the cash balance. It will be small, but is important to remember. For trading operations, interest rate charges and fees are a significant aspect of the business and need attention - it can make or break a trading business.

As a quick exercise, without looking below, will the move in the underlying result in a profit or loss in the call and by how much? The answer may seem obvious, but it is not.

The new value calculates to 3.22 USD, so our profit is

$$ 3.22 - 1.25 = 1.97 $$

Assuming liquid markets, this profit is more than just a paper profit - we could sell the call and take the profit immediately if we wished.

Now we look at the PnL for a put and a share.

On day 1 the put is worth 6.11. Note that we could split this price into 5 USD of intrinsic value - the put is 5 USD in the money - and 1.11 USD of option premium. We pay 6.11 for the put, and we buy a share for 95 USD. Thus, we now have a long 100 put, a share of the stock, and a cash balance of -101.11, the sum of the cost of the put and the share.

After day 2, the stock has moved up to 100, so what is our PnL?

The new value for the put is 3.07, so the profit from that is

$$ 3.07 - 6.11 = -3.04 $$

The put has lost value, but we are also long a share, which has gained in value by 5 USD. Our total profit is

$$ (3.07 - 6.11) + (100 - 95) = 1.9610 $$

Quite a narrow disparity, but we have forgotten to include interest on the cash balances. Does this have much effect?

For the long call we have a negative cash balance of 1.25 USD and so pay interest for one day on this. For the long put and stock, it is negative 101.11, so we check the difference in these charges.

intrate_call     <- (op_day1['c']     ) * (exp(-r * 1/252) - 1)  
intrate_putstock <- (op_day1['p'] + 95) * (exp(-r * 1/252) - 1)

print(c(intrate_call, intrate_putstock), digits = 5)  
print(c(pnl_call + intrate_call, pnl_putstock + intrate_putstock), digits = 5)

##           c           p 
## -4.9808e-05 -4.0123e-03

##      c      p 
## 1.9667 1.9570

Even allowing for interest charges, the discrepancy due to the options being American is narrow enough to be ignored for our purposes.

As one final check, let us see what happens if we used a straddle in the above scenario, and then replace the call with the put and stock. Recall that a straddle spread is a call and a put on the same line. We compare this to a having two puts and being long a share.

### The straddle is the sum of the prices
pnl_straddle <- sum(op_day2) - sum(op_day1)

### Switch the call for a put and a share, so 2 puts 1 share
pnl_2putshare <- 2 * (op_day2['p'] - op_day1['p']) + (100 - 95)

print(c(pnl_straddle, pnl_2putshare))

##                 p 
## -1.07223 -1.07802

We see that the straddle loses about 1.07 in value, roughly the same in the decline in value of the 2 puts and the stock price.

This explains why all the Greeks for a call and put on the same line are the same apart from the delta (which differs by 100). Price parity forces this.2

Option Premium Decay (Theta Decay)

We discovered in the last article that theta for an option is negative: as time passes the value of an option decreases. This makes sense, option premium is an expectation of future possible value and as time passes there is less opportunity for the stock to move and realise that value.

But how does this decay happen? Is it linear, exponential, something else?

Suppose we have a 40-day at-the-money option with 20% vol and both the underlying and strike price are 100. We calculate the value of this option over time, using the unrealistic assumption that nothing else will change.

We know that the value will erode, but how does this erosion depend on the 'moneyness' of the option?3

Time Decay for At-the-Money Options

We start with at-the-money options as they tend to be the most interesting. We plot the price from 40 days out to expiration, and hold all other inputs constant. The intrinsic value of the option is zero throughout, so the price decreases to zero at expiration.


The decay is slow at the beginning, approximating a constant decay, accelerating towards zero in the last 5-10 days of lifetime. The option sustains its value as there is always a large probability of the option expiring in the money right up to expiration. The decay reflects the fact that it takes time for the underlying to move, and so shorter lifetimes reduce the variance of this distribution of prices of the underlying at expiration, in turn reducing the value of the option.

Time Decay for Out-of-the-Money Options

OTM options also have zero intrinsic value throughout the lifetime, and the underlying has a distance to cross before they are in the money. We expect the option prices to be lower than at-the-money options.


Similar to the ATM case, the option value decay approximates a constant rate, but loses almost all value earlier than the ATM option. In terms of distributions of possible outcomes, a positive payoff for the option requires us to go further into the right tail as time passes. This reduction in expectation implies a low price for the option with days left before expiration.

Time Decay for In-the-Money Options

For ITM options, the intrinsic value of the option is positive, so the price decays to this value at expiration, as we see in the plot.


If we remove the intrinsic value and focus solely on the premium in the ITM option, how does this behave? We will draw all three plots together.


This plot was surprising, and confirmed something suggested at by the earlier plots: the premium decay for ITM and OTM options are very similar. Note that the ITM and OTM options are 5 USD from the underlying of 100.

When viewed in terms of put-call parity, it makes sense: the premium in the ITM call is similar to the premium in the put from the same line. The 105 Put will decay in a very similar way to the 95 Call. We can check this:


The slightly larger premium in the call over the put is the positive expected drift in the share price over time due to the risk-free interest rate.

Consequences of Theta Decay

An immediate consequence of the time decay of premium is that owning options is expensive. As each day passes, more and more value in your portfolio erodes away, and this is difficult from a psychological point of view. If you are long options, the stock has to move in your favour at least as much as your decay or you will suffer a loss in the net asset value (NAV) in your account.

This makes trading long option positions complicated: it often requires active trading, the success of which is heavily dependent on making good estimates of the short term direction of the market - a difficult task.

Gamma, Vega and Nonlinear Behaviour

It is becoming apparent how complicated options behaviour can be. Options are non-linear instruments, and this non-linearity results in surprising, non-intuitive behaviour.

The Gamma of an option is the second derivative of the option price with respect to the price of the underlying. It gives us the instantaneous rate of change of delta as the underlying price changes. For example, suppose we are long a 30 delta call. The gamma of the option is 10. This means if the stock price goes up, the delta of the call will be around 40. Long option positions are always long gamma.

The Effect of Gamma on Option Value

To see how this works, we ponder another question. Suppose we have a 100 call and the stock is at 95, we are 20 days from expiration and the vol is 20%. We use European options, because QuantLib gives use the Greeks automatically. The price and Greeks for this option is as follows:

calc_price_greeks <- function(...) {  
    option_price <- EuropeanOption(...)

    option_price$delta <- option_price$delta * 100
    option_price$gamma <- option_price$gamma * 100
    option_price$vega  <- option_price$vega  * 0.01
    option_price$theta <- option_price$theta/252


price_greeks <- calc_price_greeks(type          = 'call'  
                                 ,underlying    = 95
                                 ,strike        = 100
                                 ,riskFreeRate  = 0.01
                                 ,maturity      = 20/252
                                 ,dividendYield = 0
                                 ,volatility    = 0.20)


##     value     delta     gamma      vega     theta 
##  0.566145 19.460792  5.106435  0.074249 -0.037287

We are long a 20 delta call 5 USD from the money, and the gamma is about 5. If the stock price goes up 1 USD in a short period of time (so we do not have to modify the time to maturity), what happens?

We will calculate it and see, but before that, it is worth making some educated guesses. It helps develop our intuition.

The delta of the option is positive, so we are long deltas. This means the option gains value from a rising share price, so we expect the stock price to go up. We are also long gamma though (gamma is positive) so as the stock price goes up, the delta of the option also increases. Thus, the increase in the option price accelerates. Over small increases, we expect the increase in option value to be larger than that suggested by the delta.

For a 19 delta call, a contract for 100 shares behaves like it is 19 shares. In our pricing terms (single shares rather than contracts), we expect the option price to go up at least by 0.19 USD. The current price of the option is 0.57 USD, so we guess the new price is at least $0.57 + 0.19 = 0.76$.

The gamma is 5, so expect the new delta to be about 24, implying a rise of 0.24 USD due to deltas, so another guess for the new price is $0.57 + 0.24 = 0.81$

We are just trying to get a sense for this, so let's split the difference and guess the new value of the option to be worth about 0.79 USD.

Now let's check the real value:

price_greeks_up <- calc_price_greeks(type          = 'call'  
                                    ,underlying    = 96
                                    ,strike        = 100
                                    ,riskFreeRate  = 0.01
                                    ,maturity      = 20/252
                                    ,dividendYield = 0
                                    ,volatility    = 0.20)


##      value      delta      gamma       vega      theta 
##  0.7875205 24.9338917  5.8232058  0.0864630 -0.0435112

Not too bad for a quick calculation! We got the price about right, as we did the delta. Note that the gamma has also increased, so further increases in share price will accelerate the gains in option price further.

What would happen if the price had gone down by 1 USD instead of up?

As we are long deltas, a fall in share price reduces the price of the option, and the positive gamma means that the delta also decreases. In this scenario, this is a good thing - a falling share price means a less positive delta reduces the decrease in value. Our intuition also suggests that the new value for gamma will be lower.

The current value of the option is 0.57 USD, so with a 19 delta we expect the new price to be about $0.57 - 0.19 = 0.38$.

Accounting for the gamma, the new delta is about 14, so that price is $0.57 - 0.14 = 0.43$. Overall, we guess a new price of about 0.40 USD.

price_greeks_dn <- calc_price_greeks(type          = 'call'  
                                    ,underlying    = 94
                                    ,strike        = 100
                                    ,riskFreeRate  = 0.01
                                    ,maturity      = 20/252
                                    ,dividendYield = 0
                                    ,volatility    = 0.20)


##      value      delta      gamma       vega      theta 
##  0.3957759 14.7443464  4.3197236  0.0614946 -0.0308272

Again, our guess is close enough.

Time Effects

What happens if we relax the time assumption of this move happening over a short period of time? What happens if the stock price moved 1 USD over the period of a trading day instead?

Theta decay will be important, and in the first case, we say that the option had a theta value of about -0.037 USD, so we expect the price after 1 trading day to be about $0.787 - 0.037 = 0.75$ USD. It is easy to check (showing the values at the original price level also for ease of reference)

##     value     delta     gamma      vega     theta 
##  0.566145 19.460792  5.106435  0.074249 -0.037287

##      value      delta      gamma       vega      theta 
##  0.7261262 24.0646317  5.9209002  0.0818505 -0.0441951

Now we are out by a few cents, so our quick calculation is not as good. The new delta and gamma differ also, which must be due to the time effect. The delta is lower (24.06 compared to 24.93), and the gamma is higher (5.92 compared to 5.82). Is there an intuitive reason for this?

In the first instance, with no passage of time, we still had 20 days left in the option. In the second, we had 19 days. With less time for the underlying to move around, it makes sense that for a stock price at 96, the 100 call with 20 days left is 'closer' to the money than with 19 days left. The stock has more time to get to 100.

Thus, the delta of the 19-day option is lower as delta is a measure of the 'moneyness' of the option.4

The gamma increase is puzzling. Why does the shortened time horizon lead to an increase in gamma? Furthermore, what does it mean if the gamma is increasing?

We rely on intuition about the outcomes for an explanation. For deep in or out of the money options, the gamma of the option is zero, and the delta of the option is close to either zero or 100. Gamma only moves off zero as the underlying price gets close to the strike. How close is 'close'? It depends on the time remaining in the option, and the vol. Both affect this outcome distribution.

As option expiration approaches, the distribution of outcomes narrows so Gamma will increase if the option is still close to the strike. This effect becomes much more pronounced in the final few days before expiration.

In our example with the 100 call, 96 is still close to the strike at a vol level of 20% and so the gamma increases. We expect this to reverse at some point before expiration, so let us check that:


So, if nothing happens but the passing of time, the Gamma of the option will increase, then rapidly move to zero once 10 days or less are left in the option.

Why is this relevant? Is there a point discussing this beyond curiosity?

It shows that as expiration approaches, deltas change a lot. In a live environment, the stock price is moving around, meaning that when the stock is close to the strike, the change in deltas is large, and hedging deltas to reduce risk will be expensive and counterproductive.

The Leverage Effect of Gamma

Options provide significant leverage, large gammas cause small changes in the underlying to have a huge effect in the option price.

To illustrate, suppose a 20% vol stock is at 97 and there are 2 days left on an option. Suppose we buy the option, and the price opens at 99 on Friday morning (1 day left), then moves up to 100 at lunchtime, a lifetime of 0.5 days. What does the option price do?

leverage_pricer <- create_line_pricer(K = 100, r = 0.01, vol = 0.20)

price1 <- leverage_pricer(S = 97,  t = 2.0 / 252)  
price2 <- leverage_pricer(S = 99,  t = 1.0 / 252)  
price3 <- leverage_pricer(S = 100, t = 0.5 / 252)

print(c(price1['c'], price2['c'], price3['c']), digits = 4)

##       c       c       c 
## 0.03590 0.09587 0.42190

An option that was worth 0.035 USD on Wednesday morning is worth 0.096 USD on Friday morning, and 0.42 USD at lunchtime on Friday. The call value first increases threefold over the course of a single trading day due to a 2% increase in the stock price. It then increases another 450% over the course of half a trading day where the price increased 1%.5

This non-linear response of options to changes in the underlying is why options are so complex. Get it wrong, and you can lose a lot of money very quickly.6

Bear in mind that when trading options, trade sizes are in the hundreds or thousands of contracts. 100 contracts is the equivalent of 10,000 shares, so imagine in the above scenario we bought 1,000 contracts. We paid 3,500 USD (0.035 * 100 share per contract * 1000 contracts) which was worth 9,500 USD on Friday morning, and then just over 42,000 USD at lunchtime.

That is a huge change considering the underlying went from 97 to 100.


My original plan for this series was to have three articles, and this final post would include discussions on the effect of vol and how to view option contracts as insurance, but that was wishful thinking!

I will pause for now and digest all we have discussed. There is a lot going on and requires some thinking about why things behave as they do.

First we looked at how calls and puts are the same from an optionality perspective, then we looked at the effect of time on option premium, in particular how premium erodes as time passes and how the pattern of behaviour in this decay is different depending upon the moneyness of the option. Premium in ATM options is more durable but then decays rapidly as expiration is imminent.

We then discussed non-linear behaviour and Gamma, the second derivative of the option price to changes in the underlying. In particular, we discussed how Gamma functions as an accelerator for the option price, magnifying the profit or loss of the option due to movements in the share price.

The code used to produce all of the above graphs and numbers is available in BitBucket repo if you would like to use it yourself. Please get in touch at info@applied.ai if you would like access.

In the fourth and final article of this series I will discuss vol: its effect on prices, how we think about it, and how it behaves as the underlying moves.

  1. This is approximate as vega will have a second derivative, but for small changes in vol it is close enough.

  2. If the market moves out of line on this, trading arbitrage will force it back. I heard a story (which I believe) that the first person to figure out that puts were the same as calls quietly made a huge fortune on the Chicago option floor with no risk.

  3. To aid memory, moneyness describes the intrinsic value of the option. In-the-money options have positive intrinsic value. Out-of-the-money options have no intrinsic value. At-the-money options have strike prices very close to the current underlying price.

  4. Recall that delta for calls ranges from 0 to 100, and puts from -100 to 0. In terms of approaching the strike, we should technically say approach 50 (or -50) delta.

  5. If the price had gone through the strike and kept going, it would start to lose pace, as the gamma would start to decrease, but the options would also have intrinsic value.

  6. Or make it. One of my favourite trading stories which I have been unable to verify is that one of the larger trading firms today largely owes its existence to Black Monday in 1987. A market-maker in options, through pure chance they owned a huge amount of put options that were way below the market level when the crash happened. Those options, which had cost them pennies, ended up being worth 50 or 60 USD each and made the firm millions. This provided them with the capital base to grow their operations and they admitted themselves it was pure luck.

Cover image of open outcry in the NYSE sourced from Wikimedia Commons

Mick Cooney

Mick is highly experienced in probabilistic programming, high performance computing and financial modelling for derivatives analysis and volatility trading.