Hi
I guess there is an error in the class BermudanExercise. In the constructor code, the following line:
type_ = American
should be replaced by the line:
type_ = Bermudan
The above error also implies a mispricing for BermudanSwaptions, because they are actually priced assuming an american-type exercise.
Indeed, the following code implements the exercise conditions for discretized options (and then for discretized swaptions). When the execution reaches the switch statement the flag "exerciseType_" is equal to American also for bermudan swaptions, and the wrong section of code is executed thereafter.
void DiscretizedOption::postAdjustValues() {
method()->rollAlmostBack(underlying_, time());
switch (exerciseType_) {
case Exercise::American:
if (time_ >= exerciseTimes_[0] && time_ <= exerciseTimes_[1])
applyExerciseCondition();
break;
default:
for (Size i=0; i<exerciseTimes_.size(); i++) {
Time t =
exerciseTimes_[i];
if (t >= 0.0 && isOnTime(t))
applyExerciseCondition();
}
}
underlying_->postAdjustValues();
}
}
Nuovo Yahoo! Messenger E' molto più divertente: Audibles, Avatar, Webcam, Giochi, Rubrica
Scaricalo ora!