Logo
Fully annotated reference manual - version 1.8.12
Loading...
Searching...
No Matches
crossassetanalyticsbase.hpp
Go to the documentation of this file.
1/*
2 Copyright (C) 2016 Quaternion Risk Management Ltd
3 All rights reserved.
4
5 This file is part of ORE, a free-software/open-source library
6 for transparent pricing and risk analysis - http://opensourcerisk.org
7
8 ORE is free software: you can redistribute it and/or modify it
9 under the terms of the Modified BSD License. You should have received a
10 copy of the license along with this program.
11 The license is also available online at <http://opensourcerisk.org>
12
13 This program is distributed on the basis that it will form a useful
14 contribution to risk analytics and model standardisation, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the license for more details.
17*/
18
19/*! \file crossassetanalyticsbase.hpp
20 \brief basic functions for analytics in the cross asset model
21 \ingroup crossassetmodel
22*/
23
24#ifndef quantext_crossasset_analytics_base_hpp
25#define quantext_crossasset_analytics_base_hpp
26
27#include <boost/bind/bind.hpp>
28
29#include <ql/types.hpp>
30
32
33namespace QuantExt {
34using namespace QuantLib;
35
36namespace CrossAssetAnalytics {
37
38/*! \addtogroup crossassetmodel
39 @{
40*/
41
42/*! generic integrand */
43template <class E> Real integral_helper(const CrossAssetModel& x, const E& e, const Real t);
44
45/*! generic integral calculation */
46template <typename E>
47Real integral(const CrossAssetModel& model, const E& e, const Real a, const Real b);
48
49/*! product expression, 2 factors */
50template <typename E1, typename E2> struct P2_ {
51 P2_(const E1& e1, const E2& e2) : e1_(e1), e2_(e2) {}
52 Real eval(const CrossAssetModel& x, const Real t) const {
53 return e1_.eval(x, t) * e2_.eval(x, t);
54 }
55 const E1& e1_;
56 const E2& e2_;
57};
58
59/*! product expression, 3 factors */
60template <typename E1, typename E2, typename E3> struct P3_ {
61 P3_(const E1& e1, const E2& e2, const E3& e3) : e1_(e1), e2_(e2), e3_(e3) {}
62 Real eval(const CrossAssetModel& x, const Real t) const {
63 return e1_.eval(x, t) * e2_.eval(x, t) * e3_.eval(x, t);
64 }
65 const E1& e1_;
66 const E2& e2_;
67 const E3& e3_;
68};
69
70/*! product expression, 4 factors */
71template <typename E1, typename E2, typename E3, typename E4> struct P4_ {
72 P4_(const E1& e1, const E2& e2, const E3& e3, const E4& e4) : e1_(e1), e2_(e2), e3_(e3), e4_(e4) {}
73 Real eval(const CrossAssetModel& x, const Real t) const {
74 return e1_.eval(x, t) * e2_.eval(x, t) * e3_.eval(x, t) * e4_.eval(x, t);
75 }
76 const E1& e1_;
77 const E2& e2_;
78 const E3& e3_;
79 const E4& e4_;
80};
81
82/*! product expression, 5 factors */
83template <typename E1, typename E2, typename E3, typename E4, typename E5> struct P5_ {
84 P5_(const E1& e1, const E2& e2, const E3& e3, const E4& e4, const E5& e5)
85 : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5) {}
86 Real eval(const CrossAssetModel& x, const Real t) const {
87 return e1_.eval(x, t) * e2_.eval(x, t) * e3_.eval(x, t) * e4_.eval(x, t) * e5_.eval(x, t);
88 }
89 const E1& e1_;
90 const E2& e2_;
91 const E3& e3_;
92 const E4& e4_;
93 const E5& e5_;
94};
95
96/*! creator function for product expression, 2 factors */
97template <class E1, class E2> const P2_<E1, E2> P(const E1& e1, const E2& e2) { return P2_<E1, E2>(e1, e2); }
98
99/*! creator function for product expression, 3 factors */
100template <class E1, class E2, class E3> const P3_<E1, E2, E3> P(const E1& e1, const E2& e2, const E3& e3) {
101 return P3_<E1, E2, E3>(e1, e2, e3);
102}
103
104/*! creator function for product expression, 4 factors */
105template <class E1, class E2, class E3, class E4>
106const P4_<E1, E2, E3, E4> P(const E1& e1, const E2& e2, const E3& e3, const E4& e4) {
107 return P4_<E1, E2, E3, E4>(e1, e2, e3, e4);
108}
109
110/*! creator function for product expression, 5 factors */
111template <class E1, class E2, class E3, class E4, class E5>
112const P5_<E1, E2, E3, E4, E5> P(const E1& e1, const E2& e2, const E3& e3, const E4& e4, const E5& e5) {
113 return P5_<E1, E2, E3, E4, E5>(e1, e2, e3, e4, e5);
114}
115
116/*! linear combination, 1 factor i.e. c + c1 * factor1. */
117template <typename E1> struct LC1_ {
118
119 LC1_(QuantLib::Real c, QuantLib::Real c1, const E1& e1) : c_(c), c1_(c1), e1_(e1) {}
120
121 Real eval(const CrossAssetModel& x, const Real t) const { return c_ + c1_ * e1_.eval(x, t); }
122
123 QuantLib::Real c_;
124 QuantLib::Real c1_;
125 E1 e1_;
126};
127
128/*! linear combination, 2 factors i.e. c + c1 * factor1 + c2 * factor2. */
129template <typename E1, typename E2> struct LC2_ {
130
131 LC2_(QuantLib::Real c, QuantLib::Real c1, const E1& e1, QuantLib::Real c2, const E2& e2)
132 : c_(c), c1_(c1), e1_(e1), c2_(c2), e2_(e2) {}
133
134 Real eval(const CrossAssetModel& x, const Real t) const {
135 return c_ + c1_ * e1_.eval(x, t) + c2_ * e2_.eval(x, t);
136 }
137
138 QuantLib::Real c_;
139 QuantLib::Real c1_;
140 E1 e1_;
141 QuantLib::Real c2_;
142 E2 e2_;
143};
144
145/*! linear combination, 3 factors. */
146template <typename E1, typename E2, typename E3> struct LC3_ {
147
148 LC3_(QuantLib::Real c, QuantLib::Real c1, const E1& e1, QuantLib::Real c2, const E2& e2, QuantLib::Real c3,
149 const E3& e3)
150 : c_(c), c1_(c1), e1_(e1), c2_(c2), e2_(e2), c3_(c3), e3_(e3) {}
151
152 Real eval(const CrossAssetModel& x, const Real t) const {
153 return c_ + c1_ * e1_.eval(x, t) + c2_ * e2_.eval(x, t) + c3_ * e3_.eval(x, t);
154 }
155
156 QuantLib::Real c_;
157 QuantLib::Real c1_;
158 E1 e1_;
159 QuantLib::Real c2_;
160 E2 e2_;
161 QuantLib::Real c3_;
162 E3 e3_;
163};
164
165/*! linear combination, 4 factors. */
166template <typename E1, typename E2, typename E3, typename E4> struct LC4_ {
167
168 LC4_(QuantLib::Real c, QuantLib::Real c1, const E1& e1, QuantLib::Real c2, const E2& e2, QuantLib::Real c3,
169 const E3& e3, QuantLib::Real c4, const E4& e4)
170 : c_(c), c1_(c1), e1_(e1), c2_(c2), e2_(e2), c3_(c3), e3_(e3), c4_(c4), e4_(e4) {}
171
172 Real eval(const CrossAssetModel& x, const Real t) const {
173 return c_ + c1_ * e1_.eval(x, t) + c2_ * e2_.eval(x, t) + c3_ * e3_.eval(x, t) + c4_ * e4_.eval(x, t);
174 }
175
176 QuantLib::Real c_;
177 QuantLib::Real c1_;
178 E1 e1_;
179 QuantLib::Real c2_;
180 E2 e2_;
181 QuantLib::Real c3_;
182 E3 e3_;
183 QuantLib::Real c4_;
184 E4 e4_;
185};
186
187/*! creator function for linear combination, 1 factor */
188template <class E1> const LC1_<E1> LC(QuantLib::Real c, QuantLib::Real c1, const E1& e1) { return LC1_<E1>(c, c1, e1); }
189
190/*! creator function for linear combination, 2 factors */
191template <class E1, class E2>
192const LC2_<E1, E2> LC(QuantLib::Real c, QuantLib::Real c1, const E1& e1, QuantLib::Real c2, const E2& e2) {
193 return LC2_<E1, E2>(c, c1, e1, c2, e2);
194}
195
196/*! creator function for linear combination, 3 factors */
197template <class E1, class E2, class E3>
198const LC3_<E1, E2, E3> LC(QuantLib::Real c, QuantLib::Real c1, const E1& e1, QuantLib::Real c2, const E2& e2,
199 QuantLib::Real c3, const E3& e3) {
200 return LC3_<E1, E2, E3>(c, c1, e1, c2, e2, c3, e3);
201}
202
203/*! creator function for linear combination, 4 factors */
204template <class E1, class E2, class E3, class E4>
205const LC4_<E1, E2, E3, E4> LC(QuantLib::Real c, QuantLib::Real c1, const E1& e1, QuantLib::Real c2, const E2& e2,
206 QuantLib::Real c3, const E3& e3, QuantLib::Real c4, const E4& e4) {
207 return LC4_<E1, E2, E3, E4>(c, c1, e1, c2, e2, c3, e3, c4, e4);
208}
209
210// inline
211
212template <class E> inline Real integral_helper(const CrossAssetModel& x, const E& e, const Real t) {
213 return e.eval(x, t);
214}
215
216template <class E>
217inline Real integral(const CrossAssetModel& x, const E& e, const Real a, const Real b) {
218 return x.integrator()->operator()(QuantLib::ext::bind(&integral_helper<E>, x, e, QuantLib::ext::placeholders::_1), a, b);
219}
220
221/*! @} */
222
223} // namespace CrossAssetAnalytics
224} // namespace QuantExt
225
226#endif
const QuantLib::ext::shared_ptr< Integrator > integrator() const
cross asset model
Real integral_helper(const CrossAssetModel &x, const E &e, const Real t)
const LC1_< E1 > LC(QuantLib::Real c, QuantLib::Real c1, const E1 &e1)
Real integral(const CrossAssetModel &model, const E &e, const Real a, const Real b)
const P2_< E1, E2 > P(const E1 &e1, const E2 &e2)
Real eval(const CrossAssetModel &x, const Real t) const
LC1_(QuantLib::Real c, QuantLib::Real c1, const E1 &e1)
Real eval(const CrossAssetModel &x, const Real t) const
LC2_(QuantLib::Real c, QuantLib::Real c1, const E1 &e1, QuantLib::Real c2, const E2 &e2)
Real eval(const CrossAssetModel &x, const Real t) const
LC3_(QuantLib::Real c, QuantLib::Real c1, const E1 &e1, QuantLib::Real c2, const E2 &e2, QuantLib::Real c3, const E3 &e3)
Real eval(const CrossAssetModel &x, const Real t) const
LC4_(QuantLib::Real c, QuantLib::Real c1, const E1 &e1, QuantLib::Real c2, const E2 &e2, QuantLib::Real c3, const E3 &e3, QuantLib::Real c4, const E4 &e4)
Real eval(const CrossAssetModel &x, const Real t) const
Real eval(const CrossAssetModel &x, const Real t) const
P3_(const E1 &e1, const E2 &e2, const E3 &e3)
Real eval(const CrossAssetModel &x, const Real t) const
P4_(const E1 &e1, const E2 &e2, const E3 &e3, const E4 &e4)
Real eval(const CrossAssetModel &x, const Real t) const
P5_(const E1 &e1, const E2 &e2, const E3 &e3, const E4 &e4, const E5 &e5)