Logo
Fully annotated reference manual - version 1.8.12
Loading...
Searching...
No Matches
Public Member Functions | List of all members
EquityDoubleTouchOption Class Reference

SerializableEQ Double One-Touch/No-Touch Option. More...

#include <ored/portfolio/equitydoubletouchoption.hpp>

+ Inheritance diagram for EquityDoubleTouchOption:
+ Collaboration diagram for EquityDoubleTouchOption:

Public Member Functions

 EquityDoubleTouchOption ()
 Default constructor. More...
 
 EquityDoubleTouchOption (Envelope &env, OptionData option, BarrierData barrier, const EquityUnderlying &equityUnderlying, string payoffCurrency, double payoffAmount, string startDate="", string calendar="")
 Constructor. More...
 
void build (const QuantLib::ext::shared_ptr< EngineFactory > &) override
 Build QuantLib/QuantExt instrument, link pricing engine. More...
 
Inspectors
const OptionDataoption () const
 
const BarrierDatabarrier () const
 
double payoffAmount () const
 
const string & type () const
 
const string & payoffCurrency () const
 
const string & startDate () const
 
const string & calendar () const
 
- Public Member Functions inherited from EquitySingleAssetDerivative
const string & equityName () const
 
- Public Member Functions inherited from Trade
 Trade ()
 Default constructor. More...
 
 Trade (const string &tradeType, const Envelope &env=Envelope(), const TradeActions &ta=TradeActions())
 Base class constructor. More...
 
virtual ~Trade ()
 Default destructor. More...
 
virtual void build (const QuantLib::ext::shared_ptr< EngineFactory > &)=0
 
virtual std::map< std::string, RequiredFixings::FixingDatesfixings (const QuantLib::Date &settlementDate=QuantLib::Date()) const
 
const RequiredFixingsrequiredFixings () const
 
virtual std::map< AssetClass, std::set< std::string > > underlyingIndices (const QuantLib::ext::shared_ptr< ReferenceDataManager > &referenceDataManager=nullptr) const
 
void reset ()
 Reset trade, clear all base class data. This does not reset accumulated timings for this trade. More...
 
void resetPricingStats (const std::size_t numberOfPricings=0, const boost::timer::nanosecond_type cumulativePricingTime=0)
 Reset accumulated timings to given values. More...
 
string & id ()
 Set the trade id. More...
 
void setEnvelope (const Envelope &envelope)
 Set the envelope with counterparty and portfolio info. More...
 
void setAdditionalData (const std::map< std::string, boost::any > &additionalData)
 
TradeActionstradeActions ()
 Set the trade actions. More...
 
const string & id () const
 
const string & tradeType () const
 
const Envelopeenvelope () const
 
const set< string > & portfolioIds () const
 
const TradeActionstradeActions () const
 
const QuantLib::ext::shared_ptr< InstrumentWrapper > & instrument () const
 
const std::vector< QuantLib::Leg > & legs () const
 
const std::vector< string > & legCurrencies () const
 
const std::vector< bool > & legPayers () const
 
const string & npvCurrency () const
 
virtual QuantLib::Real notional () const
 Return the current notional in npvCurrency. See individual sub-classes for the precise definition. More...
 
virtual string notionalCurrency () const
 
const Date & maturity () const
 
virtual bool isExpired (const Date &d)
 
const string & issuer () const
 
template<typename T >
additionalDatum (const std::string &tag) const
 returns any additional datum. More...
 
virtual const std::map< std::string, boost::any > & additionalData () const
 returns all additional data returned by the trade once built More...
 
const std::string & sensitivityTemplate () const
 
void validate () const
 Utility to validate that everything that needs to be set in this base class is actually set. More...
 
virtual bool hasCashflows () const
 
boost::timer::nanosecond_type getCumulativePricingTime () const
 Get cumulative timing spent on pricing. More...
 
std::size_t getNumberOfPricings () const
 Get number of pricings. More...
 
- Public Member Functions inherited from XMLSerializable
virtual ~XMLSerializable ()
 
