1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
Copyright (C) 2008 Jose Aparicio
Copyright (C) 2008 Chris Kenyon
Copyright (C) 2008 Roland Lichters
Copyright (C) 2008 StatPro Italia srl
Copyright (C) 2009 Ferdinando Ametrano
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
<quantlib-dev@lists.sf.net>. The license is also available online at
<http://quantlib.org/license.shtml>.
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.
*/
#include <ql/termstructures/credit/hazardratestructure.hpp>
#include <ql/math/integrals/gaussianquadratures.hpp>
#include <boost/bind.hpp>
using namespace boost;
namespace QuantLib {
namespace {
template <class F>
struct remapper {
F f;
Time T;
remapper(const F& f, Time T) : f(f), T(T) {}
// This remaps [-1,1] to [0,T]. No differential included.
Real operator()(Real x) const {
const Real arg = (x+1.0)*T/2.0;
return f(arg);
}
};
template <class F>
remapper<F> remap(const F& f, Time T) {
return remapper<F>(f,T);
}
}
HazardRateStructure::HazardRateStructure(
const DayCounter& dc,
const std::vector<Handle<Quote> >& jumps,
const std::vector<Date>& jumpDates)
: DefaultProbabilityTermStructure(dc, jumps, jumpDates) {}
HazardRateStructure::HazardRateStructure(
const Date& refDate,
const Calendar& cal,
const DayCounter& dc,
const std::vector<Handle<Quote> >& jumps,
const std::vector<Date>& jumpDates)
: DefaultProbabilityTermStructure(refDate, cal, dc, jumps, jumpDates) {}
HazardRateStructure::HazardRateStructure(
Natural settlDays,
const Calendar& cal,
const DayCounter& dc,
const std::vector<Handle<Quote> >& jumps,
const std::vector<Date>& jumpDates)
: DefaultProbabilityTermStructure(settlDays, cal, dc, jumps, jumpDates) {}
Probability HazardRateStructure::survivalProbabilityImpl(Time t) const {
static GaussChebyshevIntegration integral(48);
// this stores the address of the method to integrate (so that
// we don't have to insert its full expression inside the
// integral below--it's long enough already)
Real (HazardRateStructure::*f)(Time) const =
&HazardRateStructure::hazardRateImpl;
// the Gauss-Chebyshev quadratures integrate over [-1,1],
// hence the remapping (and the Jacobian term t/2)
return std::exp(-integral(remap(bind(f,this,_1), t)) * t/2.0);
}
}
|