test_that("implied volatility is correct", {
# The implied volatility is computed with different parameters, one of them
# being `option_price`. The resulting `implied_volatility` is the used to
# compute the `option_price_test`. Both values should be very close.
number_of_runs <- 4
# the parameters are chosen at random
set.seed(42)
initial_price <- runif(number_of_runs, 90, 110)
exercise_price <- runif(number_of_runs, 90, 110)
r <- runif(number_of_runs, -0.01, 0.1)
time_to_maturity <- runif(number_of_runs, 0.2, 6)
dividend_yield <- runif(number_of_runs, 0, 0.1)
model <- "Black_Scholes"
option_type <- c("European", "European", "Geometric Asian", "Geometric Asian")
payoff <- rep(c("call", "put"), 2)
volatility_to_compute_initial_price <- runif(number_of_runs, 0.01, 1)
option_price <- numeric(number_of_runs)
option_price_zero_vol <- numeric(number_of_runs)
option_price_test <- numeric(number_of_runs)
implied_volatility <- numeric(number_of_runs)
for(i in 1:number_of_runs) {
option_price[i] <-
Greeks(
initial_price = initial_price[i],
exercise_price = exercise_price[i],
r = r[i],
time_to_maturity = time_to_maturity[i],
volatility = volatility_to_compute_initial_price[i],
dividend_yield = dividend_yield[i],
option_type = option_type[i],
payoff = payoff[i],
greek = "fair_value"
)
option_price_zero_vol[i] <-
Greeks(
initial_price = initial_price[i],
exercise_price = exercise_price[i],
r = r[i],
time_to_maturity = time_to_maturity[i],
volatility = 0,
dividend_yield = dividend_yield[i],
option_type = option_type[i],
payoff = payoff[i],
greek = "fair_value"
)
# We check if the implied volatility for the chosen parameters is
# well-defined
if (option_price[i] <= option_price_zero_vol[i] + 1e-12) {
option_price[i] <- 0
next
}
implied_volatility[i] <-
Implied_Volatility(
option_price = option_price[i],
initial_price = initial_price[i],
exercise_price = exercise_price[i],
r = r[i],
time_to_maturity = time_to_maturity[i],
dividend_yield = dividend_yield[i],
model = model,
option_type = option_type[i],
payoff = payoff[i]
)
option_price_test[i] <-
Greeks(
initial_price = initial_price[i],
exercise_price = exercise_price[i],
r = r[i],
time_to_maturity = time_to_maturity[i],
volatility = implied_volatility[i],
dividend_yield = dividend_yield[i],
model = model,
option_type = option_type[i],
payoff = payoff[i],
greek = "fair_value"
)
}
expect(max(abs(option_price_test - option_price)) < 1e-06)
# Checks if error is caught when the option price is infeasible low
expect_error(Implied_Volatility(option_price = 10, exercise_price = 90))
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.