virtual void fromXML (XMLNode *node)=0
 
virtual XMLNodetoXML (XMLDocument &doc) const =0
 
void fromFile (const std::string &filename)
 
void toFile (const std::string &filename) const
 
void fromXMLString (const std::string &xml)
 Parse from XML string. More...
 
std::string toXMLString () const
 Parse from XML string. More...
 

Serialisation

OptionData option_
 
BarrierData barrier_
 
string startDate_
 
string calendar_
 
Real payoffAmount_
 
string type_
 
string payoffCurrency_
 
QuantLib::Date start_
 
QuantLib::Calendar cal_
 
virtual void fromXML (XMLNode *node) override
 
virtual XMLNodetoXML (XMLDocument &doc) const override
 
bool checkBarrier (Real spot, Barrier::Type type, Real level)
 

Additional Inherited Members

- Protected Member Functions inherited from EquitySingleAssetDerivative
 EquitySingleAssetDerivative (const std::string &tradeType)
 
 EquitySingleAssetDerivative (const std::string &tradeType, ore::data::Envelope &env, const EquityUnderlying &equityUnderlying)
 
- Protected Member Functions inherited from EquityDerivative
 EquityDerivative (const std::string &tradeType)
 
 EquityDerivative (const std::string &tradeType, ore::data::Envelope &env)
 
- Protected Member Functions inherited from Trade
Date addPremiums (std::vector< QuantLib::ext::shared_ptr< Instrument > > &instruments, std::vector< Real > &multipliers, const Real tradeMultiplier, const PremiumData &premiumData, const Real premiumMultiplier, const Currency &tradeCurrency, const QuantLib::ext::shared_ptr< EngineFactory > &factory, const string &configuration)
 
void setLegBasedAdditionalData (const Size legNo, Size resultLegId=Null< Size >()) const
 
void setSensitivityTemplate (const EngineBuilder &builder)
 
void setSensitivityTemplate (const std::string &id)
 
- Protected Attributes inherited from EquitySingleAssetDerivative
EquityUnderlying equityUnderlying_
 
- Protected Attributes inherited from Trade
string tradeType_
 
QuantLib::ext::shared_ptr< InstrumentWrapperinstrument_
 
std::vector< QuantLib::Leg > legs_
 
std::vector< string > legCurrencies_
 
std::vector< boollegPayers_
 
string npvCurrency_
 
QuantLib::Real notional_
 
string notionalCurrency_
 
Date maturity_
 
string issuer_
 
string sensitivityTemplate_
 
bool sensitivityTemplateSet_ = false
 
std::size_t savedNumberOfPricings_ = 0
 
boost::timer::nanosecond_type savedCumulativePricingTime_ = 0
 
RequiredFixings requiredFixings_
 
std::map< std::string, boost::any > additionalData_
 

Detailed Description

SerializableEQ Double One-Touch/No-Touch Option.

Definition at line 37 of file equitydoubletouchoption.hpp.

Constructor & Destructor Documentation

◆ EquityDoubleTouchOption() [1/2]

Default constructor.

Definition at line 40 of file equitydoubletouchoption.hpp.

41 : ore::data::Trade("EquityDoubleTouchOption"), EquitySingleAssetDerivative("") {}
EquitySingleAssetDerivative(const std::string &tradeType)
Trade base class.
Definition: trade.hpp:55

◆ EquityDoubleTouchOption() [2/2]

EquityDoubleTouchOption ( Envelope env,
OptionData  option,
BarrierData  barrier,
const EquityUnderlying equityUnderlying,
string  payoffCurrency,
double  payoffAmount,
string  startDate = "",
string  calendar = "" 
)

Constructor.

Definition at line 40 of file equitydoubletouchoption.cpp.

