Apama Capital Markets Foundation 10.15.0.0
QuantlibPlugin.hpp
1/*
2 * \file QuantlibPlugin.hpp
3 * \brief Interface functions for the QuantlibPlugin
4 *
5 * \copyright
6 * Copyright (c) 2016-2017 Software AG, Darmstadt, Germany and/or Software AG USA Inc., Reston, VA, USA, and/or its subsidiaries and/or its affiliates and/or their licensors.
7 * Use, reproduction, transfer, publication or disclosure is prohibited except as specifically provided for in your License Agreement with Software AG
8 */
9
10#ifndef _QUANTLIBPLUGIN_H_
11#define _QUANTLIBPLUGIN_H_
12
13// the only header you need to use QuantLib
14#include <ql/quantlib.hpp>
15#include <ql/math/statistics/generalstatistics.hpp>
16
17#ifdef BOOST_MSVC
18/* Uncomment the following lines to unmask floating-point
19 exceptions. Warning: unpredictable results can arise...
20
21 See http://www.wilmott.com/messageview.cfm?catid=10&threadid=9481
22 Is there anyone with a definitive word about this?
23 */
24// #include <float.h>
25// namespace { unsigned int u = _controlfp(_EM_INEXACT, _MCW_EM); }
26#endif
27
28#include <epl_plugin.hpp>
29#include <boost/timer/timer.hpp>
30#include <boost/unordered_map.hpp>
31#include <iostream>
32#include <string>
33using namespace com::apama::epl;
34using namespace QuantLib;
35
36#if defined(QL_ENABLE_SESSIONS)
37namespace QuantLib {
38
39 Integer sessionId() { return 0; }
40
41}
42#endif
43
44
45#define BOND_COMPARE_EQUAL 0
46#define BOND_MATURITYDATE_ERROR 1
47#define BOND_ISSUEDATE_ERROR 2
48#define BOND_SETTLEMENTDATE_ERROR 4
49#define BOND_RATE_ERROR 8
50#define BOND_FREQUENCY_ERROR 16
51#define BOND_CREATED_NEW 255
52
53#define NO_UPDATE_BOND false
54#define UPDATE_BOND true
55
56// local typedefs
57typedef boost::shared_ptr<FixedRateBond> bond_ptr;
58
66class BondKey {
67public:
72 const char* issueDate, const char* maturityDate, const char* settlementDate,
73 const Rate rate, const Frequency frequency, bool takeCopies = true);
77 BondKey(const BondKey& that);
81 BondKey& operator=(const BondKey& that);
82 ~BondKey();
86 const char *toString();
90 const char *getIssueDate() { return issueDate; }
94 const char *getMaturityDate() { return maturityDate; }
98 const char *getSettlementDate() { return settlementDate; }
102 Rate getRate() { return rate; }
106 Frequency getFrequency() { return frequency; }
107
108private:
109
110 void cleanup();
111
112 char* issueDate;
113 char* maturityDate;
114 char* settlementDate;
115 Rate rate;
116 Frequency frequency;
117 std::size_t hash;
118 bool ownStrings;
119
120 friend bool operator<(const BondKey& lhs, const BondKey& rhs);
121 friend bool operator==(const BondKey& lhs, const BondKey& rhs);
122 friend int compare(BondKey& lhs, BondKey& rhs);
123 friend std::size_t hash_value(const BondKey& x) {
124 return x.hash;
125 }
126};
127
131class YieldKey {
132public:
136 YieldKey(bond_ptr& bond, Real price, const char* settlementDate, bool takeCopies = true);
140 YieldKey(const YieldKey& that);
145 ~YieldKey();
146
147private:
148 void cleanup();
149
150 bond_ptr bond;
151 Real price;
152 char* settlementDate;
153 std::size_t hash;
154 bool ownStrings;
155
156 friend bool operator<(const YieldKey& lhs, const YieldKey& rhs);
157 friend bool operator==(const YieldKey& lhs, const YieldKey& rhs);
158 friend std::size_t hash_value(const YieldKey& x) {
159 return x.hash;
160 }
161};
162
163bool operator<(const BondKey& lhs, const BondKey& rhs);
164bool operator==(const BondKey& lhs, const BondKey& rhs);
165
166// more local typedefs
167typedef std::map< std::string, bond_ptr> stringbond_map;
168//typedef boost::unordered_map< BondKey, bond_ptr > bond_map;
169typedef boost::unordered_map< const char *, bond_ptr > bond_map;
170typedef boost::unordered_map< const char *, BondKey > bondspec_map;
171typedef boost::unordered_map< YieldKey, Real > yield_map;
172
177{
178public:
182 OptionResultsChunk(int32_t errorNum, double npv, double implVol, double delta, double gamma, double theta, double vega, double rho, char* error);
190 void print() const;
194 int32_t errNum;
198 double npv;
202 double implVol;
206 double delta;
210 double gamma;
214 double theta;
218 double vega;
222 double rho;
226 char* error;
227};
228
231class myIncrementalStatistics : public QuantLib::IncrementalStatistics
232{
233public:
235 void remove(Real value, Real weight);
236};
237
239class QuantlibPlugin : public EPLPlugin<QuantlibPlugin>
240{
241public:
245 QuantlibPlugin() :base_plugin_t("QuantlibPlugin"){}
250 static void initialize(base_plugin_t::method_data_t &md);
265 custom_t<OptionResultsChunk>
266 modelPrice(double _underlying, double _strike, const char* _currentBussinessDate,
267 const char* _maturity, double _riskFreeRate, double _volatility,
268 double _dividendYield, const char* _t, const char* _modelName);
283 custom_t<OptionResultsChunk>
284 modelImplVol(double _price, double _underlying, double _strike,
285 const char* _currentBussinessDate, const char* _maturityDate,
286 double _riskFreeRate, double _dividendYield, const char* _t,
287 const char* _modelName);
302 custom_t<OptionResultsChunk>
303 modelGreeks(double _underlying, double _strike, const char* _currentBussinessDate,
304 const char* _maturity, double _riskFreeRate, double _volatility,
305 double _dividendYield, const char* _t, const char* _modelName);
321 custom_t<OptionResultsChunk>
322 btcoxrossrubinsteinGreeks(double _underlying, double _strike, const char* _currentBussinessDate,
323 const char* _maturity, double _riskFreeRate, double _volatility,
324 double _dividendYield, int64_t _timeSteps, const char* _t);
339 custom_t<OptionResultsChunk>
340 btcoxrossrubinsteinPrice(double _underlying, double _strike, const char* _currentBussinessDate,
341 const char* _maturity, double _riskFreeRate, double _volatility,
342 double _dividendYield, int64_t _timeSteps, const char* _t);
357 custom_t<OptionResultsChunk>
358 btcoxrossrubinsteinImplVol(double _price, double _underlying, double _strike,
359 const char* _currentBussinessDate, const char* _maturity,
360 double _riskFreeRate, double _dividendYield, int64_t _timeSteps,
361 const char* _t);
368 const char* error(const custom_t<OptionResultsChunk> &results);
375 double npv(const custom_t<OptionResultsChunk> &results);
382 double delta(const custom_t<OptionResultsChunk> &results);
389 double gamma(const custom_t<OptionResultsChunk> &results);
396 double theta(const custom_t<OptionResultsChunk> &results);
403 double vega(const custom_t<OptionResultsChunk> &results);
410 double rho(const custom_t<OptionResultsChunk> &results);
417 double implVol(const custom_t<OptionResultsChunk> &results);
430 double yield(const char* _symbol, double _price, const char* _issueDate,
431 const char* _maturityDate, const char* _settlementDate, double _rate,
432 int64_t _freq);
446 double dv01(const char* _symbol, double _yield, const char* _issueDate,
447 const char* _maturityDate, const char* _settlementDate, double _rate,
448 int64_t _freq);
461 double price(const char* _symbol, double _yield, const char* _issueDate,
462 const char* _maturityDate, const char* _settlementDate, double _rate,
463 int64_t _freq);
477 int64_t createBond(const char* _symbol, const char* _issueDate,
478 const char* _maturityDate, const char* _settlementDate,
479 double _rate, int64_t _frequency, bool _updateFlag);
486 void addToDataset(double _value, double _weight);
493 void removeFromDataset(double _value, double _weight);
501 double mean();
505 double stddev();
509 double weightSum();
513 double variance();
517 double kurtosis();
521 double skew();
525 double min();
529 double max();
533 int64_t numSamples();
534
535 static Logger* _logger;
543 static bond_ptr _getBond(
544 const char* symbol, const char* issueDate,
545 const char* maturityDate, const char* settlementDate,
546 Rate rate, Frequency frequency, bool updateFlag, int &ouputValue, std::string &discrepancyMessage);
550 static Rate _yield(
551 bond_ptr bond, const Real& price, const char* settlementDate);
555 static Real _dv01(
556 bond_ptr bond, const Rate& yield, const char* settlementDate);
560 static Real _price(
561 bond_ptr bond, const Rate& yield, const char* settlementDate);
565 static std::string getDiscrepancyErrorMessage(int outputValue, BondKey cachedBondKey, BondKey inputBondKey);
569 static void dumpCaches();
570
571private:
572 static bond_ptr _createBond(
573 const char* issueDate, const char* maturityDate, const char* settlementDate,
574 const Rate& rate, const Frequency& frequency);
575};
576
577APAMA_DECLARE_EPL_PLUGIN(QuantlibPlugin)
578#endif /*_QUANTLIBPLUGIN_H_ */
Definition: QuantlibPlugin.hpp:66
BondKey & operator=(const BondKey &that)
Frequency getFrequency()
Definition: QuantlibPlugin.hpp:106
const char * toString()
BondKey(const char *issueDate, const char *maturityDate, const char *settlementDate, const Rate rate, const Frequency frequency, bool takeCopies=true)
BondKey(const BondKey &that)
const char * getMaturityDate()
Definition: QuantlibPlugin.hpp:94
const char * getSettlementDate()
Definition: QuantlibPlugin.hpp:98
Rate getRate()
Definition: QuantlibPlugin.hpp:102
const char * getIssueDate()
Definition: QuantlibPlugin.hpp:90
Definition: QuantlibPlugin.hpp:177
double npv
Definition: QuantlibPlugin.hpp:198
double delta
Definition: QuantlibPlugin.hpp:206
void print() const
OptionResultsChunk(int32_t errorNum, double npv, double implVol, double delta, double gamma, double theta, double vega, double rho, char *error)
char * error
Definition: QuantlibPlugin.hpp:226
double rho
Definition: QuantlibPlugin.hpp:222
double implVol
Definition: QuantlibPlugin.hpp:202
double gamma
Definition: QuantlibPlugin.hpp:210
double vega
Definition: QuantlibPlugin.hpp:218
double theta
Definition: QuantlibPlugin.hpp:214
int32_t errNum
Definition: QuantlibPlugin.hpp:194
Definition: QuantlibPlugin.hpp:240
void addToDataset(double _value, double _weight)
double price(const char *_symbol, double _yield, const char *_issueDate, const char *_maturityDate, const char *_settlementDate, double _rate, int64_t _freq)
static Real _price(bond_ptr bond, const Rate &yield, const char *settlementDate)
custom_t< OptionResultsChunk > modelImplVol(double _price, double _underlying, double _strike, const char *_currentBussinessDate, const char *_maturityDate, double _riskFreeRate, double _dividendYield, const char *_t, const char *_modelName)
static bond_ptr _getBond(const char *symbol, const char *issueDate, const char *maturityDate, const char *settlementDate, Rate rate, Frequency frequency, bool updateFlag, int &ouputValue, std::string &discrepancyMessage)
int64_t createBond(const char *_symbol, const char *_issueDate, const char *_maturityDate, const char *_settlementDate, double _rate, int64_t _frequency, bool _updateFlag)
double stddev()
void resetDataset()
static Logger * _logger
Definition: QuantlibPlugin.hpp:535
double theta(const custom_t< OptionResultsChunk > &results)
static void dumpCaches()
static Real _dv01(bond_ptr bond, const Rate &yield, const char *settlementDate)
double gamma(const custom_t< OptionResultsChunk > &results)
int64_t numSamples()
void removeFromDataset(double _value, double _weight)
double weightSum()
custom_t< OptionResultsChunk > btcoxrossrubinsteinGreeks(double _underlying, double _strike, const char *_currentBussinessDate, const char *_maturity, double _riskFreeRate, double _volatility, double _dividendYield, int64_t _timeSteps, const char *_t)
const char * error(const custom_t< OptionResultsChunk > &results)
double kurtosis()
custom_t< OptionResultsChunk > modelGreeks(double _underlying, double _strike, const char *_currentBussinessDate, const char *_maturity, double _riskFreeRate, double _volatility, double _dividendYield, const char *_t, const char *_modelName)
custom_t< OptionResultsChunk > modelPrice(double _underlying, double _strike, const char *_currentBussinessDate, const char *_maturity, double _riskFreeRate, double _volatility, double _dividendYield, const char *_t, const char *_modelName)
custom_t< OptionResultsChunk > btcoxrossrubinsteinPrice(double _underlying, double _strike, const char *_currentBussinessDate, const char *_maturity, double _riskFreeRate, double _volatility, double _dividendYield, int64_t _timeSteps, const char *_t)
static void initialize(base_plugin_t::method_data_t &md)
double rho(const custom_t< OptionResultsChunk > &results)
double implVol(const custom_t< OptionResultsChunk > &results)
double yield(const char *_symbol, double _price, const char *_issueDate, const char *_maturityDate, const char *_settlementDate, double _rate, int64_t _freq)
double variance()
double vega(const custom_t< OptionResultsChunk > &results)
double npv(const custom_t< OptionResultsChunk > &results)
custom_t< OptionResultsChunk > btcoxrossrubinsteinImplVol(double _price, double _underlying, double _strike, const char *_currentBussinessDate, const char *_maturity, double _riskFreeRate, double _dividendYield, int64_t _timeSteps, const char *_t)
double delta(const custom_t< OptionResultsChunk > &results)
static Rate _yield(bond_ptr bond, const Real &price, const char *settlementDate)
double dv01(const char *_symbol, double _yield, const char *_issueDate, const char *_maturityDate, const char *_settlementDate, double _rate, int64_t _freq)
QuantlibPlugin()
Definition: QuantlibPlugin.hpp:245
static std::string getDiscrepancyErrorMessage(int outputValue, BondKey cachedBondKey, BondKey inputBondKey)
Definition: QuantlibPlugin.hpp:131
YieldKey(const YieldKey &that)
YieldKey & operator=(const YieldKey &that)
YieldKey(bond_ptr &bond, Real price, const char *settlementDate, bool takeCopies=true)
Definition: QuantlibPlugin.hpp:232
void remove(Real value, Real weight)