/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* Copyright (C) 2006 Warren Chou Copyright (C) 2007 Warren Chou This file is part of QuantLib, a free-software/open-source library for financial quantitative analysts and developers - http://quantlib.org/ QuantLib is free software: you can redistribute it and/or modify it under the terms of the QuantLib license. You should have received a copy of the license along with this program; if not, please email . The license is also available online at . 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. */ /*! \file varianceswap.hpp \brief Variance swap */ #ifndef quantlib_variance_swap_hpp #define quantlib_variance_swap_hpp #include #include #include #include namespace QuantLib { //! Variance swap /*! \warning This class does not manage seasoned variance swaps. \ingroup instruments */ class VarianceSwap : public Instrument { public: typedef std::vector, Real> > WeightsType; class arguments; class results; class engine; VarianceSwap(Position::Type position, Real strike, Real notional, const boost::shared_ptr& process, const Date& maturityDate, const boost::shared_ptr& engine); //! \name Instrument interface //@{ bool isExpired() const; //@} //! \name Additional interface //@{ // inspectors Real strike() const; Position::Type position() const; Date maturityDate() const; Date settlementDate() const; Real notional() const; // results Real fairVariance() const; std::vector > optionWeights(Option::Type) const; //@} // other void setupArguments(PricingEngine::arguments* args) const; void fetchResults(const PricingEngine::results*) const; protected: void setupExpired() const; void performCalculations() const; // data members boost::shared_ptr process_; Position::Type position_; Real strike_; Real notional_; Date maturityDate_; // results mutable WeightsType optionWeights_; mutable Real fairVariance_; }; //! %Arguments for forward fair-variance calculation class VarianceSwap::arguments : public virtual PricingEngine::arguments { public: arguments() : strike(Null()), notional(Null()) {} void validate() const; boost::shared_ptr stochasticProcess; Position::Type position; Real strike; Real notional; Date maturityDate; }; //! %Results from variance-swap calculation class VarianceSwap::results : public Instrument::results { public: Real fairVariance; WeightsType optionWeights; WeightsType::const_iterator iterator; void reset() { Instrument::results::reset(); fairVariance = Null(); optionWeights = WeightsType(); } }; //! base class for variance-swap engines class VarianceSwap::engine : public GenericEngine {}; // inline definitions inline Date VarianceSwap::maturityDate() const { return maturityDate_; } inline Date VarianceSwap::settlementDate() const { return process_->riskFreeRate()->referenceDate(); } inline Real VarianceSwap::strike() const { return strike_; } inline Real VarianceSwap::notional() const { return notional_; } inline Position::Type VarianceSwap::position() const { return position_; } } #endif