Fehler, wenn der Preis Instrument versucht, bei der Verwendung von quantlib
Frage
Ich erhalte die folgende Fehlermeldung, wenn einen 20x10-Swap von einer Bootstrap-Kurve des Preis versuchen. Der Fehler in der letzten Zeile der ImpliedRate
Funktion geworfen bekommen
SwapRatesServiceTests.ImpliedRate_ForTwenty_x_TenYearSwap_ReturnsRate: System.ApplicationException: 2. Etappe: leer Handle nicht dereferenzierte
sein kann
Ich habe nicht die leiseste Ahnung, wo Sie anfangen, dieses Problem zu debuggen. Jede Hilfe wird sehr geschätzt.
WICHTIG: Ich bin mit der C # Swig Version von quantlib, so mein eigentlichen prod Code folgt, wie auf der Grundlage des swapvaluation.cpp Beispiel:
Die Testmethode:
[Test]
public void ImpliedRate_ForTwenty_x_TenYearSwap_ReturnsRate()
{
//Arrange
var startingDate = new Date(10,Month.October,2030); // starting date of 20x10yr swap
var length= 10;
repo.Setup(r => r.Read(It.IsAny<string>())).Returns(LoadSwapPoints()); // LoadSwapPoints returns IEnumerable<RateHelpers>
//Act
service.ConstructSwapPoints(SettlementDate);
var instrumentRate = service.ImpliedRate(startingDate, length);
//Assert
Assert.That(instrumentRate, Is.Not.Null); // this must change to a value test
}
Dies ist ein Teil der größeren ConstructSwapPoints Methode
var depoFRASwapInstruments = PointVector; // RateHelperVector populated with RateHelpers
DayCounter termStructureDayCounter = new ActualActual(ActualActual.Convention.Actual365);
QuoteHandleVector quotes = new QuoteHandleVector();
DateVector quoteDates = new DateVector();
py = CreatePiecewiseLinearCurve(settlementDate, depoFRASwapInstruments, termStructureDayCounter, quotes, quoteDates);
DiscountingTermStructure = new RelinkableYieldTermStructureHandle(py); //RelinkableYieldTermStructureHandle
//DiscountingTermStructure.linkTo(py); // alternate way
PricingEngine = new DiscountingSwapEngine(DiscountingTermStructure); // DiscountingSwapEngine
Mit der ImpliedRate Methode wie folgt (i IP Einschränkungen einige Teile aus durch snipped habe);
public double ImpliedRate(Date startingDate, int length)
{
var swapMaturityDate = startingDate.Add(new Period(length, TimeUnit.Years));
var curveMaturityDate = py.maxDate();
Schedule fixedSchedule = new Schedule(startingDate, swapMaturityDate, new Period(Frequency.Quarterly), SouthAfricanCalender, Convention, Convention, DateGeneration.Rule.Forward, false);
Schedule floatSchedule = new Schedule(startingDate, swapMaturityDate, new Period(Frequency.Quarterly), SouthAfricanCalender, Convention, Convention, DateGeneration.Rule.Forward, false);
VanillaSwap impliedSwap = new VanillaSwap(
_VanillaSwap.Type.Payer,
10000000.0,
fixedSchedule,
0.1,
Actual365FixedDayCounter,
floatSchedule,
new Jibar(new Period(Frequency.Quarterly)),
0,
Actual365FixedDayCounter);
impliedSwap.setPricingEngine(PricingEngine);
return impliedSwap.fairRate(); // <---exception thrown here
}
Ich hoffe, meine Terminologie korrekt ist, wie der Finanzjargon mir noch neu ist.
Edit: Ich habe den C ++ Tag hinzugefügt, da ich Figur tatsächlich bis zu einem gewissen zugrunde liegenden C ++ Code verwendet ist. Hoffnung, dass diese Exposition einen Einblick in offenbaren kann, was hier passiert sein kann.
Lösung
Basierend auf dem Feedback aus der quantlib Mailingliste
Der Jibar Index muss erstellt einen Verweis auf die risikofreie Kurve haben. Ohne Begriff Struktur kann die Jibar Vergangenheit Befestigungen zurück, aber nicht Vorhersage zukünftiges Leben. Die Jibar Konstruktor Bedürfnisse zu ersetzen
new Jibar(new Period(Frequency.Quarterly), DiscountingTermStructure)
mit
VanillaSwap impliedSwap = new VanillaSwap(
_VanillaSwap.Type.Payer,
10000000.0,
fixedSchedule,
0.1,
Actual365FixedDayCounter,
floatSchedule,
new Jibar(new Period(Frequency.Quarterly), DiscountingTermStructure),
0,
Actual365FixedDayCounter);