EuroOptExample.cpp

Example shows how to calculate euro option price using FDM pricer. Below we compare analytic solution with FDIFF method (plot based on EuroOptExample_sample.csv). We see perfect match

EuroOptExample.png

Here we see the intermediate steps in solution. We see how diffusion process of option's value starts from payoff and ends as presents value while time is going backwards

EuroOptExample_solution.gif

Output

------------------------------
    Id   Strike   Tenor   Type
------------------------------
   Id1      1.0     1.5      C
   Id2     1.05    0.75      C
   Id3     1.01     2.0      C
   Id4      1.0     1.5      P
   Id5     1.05    0.75      P
   Id6     1.01     2.0      P
   Id7      1.0     0.5      C
   Id8     1.05    2.75      P
   Id9     1.01     3.0      C
------------------------------

--------------------------
    Id   Spot   Vol   Rate
--------------------------
   Id1    0.8   0.2   0.05
   Id2    0.9   0.2   0.05
   Id3    1.0   0.2   0.05
   Id4    1.1   0.2   0.05
   Id5    1.2   0.2   0.05
   Id6    1.0   0.1   0.05
   Id7    1.0   0.3   0.05
--------------------------

Name: option
Strike: 1 Tenor 1.5 Type Call


Name: market
Spot: 1 Vol 0.2 Rate 0.05

FDM price       0.134451
Analytic price  0.134429

#include <marian.hpp>
using namespace marian;
int main () {
//
// Reading option and market sample
//
DataFrame opt_df("../data/euroOpt.csv",';',true);
DataFrame mkt_df("../data/mkt.csv",';',true);
std::map<std::string, EuroOpt> options = createEuroOpts(opt_df);
std::map<std::string, Market> markets = createMarkets(mkt_df);
opt_df.print();
mkt_df.print();
//
// Preparing building blocks of PDE solver
//
LUSolver solver;
SpotRelatedRange range_setter(0.2, 3.0);
//
// Constructing pricer and pricing option sample
//
FDMPricer pricer(scheme, solver, grid, grid, range_setter);
DataFrame results;
for (auto market : markets) {
for (auto option : options) {
double analytic_price = BSprice(market.second, option.second);
double fdm_price = pricer.price(market.second, option.second, 500, 800);
input.add("Market", market.first);
input.add("Option", option.first);
input.add("Analytic", analytic_price);
input.add("FDM", fdm_price);
input.add("Diff", fdm_price - analytic_price);
results.append(input);
} // options
} // markets
//
// Saving results to csv file
//
results.printToCsv("EuroOptExample_sample");
//
// Saving whole solution for selected market and option to csv file
//
auto option = options["Id1"];
auto market = markets["Id3"];
SHOW(option);
SHOW(market);
auto fdm_price = pricer.price(market, option, 100, 200);
auto analytic_price = BSprice(market, option);
std::cout << "FDM price\t" << fdm_price << std::endl;
std::cout << "Analytic price\t" << analytic_price << std::endl;
pricer.solveAndSave(market, option, "EuroOptExample_solution", 100, 200);
}