Should an uncertain volatility model option be priced higher or lower than a constant volatility model option?
Should an uncertain volatility model option be priced higher or lower than a constant volatility model option?
Loading saved threads...
jahrongi · External communityPost link
External question — Quantitative Finance Stack Exchange
Author: jahrongi
Original post: https://quant.stackexchange.com/questions/85669
License: CC BY-SA 4.0 — https://creativecommons.org/licenses/by-sa/4.0/
Adaptation: HTML converted to plain text; contact email addresses removed.
These are quite simple models, so forgive me If my question is basic.
I am implementing Monte Carlo simulation for European call option pricing under two setups:
Constant volatility (GBM with σ = 0.2)
Uncertain volatility where σ is sampled from a lognormal distribution per path. The mean is 0.2 and standard deviation 0.05.
In theory, I expected the uncertain volatility case to produce a higher option price due to increased dispersion and convexity of the payoff.
However, my results show:
Constant volatility price: ~10.43
Uncertain volatility price: ~10.40
A marginal difference but still prompts me to inquire. I even tried later using the Heston model and got a price of 8.89.
If someone could please explain theoretically what it should be and why I am getting these numbers I would appreciate it. Here is my code:
import numpy as np
import matplotlib.pyplot as plt
# -----------------------------
# PARAMETERS
# -----------------------------
S0 = 100
K = 100
r = 0.05
T = 1.0
N = 100000
steps = 252
dt = T / steps
sigma = 0.2
np.random.seed(42)
# -----------------------------
# CONSTANT VOLATILITY MODEL
# -----------------------------
def monte_carlo_constant_vol():
S = np.full(N, S0)
for _ in range(steps):
Z = np.random.normal(0, 1, N)
S = S * np.exp((r - 0.5 * sigma**2) * dt + sigma * np.sqrt(dt) * Z)
payoff = np.maximum(S - K, 0)
price = np.exp(-r * T) * np.mean(payoff)
return price, payoff
# -----------------------------
# UNCERTAIN VOLATILITY MODEL
# -----------------------------
def monte_carlo_uncertain_vol():
S = np.full(N, S0)
sigma_mean = 0.2
sigma_std = 0.05
sigma_paths = np.random.lognormal(
mean=np.log(sigma_mean**2 / np.sqrt(sigma_std**2 + sigma_mean**2)),
sigma=np.sqrt(np.log(1 + (sigma_std**2 / sigma_mean**2))),
size=N
)
for _ in range(steps):
Z = np.random.normal(0, 1, N)
S = S * np.exp((r - 0.5 * sigma_paths**2) * dt +
sigma_paths * np.sqrt(dt) * Z)
payoff = np.maximum(S - K, 0)
price = np.exp(-r * T) * np.mean(payoff)
return price, payoff, sigma_paths
# -----------------------------
# RUN SIMULATIONS
# -----------------------------
const_price, const_payoffs = monte_carlo_constant_vol()
uncertain_price, uncertain_payoffs, sigma_paths = monte_carlo_uncertain_vol()
print("Constant Volatility Price:", const_price)
print("Uncertain Volatility Price:", uncertain_price)
# -----------------------------
Quote
Report
Rylan · External communityPost link
External answer — Quantitative Finance Stack Exchange
Author: Rylan
Original post: https://quant.stackexchange.com/a/85670
License: CC BY-SA 4.0 — https://creativecommons.org/licenses/by-sa/4.0/
Adaptation: HTML converted to plain text; contact email addresses removed.
I've only skimmed this but it seems related:
Option Price vs. Implied Volatility
Option prices being a concave function of IV for ATM/ITM (yours is arguably ITM as the forward price is above the strike price) would imply that variance in IV decreases price (by a Jensen's inequality type argument.)
Quote
Report
Max Michlits · External communityPost link
External answer — Quantitative Finance Stack Exchange
Author: Max Michlits
Original post: https://quant.stackexchange.com/a/85717
License: CC BY-SA 4.0 — https://creativecommons.org/licenses/by-sa/4.0/
Adaptation: HTML converted to plain text; contact email addresses removed.
Look at this plot. As you can see, the price function is convex. Your log odds distribution has a fat tail (which "penalized" linearly) while closer to 0 the curve flattens. While the historgram fails to show this perfectly, the smallest sigma in sigma_paths I got wass 0.677 which is already borderline in the less penalized zone. After that its all linear, so the only time where you favour one over the other is when sigma is super low which you get in the uncertain model.
A Monte Carlo Simulation of a price is not a model capable of learning anything uncertainty related, its simply an average of price paths.
I'm sure if you dig through the math Jensen's inequality will show up and give you the inequality.
Quote
Report
Post Reply
Quoted from Forex.com.bd-Editorial External question — Quantitative Finance Stack Exchange Author: jahrongi Source score (net votes, not local likes): 1 Original post: https://quant.stackexchange.com/questions/85669 License: CC BY-SA 4.0 — https://creativecommons.org/licenses/by-sa/4.0/ Adaptation: HTML converted to plain text; contact email addresses removed. These are quite simple models, so forgive me If my question is basic. I am implementing Monte Carlo simulation for European call option pricing under two setups: Constant volatility (GBM with σ = 0.2) Uncertain volatility where σ is sampled from a lognormal distribution per path. The mean is 0.2 and standard deviation 0.05. In theory, I expected the uncertain volatility case to produce a higher option price due to increased dispersion and convexity of the payoff. However, my results show: Constant volatility price: ~10.43 Uncertain volatility price: ~10.40 A marginal difference but still prompts me to inquire. I even tried later using the Heston model and got a price of 8.89. If someone could please explain theoretically what it should be and why I am getting these numbers I would appreciate it. Here is my code: import numpy as np import matplotlib.pyplot as plt # ----------------------------- # PARAMETERS # ----------------------------- S0 = 100 K = 100 r = 0.05 T = 1.0 N = 100000 steps = 252 dt = T / steps sigma = 0.2 np.random.seed(42) # ----------------------------- # CONSTANT VOLATILITY MODEL # ----------------------------- def monte_carlo_constant_vol(): S = np.full(N, S0) for _ in range(steps): Z = np.random.normal(0, 1, N) S = S * np.exp((r - 0.5 * sigma**2) * dt + sigma * np.sqrt(dt) * Z) payoff = np.maximum(S - K, 0) price = np.exp(-r * T) * np.mean(payoff) return price, payoff # ----------------------------- # UNCERTAIN VOLATILITY MODEL # ----------------------------- def monte_carlo_uncertain_vol(): S = np.full(N, S0) sigma_mean = 0.2 sigma_std = 0.05 sigma_paths = np.random.lognormal( mean=np.log(sigma_mean**2 / np.sqrt(sigma_std**2 + sigma_mean**2)), sigma=np.sqrt(np.log(1 + (sigma_std**2 / sigma_mean**2))), size=N ) for _ in range(steps): Z = np.random.normal(0, 1, N) S = S * np.exp((r - 0.5 * sigma_paths**2) * dt + sigma_paths * np.sqrt(dt) * Z) payoff = np.maximum(S - K, 0) price = np.exp(-r * T) * np.mean(payoff) return price, payoff, sigma_paths # ----------------------------- # RUN SIMULATIONS # ----------------------------- const_price, const_payoffs = monte_carlo_constant_vol() uncertain_price, uncertain_payoffs, sigma_paths = monte_carlo_uncertain_vol() print("Constant Volatility Price:", const_price) print("Uncertain Volatility Price:", uncertain_price) # -----------------------------
Checking account access…