2017-02-02 15 views
0

Это, наверное, очень глупый вопрос, но не уверен, что делать. У меня есть функция, которая возвращает все даты ex div и divyield, соответствующие этому evalDateдоexpiration дата варианта.Bootstrap ZeroCurve только с одной датой выхода и одной суммой

Handle<YieldTermStructure> dividendTermStructure(bootstrapDividendCurveDB("INTC", today, expiration, underlyingPrice)); 

boost::shared_ptr<ZeroCurve> 
bootstrapDividendCurveDB() 
{ 
.... 
    return boost::shared_ptr<ZeroCurve>(new ZeroCurve(ddy.exDivDates, ddy.dividendYields, ActualActual(), calendar)); 
} 

Это затем переходит в руки

//instantiate BSM process 
    Handle<Quote> underlyingH(boost::shared_ptr<Quote>(new SimpleQuote(underlyingPrice))); 
    boost::shared_ptr<BlackScholesMertonProcess> bsmProcess(new BlackScholesMertonProcess(underlyingH, 
     dividendTermStructure, yieldTermStructure, volatilityTermStructure)); 

Однако, если есть только один дивиденд между evalDate и expiration, и, следовательно, ddy.exDivDates, ddy.dividendYields каждый содержит только одну запись, я получаю сообщение об ошибке:

unknown location(0): fatal error: in "testAmericanOptionPricingWithDividends": QuantLib::Error: not enough input dates given 
FD_Div_IRAmerican.cpp(524): last checkpoint: "testAmericanOptionPricingWithDividends" entry. 

Способ, которым я получил этот раздел кода, решает это, принимая предыдущий разрыв й доход, даже несмотря на то, что evalDate (сегодня) прошёл эту дату ex-div. Таким образом, существует как минимум два значения, из которых достаточно точек для построения ZeroCurve.

Это не кажется правильным. Что делать в этом случае для коротких опционов, которые могут иметь только один дивиденд между истечением срока действия и «сегодня»?

ответ

1

В этом случае имеет смысл использовать плоскую кривую на основе единственного значения, которое у вас есть. Ваша функция завод будет что-то вроде:

boost::shared_ptr<YieldTermStructure> 
bootstrapDividendCurveDB() 
{ 
... 
if (just one dividend) 
    return boost::make_shared<FlatForward>(evalDate, single_dividend, 
              ActualActual()); 
else 
    return boost::make_shared<ZeroCurve>(ddy.exDivDates, ddy.dividendYields, 
             ActualActual(), calendar)); 
} 

A Примечание: если вы строите его, как указано выше, ссылка дата ZeroCurve будет первая дата в exDivDate вектора, а не дата оценки. Если это не то, что вы хотели, вам нужно добавить дату оценки перед вектором даты и другим дивидендом (возможно, копией первого) перед вектором скорости.

+0

Спасибо. Это работает. Я немного смущен вашей «запиской». Вы говорите, что то, что я возвращаю, не должно быть датой ex-div, но датой оценки (сегодня)? Наверное, я не уверен, почему предостережение оправданно? – Ivan

+0

Я имею в виду, что кривая начинается с первой даты в векторе 'ddy.exDivDates' и будет вызывать исключение, если его спросят о ставке до этой даты. –

+0

Gotcha. Благодарю. – Ivan