Errore quando si cerca di strumento di prezzo quando si utilizza Quantlib
Domanda
Sto ricevendo il seguente errore quando si tenta di prezzo di un 20x10 di swap da una curva bootstrap. L'errore avere buttato sull'ultima riga della funzione ImpliedRate
SwapRatesServiceTests.ImpliedRate_ForTwenty_x_TenYearSwap_ReturnsRate: System.ApplicationException: 2 ° tappa: Maniglia vuoto non può essere Dereferenced
Non ho la più pallida idea da dove cominciare per eseguire il debug questo problema. Tutta l'assistenza sarà molto apprezzato.
IMPORTANTE: Sto usando la versione C # sorso di Quantlib, quindi il mio codice prod attuale è la seguente basa sull'esempio swapvaluation.cpp:
Il metodo di prova:
[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
}
Questa è parte del metodo ConstructSwapPoints grande
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
Con il metodo ImpliedRate come segue (ho snipped alcune parti a causa di restrizioni IP);
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
}
Spero che la mia terminologia è corretto, come si dice in gergo finanza è ancora nuovo per me.
Edit: ho aggiunto il tag C ++, dal momento che la figura è in realtà legata a qualche codice sottostante C ++. Sperando che questa esposizione può rivelare alcune intuizioni in quello che può accadere qui.
Soluzione
In base al feedback dal href="http://sourceforge.net/mailarchive/forum.php?thread_name=1288190091.1929.153.camel%40ITSUP001&forum_name=quantlib-users" rel="nofollow"> Quantlib mailing list
L'indice Jibar deve avere un riferimento alla curva rischio gratuito creato. Senza una struttura a termine, il Jibar può tornare fissaggi passato, ma non prevedere quelli futuri. Le esigenze costruttore Jibar per essere sostituiti con
new Jibar(new Period(Frequency.Quarterly), DiscountingTermStructure)
con
VanillaSwap impliedSwap = new VanillaSwap(
_VanillaSwap.Type.Payer,
10000000.0,
fixedSchedule,
0.1,
Actual365FixedDayCounter,
floatSchedule,
new Jibar(new Period(Frequency.Quarterly), DiscountingTermStructure),
0,
Actual365FixedDayCounter);