Quantlib: Функция перехода по дате для TimeUnit "дней" - ошибка или особенность? - PullRequest
0 голосов
/ 18 июня 2020

У меня крошечный вопрос относительно функции упреждения даты в C ++ Quantlib. Я хотел использовать смещение платежа (в днях) для продукта с условным обозначением рабочего дня «предшествующий», но дата платежа всегда была установлена ​​на первый день после выходных, когда дата платежа приходилась на выходные. Это связано с тем, что функция «продвижение» игнорирует условные обозначения рабочих дней, когда «дни» передаются функции «заранее», см. Здесь:

 Date Calendar::advance(const Date& d,
                       Integer n, TimeUnit unit,
                       BusinessDayConvention c,
                       bool endOfMonth) const {
    QL_REQUIRE(d!=Date(), "null date");
    if (n == 0) {
        return adjust(d,c);
    } else if (unit == Days) {
        Date d1 = d;
        if (n > 0) {
            while (n > 0) {
                d1++;
                while (isHoliday(d1))
                    d1++;
                n--;
            }
        } else {
            while (n < 0) {
                d1--;
                while(isHoliday(d1))
                    d1--;
                n++;
            }
        }
        return d1;
    } else if (unit == Weeks) {
        Date d1 = d + n*unit;
        return adjust(d1,c);
    } else {
        Date d1 = d + n*unit;

        // we are sure the unit is Months or Years
        if (endOfMonth && isEndOfMonth(d))
            return Calendar::endOfMonth(d1);

        return adjust(d1, c);
    }
}

Это сделано специально? Ps "Adjust" -функция правильно использует условные обозначения рабочего дня!

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Да, выплаты всегда производятся в рабочие дни. Таким образом, вызов OISRateHelper немного вводил в заблуждение, потому что вы можете передать условное обозначение рабочего дня для компенсации платежа.

ql.OISRateHelper(0,
                     ql.Period(swapMaturity),
                     ql.QuoteHandle(rate),
                     eoniaIndex,
                     termStructureHandle,
                     False,
                     paymentOffset,
                     ql.Preceding
                     )
0 голосов
/ 18 июня 2020

Да, это одна из вещей, которую я бы исправил, если бы она не нарушала клиентский код. В случае дней Calendar::advance означает «аванс на количество рабочих дней»; соглашение не применяется, потому что, продвигаясь таким образом, вы никогда не попадете в отпуск.

Если вы имеете в виду «продвиньте число календарных дней (например, 2), а затем Adjust "можно написать именно так:

Date paymentDate = calendar.adjust(date + 2, convention);
...