Con fines de aprendizaje, estoy intentando establecer el precio, con quantlib, de una opción europea utilizando el enfoque del árbol Cox-Ross-Rubinstein.
Algunos ejemplos se proporcionan en el archivo EquityOption.cpp
que forma parte de la biblioteca.
Sin embargo, me gustaría establecer su precio, sin utilizar fechas (es decir, sin ninguna convención de días, calendario, fecha de vencimiento...) pero utilizando solamente una fracción de año como vencimiento (por ejemplo: con T = 0.5
).
Hasta donde he leído, todos los ejemplos consideran únicamente el caso con fechas expresadas como fechas "reales" (por ejemplo: 11/01/2016) y no expresadas como tiempo hasta el vencimiento (por ejemplo: T = 0.1), es decir, el caso estándar de libro de texto.
Dado que la biblioteca depende en gran medida de motores, y que esos motores están diseñados principalmente con fechas, tengo algunas dificultades para eliminar las fechas.
Para la fórmula analítica de BS, es fácil ya que el núcleo del motor se basa en el BlackScholesCalculator que es independiente de las fechas (mira un ejemplo completo aquí).
Sin embargo, para el caso binomial, no existe una rutina independiente de fechas (no hay BinomialCalculator...), y la clase DiscretizedVanillaOption
requiere una variable del motor como entrada para instanciarlo..
Una solución plausible que se me ocurrió es encontrar dos "falsas" fechas, jugando con una función pseudo .yearFraction(FechaInicioFalsa, FechaFinFalsa);
para encontrar dos fechas óptimas que coincidan con la fracción deseada. Luego utilizar esas dos fechas para calcular el precio. Sin embargo, esta estrategia parece ser bastante engorrosa para una solicitud tan simple.
¿Cómo puedo calcular el valor de una opción utilizando el enfoque binomial con un vencimiento expresado como una fracción de año en quantlib?
Por favor, mira a continuación lo que he hecho hasta ahora, estoy atascado en la línea que instancia la DiscretizedVanillaOption
.
Calendar calendar = NullCalendar();
DayCounter dayCounter = SimpleDayCounter();
Date t0(1);
Option::Type type = Option::Put;
Real S0 = spot_;
Real K = strike_;
Spread q = dividendYield_;
Rate r = interestRate_;
Volatility sigma = volatility_;
Settings::instance().evaluationDate() = t0;
Handle underlyingH((boost::static_pointer_cast(boost::make_shared(S0))));
Handle flatDividendTS((boost::static_pointer_cast(boost::make_shared(t0, q, dayCounter))));
Handle flatTermStructure((boost::static_pointer_cast(boost::make_shared(t0, r, dayCounter))));
Handle flatVolTS((boost::static_pointer_cast(boost::make_shared(t0, calendar, sigma, dayCounter))));
boost::shared_ptr bsmProcess(new BlackScholesMertonProcess(underlyingH, flatDividendTS, flatTermStructure, flatVolTS));
boost::shared_ptr payoff(new PlainVanillaPayoff(type, K));
Size timeSteps_ = 200;
Time maturity = 0.2;
TimeGrid grid(maturity, timeSteps_);
boost::shared_ptr tree(new CoxRossRubinstein(bsmProcess, maturity, timeSteps_, payoff->strike()));
boost::shared_ptr > lattice( new BlackScholesLattice(tree, r, maturity, timeSteps_));
DiscretizedVanillaOption option(/* ????*/,bsmProcess, grid);//<--------- Primer argumento Aquí ?
option.initialize(lattice, maturity);
double price = option.presentValue();