QuantLib: a free/open-source library for quantitative finance
Fully annotated sources - version 1.32
Loading...
Searching...
No Matches
tcopulapolicy.hpp
1/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
3/*
4 Copyright (C) 2014 Jose Aparicio
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#ifndef quantlib_tcopula_policy_hpp
21#define quantlib_tcopula_policy_hpp
22
23#include <ql/errors.hpp>
24#include <ql/experimental/math/convolvedstudentt.hpp>
25#include <ql/functional.hpp>
26#include <boost/math/distributions/students_t.hpp>
27#include <vector>
28
29namespace QuantLib {
30
42 public:
48 typedef
49 struct {
50 std::vector<Integer> tOrders;
51 } initTraits;
52
55 /* \todo
56 Explore other constructors, with different vector dimensions, defining
57 simpler combinations (only one correlation, only one variable) might
58 simplify memory.
59 */
60 explicit TCopulaPolicy(
61 const std::vector<std::vector<Real> >& factorWeights =
62 std::vector<std::vector<Real> >(),
63 const initTraits& vals = initTraits());
64
66 Size numFactors() const {
67 return latentVarsInverters_.size() + varianceFactors_.size() - 1;
68 }
69
71 //... better to have a cache?
73 initTraits data;
74 data.tOrders.resize(distributions_.size());
75 for (Size i=0; i<distributions_.size(); ++i) {
76 data.tOrders[i] = static_cast<Integer>(
77 distributions_[i].degrees_of_freedom());
78 }
79 return data;
80 }
81 const std::vector<Real>& varianceFactors() const {
82 return varianceFactors_;
83 }
87 Probability cumulativeY(Real val, Size iVariable) const {
88 #if defined(QL_EXTRA_SAFETY_CHECKS)
89 QL_REQUIRE(iVariable < latentVarsCumul_.size(),
90 "Latent variable index out of bounds.");
91 #endif
92 return latentVarsCumul_[iVariable](val);
93 }
96 return boost::math::cdf(distributions_.back(), z /
97 varianceFactors_.back());
98 }
104 Probability density(const std::vector<Real>& m) const {
105 #if defined(QL_EXTRA_SAFETY_CHECKS)
106 QL_REQUIRE(m.size() == distributions_.size()-1,
107 "Incompatible sample and latent model sizes");
108 #endif
109 Real prodDensities = 1.;
110 for(Size i=0; i<m.size(); i++)
111 prodDensities *= boost::math::pdf(distributions_[i],
113 // accumulate lambda
114 return prodDensities;
115 }
121 #if defined(QL_EXTRA_SAFETY_CHECKS)
122 QL_REQUIRE(iVariable < latentVarsCumul_.size(),
123 "Latent variable index out of bounds.");
124 #endif
125 return latentVarsInverters_[iVariable](p);
126 }
132 return boost::math::quantile(distributions_.back(), p)
133 * varianceFactors_.back();
134 }
139 #if defined(QL_EXTRA_SAFETY_CHECKS)
140 QL_REQUIRE(iFactor < distributions_.size()-1,
141 "Random factor variable index out of bounds.");
142 #endif
143 return boost::math::quantile(distributions_[iFactor], p)
144 * varianceFactors_[iFactor];
145 }
146 //to use this (by default) version, the generator must be a uniform one.
147 std::vector<Real> allFactorCumulInverter(const std::vector<Real>& probs) const;
148 private:
149 mutable std::vector<boost::math::students_t_distribution<Real> > distributions_;
150 mutable std::vector<Real> varianceFactors_;
151 mutable std::vector<CumulativeBehrensFisher> latentVarsCumul_;
152 mutable std::vector<InverseCumulativeBehrensFisher> latentVarsInverters_;
153 };
154
155}
156
157#endif
Student-T Latent Model's copula policy.
Real inverseCumulativeY(Probability p, Size iVariable) const
Real inverseCumulativeDensity(Probability p, Size iFactor) const
Size numFactors() const
Number of independent random factors.
std::vector< boost::math::students_t_distribution< Real > > distributions_
Probability density(const std::vector< Real > &m) const
initTraits getInitTraits() const
returns a copy of the initialization arguments
Probability cumulativeY(Real val, Size iVariable) const
std::vector< Real > allFactorCumulInverter(const std::vector< Real > &probs) const
std::vector< Real > varianceFactors_
Probability cumulativeZ(Real z) const
Cumulative probability of the idiosyncratic factors (all the same)
Real inverseCumulativeZ(Probability p) const
std::vector< CumulativeBehrensFisher > latentVarsCumul_
const std::vector< Real > & varianceFactors() const
std::vector< InverseCumulativeBehrensFisher > latentVarsInverters_
QL_REAL Real
real number
Definition: types.hpp:50
QL_INTEGER Integer
integer number
Definition: types.hpp:35
Real Probability
probability
Definition: types.hpp:82
std::size_t Size
size of a container
Definition: types.hpp:58
Definition: any.hpp:35