/src/quantlib/ql/instruments/fixedvsfloatingswap.hpp
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
2 | | |
3 | | /* |
4 | | Copyright (C) 2000, 2001, 2002, 2003 RiskMap srl |
5 | | Copyright (C) 2003, 2004, 2005, 2006, 2007 StatPro Italia srl |
6 | | Copyright (C) 2006, 2008 Ferdinando Ametrano |
7 | | |
8 | | This file is part of QuantLib, a free-software/open-source library |
9 | | for financial quantitative analysts and developers - http://quantlib.org/ |
10 | | |
11 | | QuantLib is free software: you can redistribute it and/or modify it |
12 | | under the terms of the QuantLib license. You should have received a |
13 | | copy of the license along with this program; if not, please email |
14 | | <quantlib-dev@lists.sf.net>. The license is also available online at |
15 | | <http://quantlib.org/license.shtml>. |
16 | | |
17 | | This program is distributed in the hope that it will be useful, but WITHOUT |
18 | | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
19 | | FOR A PARTICULAR PURPOSE. See the license for more details. |
20 | | */ |
21 | | |
22 | | /*! \file fixedvsfloatingswap.hpp |
23 | | \brief Fixed-rate vs floating-rate swap |
24 | | */ |
25 | | |
26 | | #ifndef quantlib_fixed_vs_floating_swap_hpp |
27 | | #define quantlib_fixed_vs_floating_swap_hpp |
28 | | |
29 | | #include <ql/instruments/swap.hpp> |
30 | | #include <ql/time/daycounter.hpp> |
31 | | #include <ql/time/schedule.hpp> |
32 | | #include <ql/optional.hpp> |
33 | | |
34 | | namespace QuantLib { |
35 | | |
36 | | class IborIndex; |
37 | | |
38 | | //! Fixed vs floating swap |
39 | | /*! \ingroup instruments |
40 | | |
41 | | If no payment convention is passed, the convention of the |
42 | | floating-rate schedule is used. |
43 | | |
44 | | \warning if <tt>Settings::includeReferenceDateCashFlows()</tt> |
45 | | is set to <tt>true</tt>, payments occurring at the |
46 | | settlement date of the swap might be included in the |
47 | | NPV and therefore affect the fair-rate and |
48 | | fair-spread calculation. This might not be what you |
49 | | want. |
50 | | */ |
51 | | class FixedVsFloatingSwap : public Swap { |
52 | | public: |
53 | | class arguments; |
54 | | class results; |
55 | | class engine; |
56 | | FixedVsFloatingSwap(Type type, |
57 | | std::vector<Real> fixedNominals, |
58 | | Schedule fixedSchedule, |
59 | | Rate fixedRate, |
60 | | DayCounter fixedDayCount, |
61 | | std::vector<Real> floatingNominals, |
62 | | Schedule floatingSchedule, |
63 | | ext::shared_ptr<IborIndex> iborIndex, |
64 | | Spread spread, |
65 | | DayCounter floatingDayCount, |
66 | | ext::optional<BusinessDayConvention> paymentConvention = ext::nullopt, |
67 | | Integer paymentLag = 0, |
68 | | const Calendar& paymentCalendar = Calendar()); |
69 | | //! \name Inspectors |
70 | | //@{ |
71 | | Type type() const; |
72 | | |
73 | | /*! This throws if the nominal is not constant across coupons. */ |
74 | | Real nominal() const; |
75 | | /*! This throws if the nominals are not the same for the two legs. */ |
76 | | const std::vector<Real>& nominals() const; |
77 | | |
78 | | const std::vector<Real>& fixedNominals() const; |
79 | | const Schedule& fixedSchedule() const; |
80 | | Rate fixedRate() const; |
81 | | const DayCounter& fixedDayCount() const; |
82 | | |
83 | | const std::vector<Real>& floatingNominals() const; |
84 | | const Schedule& floatingSchedule() const; |
85 | | const ext::shared_ptr<IborIndex>& iborIndex() const; |
86 | | Spread spread() const; |
87 | | const DayCounter& floatingDayCount() const; |
88 | | |
89 | | BusinessDayConvention paymentConvention() const; |
90 | | |
91 | | const Leg& fixedLeg() const; |
92 | | const Leg& floatingLeg() const; |
93 | | //@} |
94 | | |
95 | | //! \name Results |
96 | | //@{ |
97 | | Real fixedLegBPS() const; |
98 | | Real fixedLegNPV() const; |
99 | | Rate fairRate() const; |
100 | | |
101 | | Real floatingLegBPS() const; |
102 | | Real floatingLegNPV() const; |
103 | | Spread fairSpread() const; |
104 | | //@} |
105 | | // other |
106 | | void setupArguments(PricingEngine::arguments* args) const override; |
107 | | void fetchResults(const PricingEngine::results*) const override; |
108 | | |
109 | | private: |
110 | | void setupExpired() const override; |
111 | | virtual void setupFloatingArguments(arguments* args) const = 0; |
112 | | Type type_; |
113 | | std::vector<Real> fixedNominals_; |
114 | | Schedule fixedSchedule_; |
115 | | Rate fixedRate_; |
116 | | DayCounter fixedDayCount_; |
117 | | std::vector<Real> floatingNominals_; |
118 | | Schedule floatingSchedule_; |
119 | | ext::shared_ptr<IborIndex> iborIndex_; |
120 | | Spread spread_; |
121 | | DayCounter floatingDayCount_; |
122 | | BusinessDayConvention paymentConvention_; |
123 | | // results |
124 | | mutable Rate fairRate_; |
125 | | mutable Spread fairSpread_; |
126 | | |
127 | | bool constantNominals_, sameNominals_; |
128 | | }; |
129 | | |
130 | | |
131 | | //! %Arguments for simple swap calculation |
132 | | class FixedVsFloatingSwap::arguments : public Swap::arguments { |
133 | | public: |
134 | 0 | arguments() : nominal(Null<Real>()) {} Unexecuted instantiation: QuantLib::FixedVsFloatingSwap::arguments::arguments() Unexecuted instantiation: QuantLib::FixedVsFloatingSwap::arguments::arguments() |
135 | | Type type = Receiver; |
136 | | Real nominal; |
137 | | |
138 | | std::vector<Real> fixedNominals; |
139 | | std::vector<Date> fixedResetDates; |
140 | | std::vector<Date> fixedPayDates; |
141 | | std::vector<Real> floatingNominals; |
142 | | std::vector<Time> floatingAccrualTimes; |
143 | | std::vector<Date> floatingResetDates; |
144 | | std::vector<Date> floatingFixingDates; |
145 | | std::vector<Date> floatingPayDates; |
146 | | |
147 | | std::vector<Real> fixedCoupons; |
148 | | std::vector<Spread> floatingSpreads; |
149 | | std::vector<Real> floatingCoupons; |
150 | | void validate() const override; |
151 | | }; |
152 | | |
153 | | //! %Results from simple swap calculation |
154 | | class FixedVsFloatingSwap::results : public Swap::results { |
155 | | public: |
156 | | Rate fairRate; |
157 | | Spread fairSpread; |
158 | | void reset() override; |
159 | | }; |
160 | | |
161 | | class FixedVsFloatingSwap::engine : public GenericEngine<FixedVsFloatingSwap::arguments, |
162 | | FixedVsFloatingSwap::results> {}; |
163 | | |
164 | | |
165 | | // inline definitions |
166 | | |
167 | 0 | inline Swap::Type FixedVsFloatingSwap::type() const { |
168 | 0 | return type_; |
169 | 0 | } |
170 | | |
171 | 0 | inline Real FixedVsFloatingSwap::nominal() const { |
172 | 0 | QL_REQUIRE(constantNominals_, "nominal is not constant"); |
173 | 0 | return fixedNominals_[0]; |
174 | 0 | } |
175 | | |
176 | 0 | inline const std::vector<Real>& FixedVsFloatingSwap::nominals() const { |
177 | 0 | QL_REQUIRE(sameNominals_, "different nominals on fixed and floating leg"); |
178 | 0 | return fixedNominals_; |
179 | 0 | } |
180 | | |
181 | 0 | inline const std::vector<Real>& FixedVsFloatingSwap::fixedNominals() const { |
182 | 0 | return fixedNominals_; |
183 | 0 | } |
184 | | |
185 | 0 | inline const Schedule& FixedVsFloatingSwap::fixedSchedule() const { |
186 | 0 | return fixedSchedule_; |
187 | 0 | } |
188 | | |
189 | 0 | inline Rate FixedVsFloatingSwap::fixedRate() const { |
190 | 0 | return fixedRate_; |
191 | 0 | } |
192 | | |
193 | 0 | inline const DayCounter& FixedVsFloatingSwap::fixedDayCount() const { |
194 | 0 | return fixedDayCount_; |
195 | 0 | } |
196 | | |
197 | 0 | inline const std::vector<Real>& FixedVsFloatingSwap::floatingNominals() const { |
198 | 0 | return floatingNominals_; |
199 | 0 | } |
200 | | |
201 | 0 | inline const Schedule& FixedVsFloatingSwap::floatingSchedule() const { |
202 | 0 | return floatingSchedule_; |
203 | 0 | } |
204 | | |
205 | 0 | inline const ext::shared_ptr<IborIndex>& FixedVsFloatingSwap::iborIndex() const { |
206 | 0 | return iborIndex_; |
207 | 0 | } |
208 | | |
209 | 0 | inline Spread FixedVsFloatingSwap::spread() const { |
210 | 0 | return spread_; |
211 | 0 | } |
212 | | |
213 | 0 | inline const DayCounter& FixedVsFloatingSwap::floatingDayCount() const { |
214 | 0 | return floatingDayCount_; |
215 | 0 | } |
216 | | |
217 | 0 | inline BusinessDayConvention FixedVsFloatingSwap::paymentConvention() const { |
218 | 0 | return paymentConvention_; |
219 | 0 | } |
220 | | |
221 | 0 | inline const Leg& FixedVsFloatingSwap::fixedLeg() const { |
222 | 0 | return legs_[0]; |
223 | 0 | } |
224 | | |
225 | 0 | inline const Leg& FixedVsFloatingSwap::floatingLeg() const { |
226 | 0 | return legs_[1]; |
227 | 0 | } |
228 | | |
229 | | } |
230 | | |
231 | | #endif |