43 : ore::data::Trade("EquityDoubleTouchOption", env),
44 EquitySingleAssetDerivative("", env, equityUnderlying),
48 DoubleBarrier::Type barrierType = parseDoubleBarrierType(barrier_.type());
49 switch (barrierType) {
50 case DoubleBarrier::KnockIn:
51 type_ = "KnockIn";
52 break;
53 case DoubleBarrier::KnockOut:
54 type_ = "KnockOut";
55 break;
56 default:
57 QL_FAIL("unsupported barrier type " << barrierType);
58 }
59}
const std::string & type() const
Definition: barrierdata.hpp:46
DoubleBarrier::Type parseDoubleBarrierType(const std::string &s)
Convert std::string to QuantLib::DoubleBarrierType.
Definition: parsers.cpp:1061
+ Here is the call graph for this function:

Member Function Documentation

◆ build()

void build ( const QuantLib::ext::shared_ptr< EngineFactory > &  engineFactory)
overridevirtual

Build QuantLib/QuantExt instrument, link pricing engine.

Implements Trade.

Definition at line 61 of file equitydoubletouchoption.cpp.

61 {
62
63 // ISDA taxonomy
64 additionalData_["isdaAssetClass"] = string("Equity");
65 additionalData_["isdaBaseProduct"] = string("Other");
66 additionalData_["isdaSubProduct"] = string("Price Return Basic Performance");
67 // skip the transaction level mapping for now
68 additionalData_["isdaTransaction"] = string("");
69
70 const QuantLib::ext::shared_ptr<Market> market = engineFactory->market();
71 Date start = ore::data::parseDate(startDate_);
72 Calendar cal = ore::data::parseCalendar(calendar_);
73
74 QL_REQUIRE(tradeActions().empty(), "TradeActions not supported for FxOption");
75 QL_REQUIRE(option_.exerciseDates().size() == 1, "Invalid number of exercise dates");
76 QL_REQUIRE(barrier_.levels().size() == 2, "Invalid number of barrier levels");
77 QL_REQUIRE(barrier_.style().empty() || barrier_.style() == "American", "Only american barrier style suppported");
78
79 // Parse trade data
80 string assetName = equityName();
81 Currency ccy = parseCurrency(payoffCurrency_);
82 Date expiryDate = parseDate(option_.exerciseDates().front());
83 DoubleBarrier::Type barrierType = parseDoubleBarrierType(barrier_.type());
84 bool payoffAtExpiry = option_.payoffAtExpiry();
85 double rebate = barrier_.rebate();
86 Position::Type positionType = parsePositionType(option_.longShort());
87
88 QL_REQUIRE(rebate == 0, "Rebates not supported for EquityDoubleTouchOptions");
89 if (payoffAtExpiry == false) {
90 payoffAtExpiry = true;
91 DLOG("Payoff at hit not yet supported for EquityDoubleTouchOptions, setting to payoff at expiry");
92 }
93
94 Real levelLow = barrier_.levels()[0].value();
95 Real levelHigh = barrier_.levels()[1].value();
96 QL_REQUIRE(levelLow < levelHigh, "barrier levels are not in ascending order");
97
98
99 // create payoff and exercise, as well as leg of underlying instrument
100 QuantLib::ext::shared_ptr<StrikedTypePayoff> payoff(new CashOrNothingPayoff(Option::Call, (levelLow + levelHigh) / 2, 1.0));
101 Leg leg;
102
103 leg.push_back(QuantLib::ext::shared_ptr<CashFlow>(new SimpleCashFlow(1.0, expiryDate)));
104
105 QuantLib::ext::shared_ptr<Exercise> exercise = QuantLib::ext::make_shared<EuropeanExercise>(expiryDate);
106
107 QuantLib::ext::shared_ptr<Instrument> doubleTouch =
108 QuantLib::ext::make_shared<DoubleBarrierOption>(barrierType, levelLow, levelHigh, 0.0, payoff, exercise);
109 QuantLib::ext::shared_ptr<Instrument> underlying = QuantLib::ext::make_shared<Swap>(Leg(), leg);
110
111
112
113 QuantLib::ext::shared_ptr<QuantExt::EquityIndex2> eqIndex = engineFactory->market()->equityCurve(assetName).currentLink();
114
115 // set pricing engines
116 QuantLib::ext::shared_ptr<EngineBuilder> builder = engineFactory->builder(tradeType_);
117 QL_REQUIRE(builder, "No builder found for " << tradeType_);
118 QuantLib::ext::shared_ptr<EquityDoubleTouchOptionEngineBuilder> eqDoubleTouchOptBuilder =
119 QuantLib::ext::dynamic_pointer_cast<EquityDoubleTouchOptionEngineBuilder>(builder);
120 doubleTouch->setPricingEngine(eqDoubleTouchOptBuilder->engine(assetName, ccy));
121 setSensitivityTemplate(*eqDoubleTouchOptBuilder);
122 if (type_ == "KnockIn") {
123 // if a knock-in option is triggered it becomes a simple forward cashflow
124 // which we price as a swap
125 builder = engineFactory->builder("Swap");
126 QL_REQUIRE(builder, "No builder found for Swap");
127 QuantLib::ext::shared_ptr<SwapEngineBuilderBase> swapBuilder =
128 QuantLib::ext::dynamic_pointer_cast<SwapEngineBuilderBase>(builder);
129 underlying->setPricingEngine(swapBuilder->engine(parseCurrency(payoffCurrency_), std::string(), std::string()));
130 }
131
132 bool isLong = (positionType == Position::Long) ? true : false;
133
134 std::vector<QuantLib::ext::shared_ptr<Instrument>> additionalInstruments;
135 std::vector<Real> additionalMultipliers;
136 Date lastPremiumDate = addPremiums(
137 additionalInstruments, additionalMultipliers, (isLong ? 1.0 : -1.0) * payoffAmount_, option_.premiumData(),
138 isLong ? -1.0 : 1.0, ccy, engineFactory, builder->configuration(MarketContext::pricing));
139
140 Handle<Quote> spot = market->equitySpot(assetName);
141 instrument_ = QuantLib::ext::make_shared<DoubleBarrierOptionWrapper>(
142 doubleTouch, isLong, expiryDate, false, underlying, barrierType, spot, levelLow, levelHigh, 0, ccy, start, eqIndex, cal,
143 payoffAmount_, payoffAmount_, additionalInstruments, additionalMultipliers);
147 maturity_ = std::max(lastPremiumDate, expiryDate);
148
149 if (start != Date()) {
150 for (Date d = start; d <= expiryDate; d = eqIndex->fixingCalendar().advance(d, 1 * Days))
151 requiredFixings_.addFixingDate(d, "EQ-" + assetName, expiryDate);
152 }
153
154 additionalData_["payoffAmount"] = payoffAmount_;
155 additionalData_["payoffCurrency"] = payoffCurrency_;
156}
double rebate() const
Definition: barrierdata.hpp:47
std::vector< ore::data::TradeBarrier > levels() const
Definition: barrierdata.hpp:50
const std::string & style() const
Definition: barrierdata.hpp:51
const string & longShort() const
Definition: optiondata.hpp:70
const bool & payoffAtExpiry() const
Definition: optiondata.hpp:75
const PremiumData & premiumData() const
Definition: optiondata.hpp:83
const vector< string > & exerciseDates() const
Definition: optiondata.hpp:76
void addFixingDate(const QuantLib::Date &fixingDate, const std::string &indexName, const QuantLib::Date &payDate=Date::maxDate(), const bool alwaysAddIfPaysOnSettlement=false, const bool mandatoryFixing=true)
TradeActions & tradeActions()
Set the trade actions.
Definition: trade.hpp:126
string npvCurrency_
Definition: trade.hpp:201
QuantLib::Real notional_
Definition: trade.hpp:202
Date addPremiums(std::vector< QuantLib::ext::shared_ptr< Instrument > > &instruments, std::vector< Real > &multipliers, const Real tradeMultiplier, const PremiumData &premiumData, const Real premiumMultiplier, const Currency &tradeCurrency, const QuantLib::ext::shared_ptr< EngineFactory > &factory, const string &configuration)
Definition: trade.cpp:58
void setSensitivityTemplate(const EngineBuilder &builder)
Definition: trade.cpp:295
string tradeType_
Definition: trade.hpp:196
RequiredFixings requiredFixings_
Definition: trade.hpp:223
QuantLib::ext::shared_ptr< InstrumentWrapper > instrument_
Definition: trade.hpp:197
string notionalCurrency_
Definition: trade.hpp:203
std::map< std::string, boost::any > additionalData_
Definition: trade.hpp:224
Calendar parseCalendar(const string &s)
Convert text to QuantLib::Calendar.
Definition: parsers.cpp:157
Date parseDate(const string &s)
Convert std::string to QuantLib::Date.
Definition: parsers.cpp:51
Currency parseCurrency(const string &s)
Convert text to QuantLib::Currency.
Definition: parsers.cpp:290
Position::Type parsePositionType(const std::string &s)
Convert text to QuantLib::Position::Type.
Definition: parsers.cpp:404
#define DLOG(text)
Logging Macro (Level = Debug)
Definition: log.hpp:554
+ Here is the call graph for this function:

