Fix American call approximations with negative risk-free rates - #2728
Open
mkzung wants to merge 1 commit into
Open
Fix American call approximations with negative risk-free rates#2728mkzung wants to merge 1 commit into
mkzung wants to merge 1 commit into
Conversation
The Barone-Adesi-Whaley and Ju quadratic engines returned the European value for any call with a non-positive dividend yield. With a negative risk-free rate below that yield, early exercise of the call is optimal and the returned value falls below intrinsic. Require the dividend discount factor to be at least the risk-free one, as the Bjerksund-Stensland engine already does, so that these inputs reach the critical-price calculation and its negative-rate check.
|
Thanks for opening this pull request! It might take a while before we look at it, so don't worry if there seems to be no feedback. We'll get to it. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The defect
BaroneAdesiWhaleyApproximationEngineandJuQuadraticApproximationEnginereturn the Europeanvalue for any call whose dividend yield is not positive:
That is half of the condition. Early exercise of a call is never optimal when the underlying pays no
dividend and the rate is non-negative. With
r < q <= 0the discounted strike grows withmaturity, so exercising early is optimal, and both engines return a price below intrinsic.
S=100, K=80, r=-0.05, q=0, vol=0.03, T=3y, evaluation date 15 August 2026, Actual/360, intrinsic 20:
Equal to the European price to every digit, which pins the code path.
It is not one corner. Over a 9800-point grid of 7 strikes, 7 rates including 4 negative, 4 dividend
yields, 5 vols, 5 maturities and both types, BAW came back below intrinsic 153 times, every one a
call at a non-positive rate. Bjerksund-Stensland: 0.
The change
BjerksundStenslandApproximationEnginealready carries the right condition atbjerksundstenslandengine.cpp:470, so this uses the same one:Behaviour changes only for
r < q <= 0. Anything withr >= 0keeps its old path, sinceq <= 0and
r >= 0already givedividendDiscount >= 1 >= riskFreeDiscount.Those inputs now reach
BaroneAdesiWhaleyApproximationEngine::criticalPrice, which has rejectednegative rates since #1291. Puts and calls with positive dividends went there already; this closes
the path that did not.
Test
Extends
testBaroneAdesiWhaleyNegativeRates, added for #1291, which already covers a put and a callwith dividends. Ju is checked alongside because
juquadraticengine.cpp:105calls the samecriticalPrice, so it raises the same error.Reverting the two engines and keeping the test gives two failures,
americanoption.cpp:2315and:2320, bothexception Error expected but not raised.Validation
Complete suite 1440 test cases, no errors, 2 m 58 s, Release and C++20. On the 9800-point grid BAW
goes from 153 below intrinsic to 0, worst miss 40.00 to 0. Ju's negative-rate cases close with it,
153 to 0; its remaining 9 are at positive rates and are the approximation's own accuracy. Ju's 1097
NaNresults, all at exactlyr = 0, are a separate defect this does not touch.