Bootstrap ZeroCurve只有一个ex-div日期和一个div值

时间:2017-02-02 23:30:14

标签: c++ quantlib

这可能是一个非常愚蠢的问题,但不知道该怎么办。我有一个函数可以返回所有 ex div日期以及与该选项的evalDate 对应 expiration日期对应的divYield。

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));

但是,如果evalDateexpiration之间只有一个红利,因此ddy.exDivDatesddy.dividendYields每个只包含一个条目,我会收到错误:< / p>

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

这似乎不正确。在这种情况下如何处理短期期权,在到期期间可能只有一个股息,而且#34;今天&#34;?

1 个答案:

答案 0 :(得分: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));
}

注意:如果您按上述方式构建,ZeroCurve的参考日期将是exDivDate向量中的第一个日期,而不是评估日期。如果那不是您想要的,那么您必须在日期向量前添加评估日期,并在费率向量前添加另一个被除数(可能是第一个的副本)。