/usr/include/ql/cashflows/cpicoupon.hpp is in libquantlib0-dev 1.12-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 | /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
Copyright (C) 2011 Chris Kenyon
This file is part of QuantLib, a free-software/open-source library
for financial quantitative analysts and developers - http://quantlib.org/
QuantLib is free software: you can redistribute it and/or modify it
under the terms of the QuantLib license. You should have received a
copy of the license along with this program; if not, please email
<quantlib-dev@lists.sf.net>. The license is also available online at
<http://quantlib.org/license.shtml>.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the license for more details.
*/
/*! \file cpicoupon.hpp
\brief Coupon paying a zero-inflation index
*/
#ifndef quantlib_cpicoupon_hpp
#define quantlib_cpicoupon_hpp
#include <ql/cashflows/inflationcoupon.hpp>
#include <ql/cashflows/indexedcashflow.hpp>
#include <ql/indexes/inflationindex.hpp>
#include <ql/time/schedule.hpp>
namespace QuantLib {
struct CPI {
//! when you observe an index, how do you interpolate between fixings?
enum InterpolationType {
AsIndex, //!< same interpolation as index
Flat, //!< flat from previous fixing
Linear //!< linearly between bracketing fixings
};
};
class CPICouponPricer;
//! %Coupon paying the performance of a CPI (zero inflation) index
/*! The performance is relative to the index value on the base date.
The other inflation value is taken from the refPeriodEnd date
with observation lag, so any roll/calendar etc. will be built
in by the caller. By default this is done in the
InflationCoupon which uses ModifiedPreceding with fixing days
assumed positive meaning earlier, i.e. always stay in same
month (relative to referencePeriodEnd).
This is more sophisticated than an %IndexedCashFlow because it
does date calculations itself.
\todo we do not do any convexity adjustment for lags different
to the natural ZCIIS lag that was used to create the
forward inflation curve.
*/
class CPICoupon : public InflationCoupon {
public:
CPICoupon(Real baseCPI, // user provided, could be arbitrary
const Date& paymentDate,
Real nominal,
const Date& startDate,
const Date& endDate,
Natural fixingDays,
const boost::shared_ptr<ZeroInflationIndex>& index,
const Period& observationLag,
CPI::InterpolationType observationInterpolation,
const DayCounter& dayCounter,
Real fixedRate, // aka gearing
Spread spread = 0.0,
const Date& refPeriodStart = Date(),
const Date& refPeriodEnd = Date(),
const Date& exCouponDate = Date());
//! \name Inspectors
//@{
//! fixed rate that will be inflated by the index ratio
Real fixedRate() const;
//! spread paid over the fixing of the underlying index
Spread spread() const;
//! adjusted fixing (already divided by the base fixing)
Rate adjustedFixing() const;
//! allows for a different interpolation from the index
Rate indexFixing() const;
//! base value for the CPI index
/*! \warning make sure that the interpolation used to create
this is what you are using for the fixing,
i.e. the observationInterpolation.
*/
Rate baseCPI() const;
//! how do you observe the index? as-is, flat, linear?
CPI::InterpolationType observationInterpolation() const;
//! utility method, calls indexFixing
Rate indexObservation(const Date& onDate) const;
//! index used
boost::shared_ptr<ZeroInflationIndex> cpiIndex() const;
//@}
//! \name Visitability
//@{
virtual void accept(AcyclicVisitor&);
//@}
protected:
Real baseCPI_;
Real fixedRate_;
Spread spread_;
CPI::InterpolationType observationInterpolation_;
bool checkPricerImpl(
const boost::shared_ptr<InflationCouponPricer>&) const;
// use to calculate for fixing date, allows change of
// interpolation w.r.t. index. Can also be used ahead of time
Rate indexFixing(const Date &) const;
};
//! Cash flow paying the performance of a CPI (zero inflation) index
/*! It is NOT a coupon, i.e. no accruals. */
class CPICashFlow : public IndexedCashFlow {
public:
CPICashFlow(Real notional,
const boost::shared_ptr<ZeroInflationIndex>& index,
const Date& baseDate,
Real baseFixing,
const Date& fixingDate,
const Date& paymentDate,
bool growthOnly = false,
CPI::InterpolationType interpolation = CPI::AsIndex,
const Frequency& frequency = QuantLib::NoFrequency)
: IndexedCashFlow(notional, index, baseDate, fixingDate,
paymentDate, growthOnly),
baseFixing_(baseFixing), interpolation_(interpolation),
frequency_(frequency) {
QL_REQUIRE(std::fabs(baseFixing_)>1e-16,
"|baseFixing|<1e-16, future divide-by-zero error");
if (interpolation_ != CPI::AsIndex) {
QL_REQUIRE(frequency_ != QuantLib::NoFrequency,
"non-index interpolation w/o frequency");
}
}
//! value used on base date
/*! This does not have to agree with index on that date. */
virtual Real baseFixing() const;
//! you may not have a valid date
virtual Date baseDate() const;
//! do you want linear/constant/as-index interpolation of future data?
virtual CPI::InterpolationType interpolation() const {
return interpolation_;
}
virtual Frequency frequency() const { return frequency_; }
//! redefined to use baseFixing() and interpolation
virtual Real amount() const;
protected:
Real baseFixing_;
CPI::InterpolationType interpolation_;
Frequency frequency_;
};
//! Helper class building a sequence of capped/floored CPI coupons.
/*! Also allowing for the inflated notional at the end...
especially if there is only one date in the schedule.
If a fixedRate is zero you get a FixedRateCoupon, otherwise
you get a ZeroInflationCoupon.
payoff is: spread + fixedRate x index
*/
class CPILeg {
public:
CPILeg(const Schedule& schedule,
const boost::shared_ptr<ZeroInflationIndex>& index,
const Real baseCPI,
const Period& observationLag);
CPILeg& withNotionals(Real notional);
CPILeg& withNotionals(const std::vector<Real>& notionals);
CPILeg& withFixedRates(Real fixedRate);
CPILeg& withFixedRates(const std::vector<Real>& fixedRates);
CPILeg& withPaymentDayCounter(const DayCounter&);
CPILeg& withPaymentAdjustment(BusinessDayConvention);
CPILeg& withPaymentCalendar(const Calendar&);
CPILeg& withFixingDays(Natural fixingDays);
CPILeg& withFixingDays(const std::vector<Natural>& fixingDays);
CPILeg& withObservationInterpolation(CPI::InterpolationType);
CPILeg& withSubtractInflationNominal(bool);
CPILeg& withSpreads(Spread spread);
CPILeg& withSpreads(const std::vector<Spread>& spreads);
CPILeg& withCaps(Rate cap);
CPILeg& withCaps(const std::vector<Rate>& caps);
CPILeg& withFloors(Rate floor);
CPILeg& withFloors(const std::vector<Rate>& floors);
CPILeg& withExCouponPeriod(const Period&,
const Calendar&,
BusinessDayConvention,
bool endOfMonth = false);
operator Leg() const;
private:
Schedule schedule_;
boost::shared_ptr<ZeroInflationIndex> index_;
Real baseCPI_;
Period observationLag_;
std::vector<Real> notionals_;
std::vector<Real> fixedRates_; // aka gearing
DayCounter paymentDayCounter_;
BusinessDayConvention paymentAdjustment_;
Calendar paymentCalendar_;
std::vector<Natural> fixingDays_;
CPI::InterpolationType observationInterpolation_;
bool subtractInflationNominal_;
std::vector<Spread> spreads_;
std::vector<Rate> caps_, floors_;
Period exCouponPeriod_;
Calendar exCouponCalendar_;
BusinessDayConvention exCouponAdjustment_;
bool exCouponEndOfMonth_;
};
// inline definitions
inline Real CPICoupon::fixedRate() const {
return fixedRate_;
}
inline Real CPICoupon::spread() const {
return spread_;
}
inline Rate CPICoupon::adjustedFixing() const {
return (rate()-spread())/fixedRate();
}
inline Rate CPICoupon::indexFixing() const {
return indexFixing(fixingDate());
}
inline Rate CPICoupon::baseCPI() const {
return baseCPI_;
}
inline CPI::InterpolationType CPICoupon::observationInterpolation() const {
return observationInterpolation_;
}
inline Rate CPICoupon::indexObservation(const Date& onDate) const {
return indexFixing(onDate);
}
inline boost::shared_ptr<ZeroInflationIndex> CPICoupon::cpiIndex() const {
return boost::dynamic_pointer_cast<ZeroInflationIndex>(index());
}
}
#endif
|