这可能是一个非常愚蠢的问题,但不知道该怎么办。我有一个函数可以返回所有 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));
但是,如果evalDate
和expiration
之间只有一个红利,因此ddy.exDivDates
,ddy.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;?
答案 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
向量中的第一个日期,而不是评估日期。如果那不是您想要的,那么您必须在日期向量前添加评估日期,并在费率向量前添加另一个被除数(可能是第一个的副本)。