◆ option()

const OptionData & option ( ) const

Definition at line 52 of file equitydoubletouchoption.hpp.

52{ return option_; }

◆ barrier()

const BarrierData & barrier ( ) const

Definition at line 53 of file equitydoubletouchoption.hpp.

53{ return barrier_; }
+ Here is the caller graph for this function:

◆ payoffAmount()

double payoffAmount ( ) const

Definition at line 54 of file equitydoubletouchoption.hpp.

54{ return payoffAmount_; }

◆ type()

const string & type ( ) const

Definition at line 55 of file equitydoubletouchoption.hpp.

55{ return type_; }
+ Here is the caller graph for this function:

◆ payoffCurrency()

const string & payoffCurrency ( ) const

Definition at line 56 of file equitydoubletouchoption.hpp.

56{ return payoffCurrency_; }

◆ startDate()

const string & startDate ( ) const

Definition at line 57 of file equitydoubletouchoption.hpp.

57{ return startDate_; }

◆ calendar()

const string & calendar ( ) const

Definition at line 58 of file equitydoubletouchoption.hpp.

58{ return calendar_; }

◆ fromXML()

void fromXML ( XMLNode node)
overridevirtual

Reimplemented from Trade.

Definition at line 171 of file equitydoubletouchoption.cpp.

