1 /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 3 /* 4 Copyright (C) 2008, 2009 Roland Lichters 5 6 This file is part of QuantLib, a free-software/open-source library 7 for financial quantitative analysts and developers - http://quantlib.org/ 8 9 QuantLib is free software: you can redistribute it and/or modify it 10 under the terms of the QuantLib license. You should have received a 11 copy of the license along with this program; if not, please email 12 <quantlib-dev@lists.sf.net>. The license is also available online at 13 <http://quantlib.org/license.shtml>. 14 15 This program is distributed in the hope that it will be useful, but WITHOUT 16 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 17 FOR A PARTICULAR PURPOSE. See the license for more details. 18 */ 19 20 /*! \file riskyassetswap.hpp 21 \brief Risky asset-swap instrument 22 */ 23 24 #ifndef quantlib_risky_asset_swap_hpp 25 #define quantlib_risky_asset_swap_hpp 26 27 #include <ql/instrument.hpp> 28 #include <ql/termstructures/defaulttermstructure.hpp> 29 #include <ql/termstructures/yieldtermstructure.hpp> 30 #include <ql/termstructures/credit/defaultprobabilityhelpers.hpp> 31 #include <ql/time/schedule.hpp> 32 33 namespace QuantLib { 34 35 //! Risky asset-swap instrument 36 class RiskyAssetSwap : public Instrument { 37 public: 38 RiskyAssetSwap(bool fixedPayer, 39 Real nominal, 40 const Schedule& fixedSchedule, 41 const Schedule& floatSchedule, 42 const DayCounter& fixedDayCounter, 43 const DayCounter& floatDayCounter, 44 Rate spread, 45 Rate recoveryRate_, 46 const Handle<YieldTermStructure>& yieldTS, 47 const Handle<DefaultProbabilityTermStructure>& defaultTS, 48 Rate coupon = Null<Rate>()); 49 50 Real fairSpread (); 51 52 Real floatAnnuity() const; 53 nominal() const54 Real nominal() const { return nominal_; } spread() const55 Rate spread() const { return spread_; } fixedPayer() const56 bool fixedPayer() const { return fixedPayer_; } 57 58 private: 59 void setupExpired() const; 60 bool isExpired() const; 61 void performCalculations() const; 62 63 Real fixedAnnuity() const; 64 Real parCoupon() const; 65 Real recoveryValue() const; 66 Real riskyBondPrice() const; 67 68 // calculated values 69 mutable Real fixedAnnuity_; 70 mutable Real floatAnnuity_; 71 mutable Real parCoupon_; 72 mutable Real recoveryValue_; 73 mutable Real riskyBondPrice_; 74 75 // input 76 bool fixedPayer_; 77 Real nominal_; 78 Schedule fixedSchedule_, floatSchedule_; 79 DayCounter fixedDayCounter_, floatDayCounter_; 80 Rate spread_; 81 Rate recoveryRate_; 82 Handle<YieldTermStructure> yieldTS_; 83 Handle<DefaultProbabilityTermStructure> defaultTS_; 84 mutable Real coupon_; 85 }; 86 87 88 // risky-asset-swap helper for probability-curve bootstrap 89 class AssetSwapHelper : public DefaultProbabilityHelper { 90 public: 91 AssetSwapHelper(const Handle<Quote>& spread, 92 const Period& tenor, 93 Natural settlementDays, 94 const Calendar& calendar, 95 const Period& fixedPeriod, 96 BusinessDayConvention fixedConvention, 97 const DayCounter& fixedDayCount, 98 const Period& floatPeriod, 99 BusinessDayConvention floatConvention, 100 const DayCounter& floatDayCount, 101 Real recoveryRate, 102 const RelinkableHandle<YieldTermStructure>& yieldTS, 103 const Period& integrationStepSize = Period()); 104 Real impliedQuote() const; 105 void setTermStructure(DefaultProbabilityTermStructure*); 106 107 private: 108 void update(); 109 void initializeDates(); 110 111 Period tenor_; 112 Natural settlementDays_; 113 Calendar calendar_; 114 BusinessDayConvention fixedConvention_; 115 Period fixedPeriod_; 116 DayCounter fixedDayCount_; 117 BusinessDayConvention floatConvention_; 118 Period floatPeriod_; 119 DayCounter floatDayCount_; 120 Real recoveryRate_; 121 RelinkableHandle<YieldTermStructure> yieldTS_; 122 Period integrationStepSize_; 123 124 Date evaluationDate_; 125 ext::shared_ptr<RiskyAssetSwap> asw_; 126 RelinkableHandle<DefaultProbabilityTermStructure> probability_; 127 }; 128 129 } 130 131 #endif 132 133