Hi,
If I build piecewiseFlatForward curve with futures and swaps only,
the function crash.
As far as I understand, This is because in FuturesRateHelper'
discountGuess()
function it calls discountImpl which try to get a value with array
index -1.
As a safety guard, I think in bootstrap() of PiecewiseFlatForward, we
should have
double guess= ( (i==1)? Null< double >() : instrument->discountGuess()
);
instead of
double guess = instrument->discountGuess();
To prevent this from happening.
However, I haven't understood gone through the code in detail yet, please
see whether this revision is appropriate.
Jack
DiscountFactor FuturesRateHelper::discountGuess() const {
QL_REQUIRE(termStructure_ != 0, "term structure not set");
// extrapolation shouldn't be needed if the input makes sense
// but we'll play it safe
return termStructure_->discount(ImmDate_,true) /
(1.0+(100.0-quote_->value())/100.0*yearFraction_);
}
DiscountFactor PiecewiseFlatForward::discountImpl(
Time t, bool extrapolate) const {
if (needsBootstrap_)
bootstrap();
if (t == 0.0) {
return discounts_[0];
} else {
int n = referenceNode(t, extrapolate);
if (t == times_[n]) {
return discounts_[n];
} else {
//n may be zero here!!!!!!!!!!!!!!!
return discounts_[n-1] *
QL_EXP(-forwards_[n] * (t-times_[n-1]));
}
}
QL_DUMMY_RETURN(DiscountFactor());
}