171 {
172 Trade::fromXML(node);
173 XMLNode* eqNode = XMLUtils::getChildNode(node, "EquityDoubleTouchOptionData");
174 QL_REQUIRE(eqNode, "No EquityDoubleTouchOptionData Node");
175 option_.fromXML(XMLUtils::getChildNode(eqNode, "OptionData"));
176 barrier_.fromXML(XMLUtils::getChildNode(eqNode, "BarrierData"));
177 DoubleBarrier::Type barrierType = parseDoubleBarrierType(barrier_.type());
178 switch (barrierType) {
179 case DoubleBarrier::KnockIn:
180 type_ = "KnockIn";
181 break;
182 case DoubleBarrier::KnockOut:
183 type_ = "KnockOut";
184 break;
185 default:
186 QL_FAIL("unsupported barrier type " << barrierType);
187 }
188
189 XMLNode* tmp = XMLUtils::getChildNode(eqNode, "Underlying");
190 if (!tmp)
191 tmp = XMLUtils::getChildNode(eqNode, "Name");
193 payoffCurrency_ = XMLUtils::getChildValue(eqNode, "PayoffCurrency", true);
194 startDate_ = XMLUtils::getChildValue(eqNode, "StartDate", false);
195 calendar_ = XMLUtils::getChildValue(eqNode, "Calendar", false);
196 payoffAmount_ = XMLUtils::getChildValueAsDouble(eqNode, "PayoffAmount", true);
197}
virtual void fromXML(ore::data::XMLNode *node) override
Definition: barrierdata.cpp:25
void fromXML(XMLNode *node) override
Definition: underlying.cpp:81
virtual void fromXML(XMLNode *node) override
Definition: optiondata.cpp:32
virtual void fromXML(XMLNode *node) override
Definition: trade.cpp:34
static Real getChildValueAsDouble(XMLNode *node, const string &name, bool mandatory=false, double defaultValue=0.0)
Definition: xmlutils.cpp:286
static string getChildValue(XMLNode *node, const string &name, bool mandatory=false, const string &defaultValue=string())
Definition: xmlutils.cpp:277
static XMLNode * getChildNode(XMLNode *n, const string &name="")
Definition: xmlutils.cpp:387
rapidxml::xml_node< char > XMLNode
Definition: xmlutils.hpp:60
+ Here is the call graph for this function:

