Coverage Report

Created: 2025-08-11 06:28

/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