|
From: Matt F. <mat...@gm...> - 2011-10-03 15:36:59
|
It doesn't look like anyone is addressing this failure in the tests.
The test failure was introduced in revision 18001. It alters the way
the price values are computed and therefore doesn't pass the test that
existed. If the test is wrong, then fix it so the tests pass,
otherwise the asset swap code needs to be fixed.
I don't know too much about this code, so I don't know what is right
or wrong, just know when the test that existed started to fail.
Index: ql/instruments/assetswap.cpp
===================================================================
--- ql/instruments/assetswap.cpp (revision 18000)
+++ ql/instruments/assetswap.cpp (revision 18001)
@@ -243,12 +243,12 @@
// backpayment on the floating leg
// (accounts for non-par redemption, if any)
Real backPayment = notional;
- shared_ptr<CashFlow> backPaymentCashFlow (new
+ shared_ptr<CashFlow> backPaymentCashFlow(new
SimpleCashFlow(backPayment, finalDate));
legs_[1].push_back(backPaymentCashFlow);
} else {
// final notional exchange
- shared_ptr<CashFlow> finalCashFlow (new
+ shared_ptr<CashFlow> finalCashFlow(new
SimpleCashFlow(notional, finalDate));
legs_[1].push_back(finalCashFlow);
}
@@ -349,12 +349,12 @@
"fair clean price not available for seasoned deal");
Real notional = bond_->notional(upfrontDate_);
if (parSwap_) {
- fairCleanPrice_ = bondCleanPrice_ -
+ fairCleanPrice_ = bondCleanPrice_ - payer_[0] *
NPV_*npvDateDiscount_/startDiscounts_[1]/(notional/100.0);
} else {
Real accruedAmount = bond_->accruedAmount(upfrontDate_);
Real dirtyPrice = bondCleanPrice_ + accruedAmount;
- Real fairDirtyPrice = - legNPV_[0]/legNPV_[1] * dirtyPrice;
+ Real fairDirtyPrice = - payer_[0] *
legNPV_[0]/legNPV_[1] * dirtyPrice;
fairCleanPrice_ = fairDirtyPrice - accruedAmount;
}
@@ -370,7 +370,7 @@
QL_REQUIRE(endDiscounts_[1]!=Null<DiscountFactor>(),
"fair non par repayment not available for expired leg");
Real notional = bond_->notional(upfrontDate_);
- fairNonParRepayment_ = nonParRepayment_ -
+ fairNonParRepayment_ = nonParRepayment_ + payer_[0] *
NPV_*npvDateDiscount_/endDiscounts_[1]/(notional/100.0);
return fairNonParRepayment_;
}
On Sat, Sep 17, 2011 at 3:49 PM, Matt Fair <mat...@gm...> wrote:
> I noticed this in the tests:
>
> Testing consistency between fair price and fair spread...
> assetswap.cpp(181): fatal error in
> "QuantLib::detail::quantlib_test_case(&AssetSwapTest::testConsistency)":
> par asset swap fair clean price doesn't zero the NPV:
> clean price: 95.0000
> fair clean price: 107.0805
> NPV: 24.1511
> tolerance: 0.0000
>
> This is the only test that fails.
>
> Matt
|