◆ toXML()

XMLNode * toXML ( XMLDocument doc) const
overridevirtual

Reimplemented from Trade.

Definition at line 199 of file equitydoubletouchoption.cpp.

199 {
200 XMLNode* node = Trade::toXML(doc);
201 XMLNode* eqNode = doc.allocNode("EquityDoubleTouchOptionData");
202 XMLUtils::appendNode(node, eqNode);
203 XMLUtils::appendNode(eqNode, option_.toXML(doc));
204 XMLUtils::appendNode(eqNode, barrier_.toXML(doc));
206 XMLUtils::addChild(doc, eqNode, "PayoffCurrency", payoffCurrency_);
207 XMLUtils::addChild(doc, eqNode, "PayoffAmount", payoffAmount_);
208 if (startDate_ != "")
209 XMLUtils::addChild(doc, eqNode, "StartDate", startDate_);
210 if (calendar_ != "")
211 XMLUtils::addChild(doc, eqNode, "Calendar", calendar_);
212
213 return node;
214}
virtual ore::data::XMLNode * toXML(ore::data::XMLDocument &doc) const override
Definition: barrierdata.cpp:49
XMLNode * toXML(XMLDocument &doc) const override
Definition: underlying.cpp:102
virtual XMLNode * toXML(XMLDocument &doc) const override
Definition: optiondata.cpp:86
virtual XMLNode * toXML(XMLDocument &doc) const override
Definition: trade.cpp:46
static XMLNode * addChild(XMLDocument &doc, XMLNode *n, const string &name)
Definition: xmlutils.cpp:181
static void appendNode(XMLNode *parent, XMLNode *child)
Definition: xmlutils.cpp:406
+ Here is the call graph for this function:

◆ checkBarrier()

bool checkBarrier ( Real  spot,
Barrier::Type  type,
Real  level 
)
private

Definition at line 158 of file equitydoubletouchoption.cpp.

158 {
159 switch (type) {
160 case Barrier::DownIn:
161 case Barrier::DownOut:
162 return spot <= barrier;
163 case Barrier::UpIn:
164 case Barrier::UpOut:
165 return spot >= barrier;
166 default:
167 QL_FAIL("unknown barrier type " << type);
168 }
169}
+ Here is the call graph for this function:

Member Data Documentation

◆ option_

OptionData option_
private

Definition at line 69 of file equitydoubletouchoption.hpp.

◆ barrier_

BarrierData barrier_
private

Definition at line 70 of file equitydoubletouchoption.hpp.

◆ startDate_

string startDate_
private

Definition at line 71 of file equitydoubletouchoption.hpp.

◆ calendar_

string calendar_
private

Definition at line 72 of file equitydoubletouchoption.hpp.

◆ payoffAmount_

Real payoffAmount_
private

Definition at line 73 of file equitydoubletouchoption.hpp.

◆ type_

string type_
private

Definition at line 74 of file equitydoubletouchoption.hpp.

◆ payoffCurrency_

string payoffCurrency_
private

Definition at line 75 of file equitydoubletouchoption.hpp.

◆ start_

QuantLib::Date start_
private

Definition at line 78 of file equitydoubletouchoption.hpp.

◆ cal_

QuantLib::Calendar cal_
private

Definition at line 79 of file equitydoubletouchoption.hpp.