2017-02-02 1 views
0

Dies ist wahrscheinlich eine wirklich dumme Frage, aber nicht sicher, was zu tun ist. Ich habe eine Funktion, die alle die Ex-div-Daten und die divYield entsprechenden evalDatebisexpiration Datum der Option zurückgibt.Bootstrap ZeroCurve mit nur einem Ex-Div-Datum und einem Div-Wert

Handle<YieldTermStructure> dividendTermStructure(bootstrapDividendCurveDB("INTC", today, expiration, underlyingPrice)); 

boost::shared_ptr<ZeroCurve> 
bootstrapDividendCurveDB() 
{ 
.... 
    return boost::shared_ptr<ZeroCurve>(new ZeroCurve(ddy.exDivDates, ddy.dividendYields, ActualActual(), calendar)); 
} 

Diese dann zu

//instantiate BSM process 
    Handle<Quote> underlyingH(boost::shared_ptr<Quote>(new SimpleQuote(underlyingPrice))); 
    boost::shared_ptr<BlackScholesMertonProcess> bsmProcess(new BlackScholesMertonProcess(underlyingH, 
     dividendTermStructure, yieldTermStructure, volatilityTermStructure)); 

jedoch übergeben wird, wenn es nur eine Dividende in zwischen evalDate und expiration und damit ddy.exDivDates, ddy.dividendYields jeder nur einen Eintrag enthalten, erhalte ich eine Fehlermeldung:

unknown location(0): fatal error: in "testAmericanOptionPricingWithDividends": QuantLib::Error: not enough input dates given 
FD_Div_IRAmerican.cpp(524): last checkpoint: "testAmericanOptionPricingWithDividends" entry. 

Die Art und Weise, wie das Beispiel, das ich diesen Codeabschnitt von gelöst habe, löst, ist die vorherige Teilung nd yield, obwohl das evalDate (heute) nach diesem ex-div-Datum liegt. Auf diese Weise gibt es mindestens zwei Werte, aus denen genügend Punkte sind, um eine ZeroCurve zu erstellen.

Das scheint nicht richtig. Was ist in diesem Fall für kurzfristige Optionen zu tun, die zwischen Ablauf und "heute" möglicherweise nur eine Dividende haben?

Antwort

1

In diesem Fall kann es sinnvoll sein, eine flache Kurve basierend auf dem einzelnen Wert zu verwenden, den Sie haben.

boost::shared_ptr<YieldTermStructure> 
bootstrapDividendCurveDB() 
{ 
... 
if (just one dividend) 
    return boost::make_shared<FlatForward>(evalDate, single_dividend, 
              ActualActual()); 
else 
    return boost::make_shared<ZeroCurve>(ddy.exDivDates, ddy.dividendYields, 
             ActualActual(), calendar)); 
} 

Ein Hinweis: Ihre Fabrik Funktion wird so etwas wie, wenn Sie es wie oben zu bauen, das Referenzdatum für die ZeroCurve wird das erste Datum in dem exDivDate Vektor sein, nicht das Auswertungsdatum. Wenn das nicht das ist, was Sie wollten, müssen Sie das Bewertungsdatum vor dem Datumsvektor und eine weitere Dividende (möglicherweise eine Kopie des ersten) vor dem Kursvektor hinzufügen.

+0

Danke. Das funktioniert. Ich bin etwas verwirrt von deiner "A-Note". Willst du damit sagen, dass das, was ich zurückgebe, nicht das Ex-Div-Datum sein sollte, sondern das Eval-Datum (heute)? Ich bin mir nicht sicher, warum die Vorsicht geboten ist. – Ivan

+0

Ich meine, dass die Kurve beim ersten Datum im 'ddy.exDivDates'-Vektor beginnt und eine Ausnahme auslöst, wenn nach einer Rate vor diesem Datum gefragt wird. –

+0

Gotcha. Vielen Dank. – Ivan

Verwandte Themen