Logo
Fully annotated reference manual - version 1.8.12
Loading...
Searching...
No Matches
Functions
fxaccumulator.cpp File Reference
#include <boost/test/unit_test.hpp>
#include <boost/test/data/test_case.hpp>
#include <boost/make_shared.hpp>
#include <ored/configuration/conventions.hpp>
#include <ored/configuration/curveconfigurations.hpp>
#include <ored/marketdata/csvloader.hpp>
#include <ored/marketdata/todaysmarketparameters.hpp>
#include <ored/portfolio/scriptedtrade.hpp>
#include <ored/portfolio/accumulator.hpp>
#include <ored/portfolio/builders/scriptedtrade.hpp>
#include <ored/marketdata/todaysmarket.hpp>
#include <ored/portfolio/enginedata.hpp>
#include <ored/portfolio/enginefactory.hpp>
#include <ored/portfolio/portfolio.hpp>
#include <oret/datapaths.hpp>
#include <oret/toplevelfixture.hpp>
#include <ql/time/date.hpp>
#include <ql/pricingengines/blackformula.hpp>
#include <boost/math/distributions/normal.hpp>
#include <iostream>
#include <iomanip>

Go to the source code of this file.

Functions

 BOOST_AUTO_TEST_CASE (testNPV)
 

Function Documentation

◆ BOOST_AUTO_TEST_CASE()

BOOST_AUTO_TEST_CASE ( testNPV  )

Definition at line 57 of file fxaccumulator.cpp.

57 {
58 BOOST_TEST_MESSAGE("Testing Fx Accumulator...");
59
63
64 Settings::instance().evaluationDate() = Date(31, Dec, 2018);
65 Date asof = Settings::instance().evaluationDate();
66 // Market
67 auto conventions = QuantLib::ext::make_shared<Conventions>();
68 conventions->fromFile(TEST_INPUT_FILE("conventions.xml"));
69 InstrumentConventions::instance().setConventions(conventions);
70
71 auto todaysMarketParams = QuantLib::ext::make_shared<TodaysMarketParameters>();
72 todaysMarketParams->fromFile(TEST_INPUT_FILE("todaysmarket.xml"));
73 auto curveConfigs = QuantLib::ext::make_shared<CurveConfigurations>();
74 curveConfigs->fromFile(TEST_INPUT_FILE("curveconfig.xml"));
75 QuantLib::ext::shared_ptr<Loader> loader =
76 QuantLib::ext::make_shared<CSVLoader>(TEST_INPUT_FILE("market.txt"), TEST_INPUT_FILE("fixings.txt"), false);
77 QuantLib::ext::shared_ptr<TodaysMarket> market =
78 QuantLib::ext::make_shared<TodaysMarket>(asof, todaysMarketParams, loader, curveConfigs, false);
79
80 // Portfolio to test market
81 QuantLib::ext::shared_ptr<EngineData> engineData = QuantLib::ext::make_shared<EngineData>();
82 engineData->fromFile(TEST_INPUT_FILE("pricingengine.xml"));
83 QuantLib::ext::shared_ptr<EngineFactory> factory = QuantLib::ext::make_shared<EngineFactory>(engineData, market);
84
85 // move cleanup to fixture once this code is in ore minus
86 struct cleanup {
87 ~cleanup() { ore::data::ScriptLibraryStorage::instance().clear(); }
88 } cleanup;
90 library.fromFile(TEST_INPUT_FILE("scriptlibrary.xml"));
91 ore::data::ScriptLibraryStorage::instance().set(std::move(library));
92
93 // Read in the trade
94 Portfolio p;
95 string trade = "FX_Accumulator";
96 string portfolioFile = trade + ".xml";
97 p.fromFile(TEST_INPUT_FILE(portfolioFile));
98 BOOST_CHECK_NO_THROW(p.build(factory));
99
100 // Test case 1: An FxAccumulator with no KnockOutBarrier,one fixing and one leverage range should be equivalent to
101 // an FxForward
102 BOOST_CHECK_NO_THROW(p.get("FX_ACCUMULATOR_1")->instrument()->NPV());
103 BOOST_TEST_MESSAGE(p.get("FX_ACCUMULATOR_1")->instrument()->NPV() * 1.1469);
104 BOOST_TEST_MESSAGE(p.get("FX_FORWARD_1")->instrument()->NPV());
105
106 BOOST_CHECK_CLOSE(p.get("FX_ACCUMULATOR_1")->instrument()->NPV() * 1.1469,
107 p.get("FX_FORWARD_1")->instrument()->NPV(), 0.01);
108
109 // Test case 2: An FxAccumulator with no KnockOutBarrier,several fixing dates and one leverage range should be
110 // equivalent to the sum of FxForwards
111 BOOST_CHECK_CLOSE(p.get("FX_ACCUMULATOR_2")->instrument()->NPV() * 1.1469,
112 p.get("FX_FORWARD_2A")->instrument()->NPV() + p.get("FX_FORWARD_2B")->instrument()->NPV() +
113 p.get("FX_FORWARD_2C")->instrument()->NPV(),
114 0.01);
115
116 // Test case 3: The Value of an accumulator with varying leverage ranges should be sum of accumulators with those
117 // individual leverages (and zero for the other ranges)
118 BOOST_CHECK_CLOSE(p.get("FX_ACCUMULATOR_3")->instrument()->NPV() * 1.1469,
119 (p.get("FX_ACCUMULATOR_3A")->instrument()->NPV() +
120 p.get("FX_ACCUMULATOR_3B")->instrument()->NPV() +
121 p.get("FX_ACCUMULATOR_3C")->instrument()->NPV()) *
122 1.1469,
123 0.01);
124}
Utility class for loading market quotes and fixings from a file.
Definition: csvloader.hpp:41
Repository for currency dependent market conventions.
Container class for all Curve Configurations.
Pricing engine description.
Definition: enginedata.hpp:41
Pricing Engine Factory class.
void clear()
Clear all builders.
Singleton to hold conventions.
Market data loader base class.
Definition: loader.hpp:47
Serializable portfolio.
Definition: portfolio.hpp:43
void build(const QuantLib::ext::shared_ptr< EngineFactory > &, const std::string &context="unspecified", const bool emitStructuredError=true)
Call build on all trades in the portfolio, the context is included in error messages.
Definition: portfolio.cpp:122
QuantLib::ext::shared_ptr< Trade > get(const std::string &id) const
Definition: portfolio.cpp:194
void fromFile(const std::string &filename)
Definition: xmlutils.cpp:150
#define ORE_REGISTER_TRADE_BUILDER(NAME, CLASS, OVERWRITE)
#define ORE_REGISTER_ENGINE_BUILDER(CLASS, OVERWRITE)
@ data
Definition: log.hpp:77
Serializable Credit Default Swap.
Definition: namespaces.docs:23
vector< string > curveConfigs
+ Here is the call graph for this function: