Skip to content
Prev 9498 / 15274 Next

American option sensitivities

Hi all,

(comments below)

Am 10.02.2012 01:02, schrieb J Toll:
A simple forward difference is

[f(x + h) - f(x)] / h

'f' is the option pricing formula; 'x' are the arguments to the formula, 
and 'h' is a small offset.

Numerically, 'h' should not be made too small:

(1) Even for smooth functions, we trade off truncation error (which is 
large when 'h' is large) against roundoff-error (in the extreme, 'x + h' 
may still be 'x' for a very small 'h').

(2) American options are typically valued via finite-difference or tree 
methods, and hence 'f' is not smooth and any 'bumps' in the function 
will be magnified by dividing by a very small 'h'. So when 'h' is too 
small, the results will become nonsensical.

Here is an example. As a first test, I use a European option.

require("RQuantLib")
h <- 1e-4
S <- 100
K <- 100
tau <- 0.5
vol <- 0.3
C0 <- EuropeanOption(type = "call",
                      underlying = S, strike = K,
                      dividendYield = 0.0,
                      riskFreeRate = 0.03, maturity = tau,
                      volatility = 0.3)
Cplus <- EuropeanOption(type="call",
                         underlying = S + h, strike = K,
                         dividendYield = 0.0,
                         riskFreeRate=0.03, maturity=tau,
                         volatility=0.3)
Cminus <- EuropeanOption(type="call",
                          underlying = S - h, strike=K,
                          dividendYield=0.0,
                          riskFreeRate=0.03, maturity=tau,
                          volatility=0.3)

## a first-order difference: delta
(Cplus$value-C0$value)/h
## [1] 0.570159
C0$delta
## [1] 0.5701581


## a second-order difference
(Cplus$delta-C0$delta)/h
## [1] 0.01851474
C0$gamma
## [1] 0.01851475




Now for an American option. Here we don't have the delta, so we first 
need to compute it as well.

C0 <- AmericanOption(type="put",
                      underlying = S, strike=K,
                      dividendYield=0.0,
                      riskFreeRate=0.03, maturity=tau,
                      volatility=vol)
Cplus <- AmericanOption(type="put",
                         underlying = S + h, strike=K,
                         dividendYield=0.0,
                         riskFreeRate=0.03, maturity=tau,
                         volatility=vol)
Cminus <- AmericanOption(type="put",
                          underlying = S - h, strike=K,
                          dividendYield=0.0,
                          riskFreeRate=0.03, maturity=tau,
                          volatility=vol)

## a first-order difference: delta
(dplus <- (Cplus$value - C0$value)/h)
(dminus <-(C0$value - Cminus$value)/h)

## a second-order difference
(dplus - dminus)/h
## [1] 0.01905605

I ran a little a experiment with different levels of 'h', where you can 
clearly see when the gamma diverges.

|    h |      gamma |
|    1 | 0.01905385 |
| 0.01 | 0.01905612 |
| 1e-4 | 0.01905605 |
| 1e-5 | 0.01915801 |
| 1e-6 | 0.03463896 |
| 1e-8 |   8.881784 |


In the literatur, you find a number of tricks to smooth the function, 
but in my experience, you are fine if you make 'h' small with respect to 
'x' -- small, not tiny. So if the stock price is 100, a change of 1 or 
0.1 is small. (And think of it: even if we found that a change of 
one-thousandth of a cent led to a meaningful numerical difference; if 
the stock price never moves by such an amount, such a computation would 
not be empirically meaningful.)


Regards,
Enrico