2 votos

Depuración de Quantlib

Estoy tratando de entender el pricer de diferencia finita de Quantlib usando Eclipse con el depurador GDB.

El código que se muestra a continuación cotiza una opción de venta americana utilizando el esquema de diferencias finitas de Crank-Nicholson.

  1. He insertado un breakpoint en la línea americanOption.NPV(); y intenté entrar en la llamada a la función asociada, pero encontré que el depurador simplemente pasa a la siguiente línea. ¿A qué se debe esto?

  2. Al final pude coger un punto de ruptura en void TridiagonalOperator::solveFor(const Array& rhs, Array& result) const situado en tridiagonaloperator.cpp . Sin embargo, cuando investigo la pila de llamadas, sin embargo, obtengo una lista incomprensible de llamadas a funciones llamadas a funciones (captura de pantalla: https://www.dropbox.com/s/bid7gae87zzx7tv/Screenshot%202015-12-05%2017.33.48.png?dl=0 ). ¿Cómo puedo interpretar esto?

¿Puede alguien sugerir alguna estrategia para depurar Quantlib de forma más eficiente?

#include <ql/quantlib.hpp>
using namespace QuantLib;

int main()
{
    Calendar calendar = UnitedStates();
    DayCounter dayCounter = Business252();
    Date t(1, Jan, 2014);
    Settings::instance().evaluationDate() = t;
    Date T(31, Dec, 2016);
    Option::Type type(Option::Put);
    Real S0 = 100;
    Real K = 100;
    Real delta = 0.00;
    Real r = 0.01;
    Real sigma = 0.2;

    Handle<Quote> underlying(
            boost::shared_ptr<Quote>(boost::make_shared<SimpleQuote>(S0)));
    Handle<YieldTermStructure> TS(
            boost::shared_ptr<YieldTermStructure>(boost::make_shared<FlatForward>(t, r, dayCounter)));
    Handle<YieldTermStructure> dividendTS(
            boost::shared_ptr<YieldTermStructure>(boost::make_shared<FlatForward>(t, delta, dayCounter)));
    Handle<BlackVolTermStructure> volTS(
            boost::shared_ptr<BlackVolTermStructure>(boost::make_shared<BlackConstantVol>(t, calendar, sigma, dayCounter)));
    boost::shared_ptr<BlackScholesMertonProcess> bsmProcess(
            boost::make_shared<BlackScholesMertonProcess>(underlying, dividendTS,TS, volTS));
    boost::shared_ptr<Exercise> americanExercise(
            boost::make_shared<AmericanExercise>(T));
    boost::shared_ptr<StrikedTypePayoff> payoff(
            boost::make_shared<PlainVanillaPayoff>(type, K));
    VanillaOption americanOption(payoff, americanExercise);
    int timeSteps = 100;
    int gridPoints = 100;
    boost::shared_ptr<PricingEngine> engineFD(
            boost::make_shared<FDAmericanEngine<CrankNicolson>>(bsmProcess, timeSteps,gridPoints));
    americanOption.setPricingEngine(engineFD);
    americanOption.NPV();
    std::cout << "PV = " << americanOption.NPV() << std::endl;    
}

1voto

Michoel Puntos 141

Sin mucha más información, es difícil decirlo. Algunas explicaciones incluyen (pero no se limitan a):

  • los símbolos de depuración no están presentes; es posible que a su sistema le falte el libquant-dbg (o similar). Si compila su propia libquant, habilite los símbolos de depuración añadiendo -g a su CFLAGS .

  • Eclipse no está configurado correctamente; esta es una madriguera bastante grande, pero si está absolutamente seguro de que los símbolos de depuración están presentes, entonces podría verse obligado a solucionar los problemas del IDE. A veces un IDE necesitará que se le diga explícitamente dónde encontrar cabeceras y bibliotecas.

Pruebe a compilar quantlib de la fuente con CFLAGS=-g e invocar directamente gdb en uno de los ejemplos de ejecutables .

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X