La razón por la que no hay versiones específicas de esas clases la encontré discutiendo con el desarrollador de QuantLib. Me dijo que
esas clases son instancias de una única clase PiecewiseYieldCurve en C++, pero necesitan ser exportadas como clases separadas a Python donde no hay plantillas.
He implementado una plantilla de función calculateCurve
y también implementó una función principal para mostrar las llamadas a calculateCurve
:
template<class T, class I, template<class C> class B>
ext::shared_ptr<YieldTermStructure>
calculateCurve(Date &settlementDate,
std::vector<ext::shared_ptr<RateHelper>> rateHelpers,
DayCounter dayCounter,
const I &interpolator = I())
{
auto termStructure = ext::shared_ptr<YieldTermStructure>(new PiecewiseYieldCurve<T, I, B>(settlementDate,
rateHelpers,
dayCounter,
interpolator));
return termStructure;
}
int main()
{
ext::shared_ptr<Quote> rate(new SimpleQuote(0.0019121));
ext::shared_ptr<RateHelper> rateHelper(new DepositRateHelper(
Handle<Quote>(rate),
Period(0, Days),
2,
TARGET(),
Following,
true,
ActualActual()
));
std::vector<ext::shared_ptr<RateHelper>> rateHelpers{rateHelper};
Date settlementDate = Date(01, January, 2017);
DayCounter dayCounter = Actual360();
// PiecewiseLogCubicDiscount
auto result = calculateCurve<Discount, LogCubic, IterativeBootstrap>(
settlementDate,
rateHelpers,
dayCounter,
LogCubic(CubicInterpolation::Spline));
// PiecewiseCubicZero
result = calculateCurve<ZeroYield, Cubic, IterativeBootstrap>(
settlementDate,
rateHelpers,
dayCounter,
Cubic(CubicInterpolation::Spline));
// PiecewiseLinearZero
result = calculateCurve<ZeroYield, Linear, IterativeBootstrap>(
settlementDate,
rateHelpers,
dayCounter);
return 0;
}