Bojan Nikolic's Web-pages

[home] | [blog] | [BN Algorithms Ltd] [Quantlib]

A simple FX-Option Example in QuantLib

Here is a simple, bare-bones example of pricing an American FX vanilla option in QuantLib:

/**
   Copyright (C) 2008, 2009 Bojan Nikolic <bojan@bnikolic.co.uk>

   Simple bare-bones example of using QuantLib to price an FX option

   This program is distributed in the hope that it will be useful, but WITHOUT
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
   FOR A PARTICULAR PURPOSE.  See the license for more details.

   Comments welcome at bojan@bnikolic.co.uk
*/

#include <iostream>

#include <ql/quantlib.hpp>

struct OptionInputs
{
  QuantLib::Real S;
  QuantLib::Real K;
  /// Foreign rate
  QuantLib::Spread f;
  /// Domestic rate
  QuantLib::Rate r;
  QuantLib::Volatility vol;
  QuantLib::Date maturity;
  QuantLib::DayCounter dayCounter;
};

double
CRRPricing(QuantLib::VanillaOption &o,
        boost::shared_ptr<QuantLib::GarmanKohlagenProcess> process,
        QuantLib::Size timeSteps)
{
  using namespace QuantLib;

  boost::shared_ptr<PricingEngine> pe(new BinomialVanillaEngine<CoxRossRubinstein>(process,
                                                                                timeSteps));
  o.setPricingEngine(pe);
  return o.NPV();
}

void FxOptEx(const OptionInputs &in,
          const QuantLib::Date &todaysDate,
          const QuantLib::Date &settlementDate)
{
  using namespace QuantLib;

  // set up dates
  Calendar calendar = TARGET();
  Settings::instance().evaluationDate() = todaysDate;

  boost::shared_ptr<Exercise>
    americanExercise(new AmericanExercise(settlementDate,
                                       in.maturity));

  Handle<Quote>
    underlyingH(boost::shared_ptr<Quote>(new SimpleQuote(in.S)));

  Handle<YieldTermStructure>
    rTS(boost::shared_ptr<YieldTermStructure>(new FlatForward(settlementDate,
                                                           in.r,
                                                           in.dayCounter)));
  Handle<YieldTermStructure>
    fTS(boost::shared_ptr<YieldTermStructure>(new FlatForward(settlementDate,
                                                           in.f,
                                                           in.dayCounter)));
  Handle<BlackVolTermStructure>
    flatVolTS(boost::shared_ptr<BlackVolTermStructure>(new BlackConstantVol(settlementDate,
                                                                         calendar,
                                                                         in.vol,
                                                                         in.dayCounter)));

  boost::shared_ptr<StrikedTypePayoff>
    payoff(new PlainVanillaPayoff(Option::Call,
                               in.K));

  boost::shared_ptr<GarmanKohlagenProcess>
    process(new GarmanKohlagenProcess(underlyingH,
                                   fTS,
                                   rTS,
                                   flatVolTS));

  VanillaOption amerOpt(payoff,
                     americanExercise);

  double npv=CRRPricing(amerOpt,
                     process,
                     100);

  std::cout<<"Option value:"
        <<npv
        <<std::endl;
}


int main(int, char* [])
{
  using namespace QuantLib;

  OptionInputs in;
  in.S=100;
  in.K=100;
  in.f=0.05;
  in.r=0.02;
  in.vol=0.20;
  in.maturity= Date(17, May, 1999);
  in.dayCounter = Actual365Fixed();

  FxOptEx(in,
       Date(15, May, 1998),
       Date(17, May, 1998));
}
Blog tools: Add to Technorati Favorites Save to del.iciou.us
Tweet