Ошибка при попытке оценить инструмент при использовании Quantlib - PullRequest
1 голос
/ 25 октября 2010

Я получаю следующую ошибку, когда пытаюсь оценить своп 20х10 из начальной кривой. Ошибка выдается в последней строке функции ImpliedRate

SwapRatesServiceTests.ImpliedRate_ForTwenty_x_TenYearSwap_ReturnsRate: System.ApplicationException: 2-й этап: пустой дескриптор не может быть разыменован

У меня нет ни малейшего представления, с чего начать отладку этой проблемы. Любая помощь будет высоко оценена.

ВАЖНО: я использую версию Quantlib для C # Swig, поэтому мой действительный код продукта на примере swapvaluation.cpp следующий:

Метод испытания:

    [Test]
    public void ImpliedRate_ForTwenty_x_TenYearSwap_ReturnsRate() 
    {
        //Arrange
        var startingDate = new Date(10,Month.October,2030); // starting date of 20x10yr swap
        var length= 10;
        repo.Setup(r => r.Read(It.IsAny<string>())).Returns(LoadSwapPoints()); // LoadSwapPoints returns IEnumerable<RateHelpers>

        //Act
        service.ConstructSwapPoints(SettlementDate);
        var instrumentRate = service.ImpliedRate(startingDate, length);

        //Assert
        Assert.That(instrumentRate, Is.Not.Null); // this must change to a value test

    }

Это часть более крупного метода ConstructSwapPoints

        var depoFRASwapInstruments = PointVector; // RateHelperVector populated with RateHelpers
        DayCounter termStructureDayCounter = new ActualActual(ActualActual.Convention.Actual365);

        QuoteHandleVector quotes = new QuoteHandleVector();
        DateVector quoteDates = new DateVector();

        py = CreatePiecewiseLinearCurve(settlementDate, depoFRASwapInstruments, termStructureDayCounter, quotes, quoteDates);
        DiscountingTermStructure = new RelinkableYieldTermStructureHandle(py); //RelinkableYieldTermStructureHandle
        //DiscountingTermStructure.linkTo(py); // alternate way

        PricingEngine = new DiscountingSwapEngine(DiscountingTermStructure); // DiscountingSwapEngine           

С помощью метода ImpliedRate, как указано ниже (я выхватил некоторые части из-за ограничений IP);

    public double ImpliedRate(Date startingDate, int length)
    {

        var swapMaturityDate = startingDate.Add(new Period(length, TimeUnit.Years));
        var curveMaturityDate = py.maxDate();

        Schedule fixedSchedule = new Schedule(startingDate, swapMaturityDate, new Period(Frequency.Quarterly), SouthAfricanCalender, Convention, Convention, DateGeneration.Rule.Forward, false);
        Schedule floatSchedule = new Schedule(startingDate, swapMaturityDate, new Period(Frequency.Quarterly), SouthAfricanCalender, Convention, Convention, DateGeneration.Rule.Forward, false);

        VanillaSwap impliedSwap = new VanillaSwap(
            _VanillaSwap.Type.Payer, 
            10000000.0, 
            fixedSchedule, 
            0.1, 
            Actual365FixedDayCounter, 
            floatSchedule, 
            new Jibar(new Period(Frequency.Quarterly)), 
            0, 
            Actual365FixedDayCounter);

        impliedSwap.setPricingEngine(PricingEngine);

        return impliedSwap.fairRate(); // <---exception thrown here
    }

Я надеюсь, что моя терминология верна, так как финансовый жаргон для меня все еще нов.

Редактировать: я добавил тег C ++, так как я полагаю, что он на самом деле связан с некоторым базовым кодом C ++. Надеясь, что это разоблачение может раскрыть некоторые идеи о том, что может происходить здесь.

1 Ответ

0 голосов
/ 01 ноября 2010

На основе отзывов из списка рассылки Quantlib

Индекс Jibar должен иметь ссылку на созданную кривую без риска. Без временной структуры Jibar может возвращать прошлые исправления, но не прогнозировать будущие. Конструктор Jibar необходимо заменить на

new Jibar(new Period(Frequency.Quarterly), DiscountingTermStructure)

с

VanillaSwap impliedSwap = new VanillaSwap(
    _VanillaSwap.Type.Payer, 
    10000000.0, 
    fixedSchedule, 
    0.1, 
    Actual365FixedDayCounter, 
    floatSchedule, 
    new Jibar(new Period(Frequency.Quarterly), DiscountingTermStructure), 
    0, 
    Actual365FixedDayCounter);
...