Supongamos que la función double bsCall(double S0, const double &K, double T, double r, double sigma)
calcula analíticamente el precio Black-Scholes de una opción de compra y double impVolCall(double S0, const double &K, double T, double r, double C)
calcula la volatilidad implícita. Utilizando la paridad put-call, se puede definir la función que devuelve la volatilidad implícita de la put de esta manera:
double ImpliedVolPut(double S0, const double &K, double T, double r, double C)
{
double x = impVolCall(S0, K, T, r, C + S0 - K*exp(-r*T));
return x;
}
Además, tengo una función que calcula el precio de la opción europea Call/Put para el modelo Heston de forma semi-analítica:
hestonClosedPrice(double lambda, double vbar, double eta, double rho, double v0, double r, double tau, double S0, double K, char optionType)
Mi pregunta es por qué la superficie de volatilidad obtenida para diferentes valores de K
y T
para las opciones de compra y de venta son iguales:
std::vector<double> hestonPrice(std::vector<double> k, std::vector<double> t)
{
if(optionType == 'Call'){
HestonPrice(k[i],t[j]) = hestonClosedPrice(lambda, vbar, eta, rho, v0, r, t[j], S0, k[i], 'Call');
}
else{
HestonPrice(k[i],t[j]) = hestonClosedPrice(lambda, vbar, eta, rho, v0, r, t[j], S0, k[i], 'Put');
}
if (optionType == "Call") {
hestonIVS = impVolCall(S0, k, t, r, HestonPrice(k[i],t[j]));
} else if (optionType == "Put") {
hestonIVS = impVolPut(S0, k, t, r, HestonPrice(k[i],t[j]));
}
...
}
Intuitivamente, se debería tener que cuanto más bajo es el strike, más alto es el vol implícito de la opción de compra y más bajo el vol implícito de la opción de venta.