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
|
/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
Copyright (C) 2000, 2001, 2002, 2003 RiskMap srl
Copyright (C) 2018 Alexey Indiryakov
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
<https://www.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 thirty360.hpp
\brief 30/360 day counters
*/
#ifndef quantlib_thirty360_day_counter_h
#define quantlib_thirty360_day_counter_h
#include <ql/time/daycounter.hpp>
namespace QuantLib {
//! 30/360 day count convention
/*! The 30/360 day count can be calculated according to a
number of conventions.
US convention: if the starting date is the 31st of a month or
the last day of February, it becomes equal to the 30th of the
same month. If the ending date is the 31st of a month and the
starting date is the 30th or 31th of a month, the ending date
becomes equal to the 30th. If the ending date is the last of
February and the starting date is also the last of February,
the ending date becomes equal to the 30th.
Also known as "30/360" or "360/360".
Bond Basis convention: if the starting date is the 31st of a
month, it becomes equal to the 30th of the same month.
If the ending date is the 31st of a month and the starting
date is the 30th or 31th of a month, the ending date
also becomes equal to the 30th of the month.
Also known as "US (ISMA)".
European convention: starting dates or ending dates that
occur on the 31st of a month become equal to the 30th of the
same month.
Also known as "30E/360", or "Eurobond Basis".
Italian convention: starting dates or ending dates that
occur on February and are greater than 27 become equal to 30
for computational sake.
ISDA convention: starting or ending dates on the 31st of the
month become equal to 30; starting dates or ending dates that
occur on the last day of February also become equal to 30,
except for the termination date. Also known as "30E/360
ISDA", "30/360 ISDA", or "30/360 German".
NASD convention: if the starting date is the 31st of a
month, it becomes equal to the 30th of the same month.
If the ending date is the 31st of a month and the starting
date is earlier than the 30th of a month, the ending date
becomes equal to the 1st of the next month, otherwise the
ending date becomes equal to the 30th of the same month.
\ingroup daycounters
*/
class Thirty360 : public DayCounter {
public:
enum Convention {
USA,
BondBasis,
European,
EurobondBasis,
Italian,
German,
ISMA,
ISDA,
NASD
};
private:
class Thirty360_Impl : public DayCounter::Impl {
public:
Time yearFraction(const Date& d1, const Date& d2,
const Date&, const Date&) const override {
return dayCount(d1,d2)/360.0;
}
};
class US_Impl final : public Thirty360_Impl {
public:
std::string name() const override { return std::string("30/360 (US)"); }
Date::serial_type dayCount(const Date& d1, const Date& d2) const override;
};
class ISMA_Impl final : public Thirty360_Impl {
public:
std::string name() const override { return std::string("30/360 (Bond Basis)"); }
Date::serial_type dayCount(const Date& d1, const Date& d2) const override;
};
class EU_Impl final : public Thirty360_Impl {
public:
std::string name() const override { return std::string("30E/360 (Eurobond Basis)"); }
Date::serial_type dayCount(const Date& d1, const Date& d2) const override;
};
class IT_Impl final : public Thirty360_Impl {
public:
std::string name() const override { return std::string("30/360 (Italian)"); }
Date::serial_type dayCount(const Date& d1, const Date& d2) const override;
};
class ISDA_Impl final : public Thirty360_Impl {
public:
explicit ISDA_Impl(const Date& terminationDate)
: terminationDate_(terminationDate) {}
std::string name() const override { return std::string("30E/360 (ISDA)"); }
Date::serial_type dayCount(const Date& d1, const Date& d2) const override;
private:
Date terminationDate_;
};
class NASD_Impl final : public Thirty360_Impl {
public:
std::string name() const override { return std::string("30/360 (NASD)"); }
Date::serial_type dayCount(const Date& d1, const Date& d2) const override;
};
static ext::shared_ptr<DayCounter::Impl>
implementation(Convention c, const Date& terminationDate);
public:
explicit Thirty360(Convention c, const Date& terminationDate = Date())
: DayCounter(implementation(c, terminationDate)) {}
};
}
#endif
|