From 1da53fd008a8c9cef21935e76dd6c6df7737644f Mon Sep 17 00:00:00 2001 From: Lakshmi Krishnamurthy Date: Sat, 23 Dec 2023 07:41:59 -0500 Subject: [PATCH] Features: Bug Fixes/Re-organization: - State Non-linear Flat Forward Discount Curve - Set Flat Value (1, 2) - State Non-linear Flat Forward Curve #1 (3, 4) - State Non-linear Flat Forward Curve #2 (5, 6) - State Non-linear Flat Forward Curve - Constructor (7, 8, 9) - State Non-linear Flat Forward Curve - Jack D Forward D Manifest Measure (10) - State Non-linear Flat Forward FX Curve #1 (11, 12) - State Non-linear Flat Forward FX Curve - Date Array (13) - State Non-linear Flat Forward FX Curve #2 (14) - State Non-linear Flat Forward FX Curve - Spot (15) - State Non-linear Flat Forward FX Curve - Node Basis (16, 17, 18) - State Non-linear Flat Forward FX Curve - Constructor (19, 20, 21) - State Non-linear Flat Forward FX Curve #3 (22, 23, 24) - State Non-linear Flat Forward FX Curve - Zero Basis (25, 26, 27) - State Non-linear Flat Forward FX Curve - Implied Node Rates (28, 29, 30) - State Non-linear Flat Forward FX Curve - Bootstrap Basis (31, 32, 33) - State Non-linear Flat Forward FX Curve - Bootstrap Basis Discount (34, 35, 36) - State Non-linear Flat Forward FX Curve - Rate (37, 38, 39) - State Non-linear Flat Forward FX Curve - Jack D Forward D Manifest Measure (40) - State Non-linear Flat Forward FX Curve - Set Node Value (41, 42, 43) - State Non-linear Flat Forward FX Curve - Bump Node Value (44, 45, 46) - State Non-linear Flat Forward FX Curve - Set Value (47, 48, 49) - State Non-linear Flat Forward Govvie Curve (50, 51) - State Non-linear Flat Forward Govvie Curve - Date Array (52) - State Non-linear Flat Forward Govvie Curve - Yield Array (53) - State Non-linear Flat Forward Govvie Curve - Yield Fraction (54, 55, 56) - State Non-linear Flat Forward Govvie Curve - Constructor (57, 58, 59) - State Non-linear Flat Forward Govvie Curve - Yld (60) Samples: IdeaDRIP: --- ReleaseNotes/02_09_2023.txt | 37 ++ ScheduleSheet.xlsx | Bin 48703 -> 48717 bytes .../nonlinear/FlatForwardDiscountCurve.java | 8 +- .../state/nonlinear/FlatForwardFXCurve.java | 396 +++++++++++------- .../nonlinear/FlatForwardForwardCurve.java | 70 ++-- .../nonlinear/FlatForwardGovvieCurve.java | 147 ++++--- 6 files changed, 412 insertions(+), 246 deletions(-) create mode 100644 ReleaseNotes/02_09_2023.txt diff --git a/ReleaseNotes/02_09_2023.txt b/ReleaseNotes/02_09_2023.txt new file mode 100644 index 000000000000..c8ac5f965ef2 --- /dev/null +++ b/ReleaseNotes/02_09_2023.txt @@ -0,0 +1,37 @@ + +Features: + +Bug Fixes/Re-organization: + + - State Non-linear Flat Forward Discount Curve - Set Flat Value (1, 2) + - State Non-linear Flat Forward Curve #1 (3, 4) + - State Non-linear Flat Forward Curve #2 (5, 6) + - State Non-linear Flat Forward Curve - Constructor (7, 8, 9) + - State Non-linear Flat Forward Curve - Jack D Forward D Manifest Measure (10) + - State Non-linear Flat Forward FX Curve #1 (11, 12) + - State Non-linear Flat Forward FX Curve - Date Array (13) + - State Non-linear Flat Forward FX Curve #2 (14) + - State Non-linear Flat Forward FX Curve - Spot (15) + - State Non-linear Flat Forward FX Curve - Node Basis (16, 17, 18) + - State Non-linear Flat Forward FX Curve - Constructor (19, 20, 21) + - State Non-linear Flat Forward FX Curve #3 (22, 23, 24) + - State Non-linear Flat Forward FX Curve - Zero Basis (25, 26, 27) + - State Non-linear Flat Forward FX Curve - Implied Node Rates (28, 29, 30) + - State Non-linear Flat Forward FX Curve - Bootstrap Basis (31, 32, 33) + - State Non-linear Flat Forward FX Curve - Bootstrap Basis Discount (34, 35, 36) + - State Non-linear Flat Forward FX Curve - Rate (37, 38, 39) + - State Non-linear Flat Forward FX Curve - Jack D Forward D Manifest Measure (40) + - State Non-linear Flat Forward FX Curve - Set Node Value (41, 42, 43) + - State Non-linear Flat Forward FX Curve - Bump Node Value (44, 45, 46) + - State Non-linear Flat Forward FX Curve - Set Value (47, 48, 49) + - State Non-linear Flat Forward Govvie Curve (50, 51) + - State Non-linear Flat Forward Govvie Curve - Date Array (52) + - State Non-linear Flat Forward Govvie Curve - Yield Array (53) + - State Non-linear Flat Forward Govvie Curve - Yield Fraction (54, 55, 56) + - State Non-linear Flat Forward Govvie Curve - Constructor (57, 58, 59) + - State Non-linear Flat Forward Govvie Curve - Yld (60) + + +Samples: + +IdeaDRIP: diff --git a/ScheduleSheet.xlsx b/ScheduleSheet.xlsx index 06563307c053e94d2a2b06bd557fb47d8609613d..b7defce962da3059a43b441a7c99f71f2e14715a 100644 GIT binary patch delta 2769 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 X6#{i2R-=4k3_;P(cD3Qnw-2 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 manages the Volatility Latent State, using the Forward FX as the State Response * Representation. * - *

- * - *

+ *
+ * + * + * + * + * + * + * + *
Module Product Core Module
Library Fixed Income Analytics
Project Latent State Inference and Creation Utilities
Package Nonlinear (i.e., Boot) Latent State Construction
* * @author Lakshmi Krishnamurthy */ -public class FlatForwardFXCurve extends org.drip.state.fx.ExplicitBootFXCurve { - private int[] _aiPillarDate = null; - private double[] _adblFXForward = null; - private double _dblFXSpot = java.lang.Double.NaN; +public class FlatForwardFXCurve extends ExplicitBootFXCurve +{ + private int[] _dateArray = null; + private double _fxSpot = Double.NaN; + private double[] _fxForwardArray = null; private double nodeBasis ( - final int iNodeDate, - final org.drip.param.valuation.ValuationParams valParam, - final org.drip.state.discount.MergedDiscountForwardCurve dcNum, - final org.drip.state.discount.MergedDiscountForwardCurve dcDenom, - final boolean bBasisOnDenom) - throws java.lang.Exception + final int nodeDate, + final ValuationParams valuationParams, + final MergedDiscountForwardCurve numeratorDiscountCurve, + final MergedDiscountForwardCurve denominatorDiscountCurve, + final boolean basisOnDenominator) + throws Exception { - return new org.drip.product.fx.FXForwardComponent ("FXFWD_" + - org.drip.service.common.StringUtil.GUID(), currencyPair(), epoch().julian(), iNodeDate, 1., - null).discountCurveBasis (valParam, dcNum, dcDenom, _dblFXSpot, fx (iNodeDate), - bBasisOnDenom); + return new FXForwardComponent ( + "FXFWD_" + StringUtil.GUID(), + currencyPair(), + epoch().julian(), + nodeDate, + 1., + null + ).discountCurveBasis ( + valuationParams, + numeratorDiscountCurve, + denominatorDiscountCurve, + _fxSpot, + fx (nodeDate), + basisOnDenominator + ); } /** * FlatForwardVolatilityCurve Constructor * - * @param iEpochDate Epoch Date - * @param cp Currency Pair - * @param dblFXSpot FX Spot - * @param aiPillarDate Array of the Pillar Dates - * @param adblFXForward Array of the corresponding FX Forward Nodes + * @param epochDate Epoch Date + * @param currencyPair Currency Pair + * @param fxSpot FX Spot + * @param dateArray Array of the Pillar Dates + * @param fxForwardArray Array of the corresponding FX Forward Nodes * - * @throws java.lang.Exception Thrown if the Inputs are Invalid + * @throws Exception Thrown if the Inputs are Invalid */ public FlatForwardFXCurve ( - final int iEpochDate, - final org.drip.product.params.CurrencyPair cp, - final double dblFXSpot, - final int[] aiPillarDate, - final double[] adblFXForward) - throws java.lang.Exception + final int epochDate, + final CurrencyPair currencyPair, + final double fxSpot, + final int[] dateArray, + final double[] fxForwardArray) + throws Exception { - super (iEpochDate, cp); + super (epochDate, currencyPair); - if (!org.drip.numerical.common.NumberUtil.IsValid (_dblFXSpot = dblFXSpot) || null == (_aiPillarDate = - aiPillarDate) || null == (_adblFXForward = adblFXForward) || _aiPillarDate.length != - _adblFXForward.length) - throw new java.lang.Exception ("FlatForwardFXCurve ctr => Invalid Inputs"); + if (!NumberUtil.IsValid (_fxSpot = fxSpot) || null == (_dateArray = dateArray) || + null == (_fxForwardArray = fxForwardArray) || _dateArray.length != _fxForwardArray.length) { + throw new Exception ("FlatForwardFXCurve ctr => Invalid Inputs"); + } - int iNumPillar = _aiPillarDate.length; + int dateArrayCount = _dateArray.length; - for (int i = 0; i < iNumPillar; ++i) { - if (!org.drip.numerical.common.NumberUtil.IsValid (_adblFXForward[i])) - throw new java.lang.Exception ("FlatForwardFXCurve ctr => Invalid Inputs"); + for (int i = 0; i < dateArrayCount; ++i) { + if (!NumberUtil.IsValid (_fxForwardArray[i])) { + throw new Exception ("FlatForwardFXCurve ctr => Invalid Inputs"); + } } } @Override public double fx ( - final int iDate) - throws java.lang.Exception + final int date) + throws Exception { - if (iDate <= _iEpochDate) return _adblFXForward[0]; + if (date <= _iEpochDate) { + return _fxForwardArray[0]; + } - int iNumPillar = _adblFXForward.length; + int fxForwardArrayCount = _fxForwardArray.length; - for (int i = 1; i < iNumPillar; ++i) { - if (_aiPillarDate[i - 1] <= iDate && _aiPillarDate[i] > iDate) return _adblFXForward[i]; + for (int i = 1; i < fxForwardArrayCount; ++i) { + if (_dateArray[i - 1] <= date && _dateArray[i] > date) { + return _fxForwardArray[i]; + } } - return _adblFXForward[iNumPillar - 1]; + return _fxForwardArray[fxForwardArrayCount - 1]; } /** @@ -173,130 +209,169 @@ public FlatForwardFXCurve ( public double fxSpot() { - return _dblFXSpot; + return _fxSpot; } @Override public double[] zeroBasis ( - final int[] aiDateNode, - final org.drip.param.valuation.ValuationParams valParams, - final org.drip.state.discount.MergedDiscountForwardCurve dcNum, - final org.drip.state.discount.MergedDiscountForwardCurve dcDenom, - final boolean bBasisOnDenom) + final int[] dateNodeArray, + final ValuationParams valuationParams, + final MergedDiscountForwardCurve numeratorDiscountCurve, + final MergedDiscountForwardCurve denominatorDiscountCurve, + final boolean basisOnDenominator) { - if (null == aiDateNode) return null; + if (null == dateNodeArray) { + return null; + } - int iNumBasis = aiDateNode.length; - double[] adblBasis = new double[iNumBasis]; + int dateNodeCount = dateNodeArray.length; + double[] basisArray = new double[dateNodeCount]; - if (0 == iNumBasis) return null; + if (0 == dateNodeCount) return null; - for (int i = 0; i < iNumBasis; ++i) { + for (int i = 0; i < dateNodeCount; ++i) { try { - adblBasis[i] = nodeBasis (aiDateNode[i], valParams, dcNum, dcDenom, bBasisOnDenom); - } catch (java.lang.Exception e) { + basisArray[i] = nodeBasis ( + dateNodeArray[i], + valuationParams, + numeratorDiscountCurve, + denominatorDiscountCurve, + basisOnDenominator + ); + } catch (Exception e) { e.printStackTrace(); return null; } } - return adblBasis; + return basisArray; } @Override public double[] impliedNodeRates ( - final int[] aiDateNode, - final org.drip.param.valuation.ValuationParams valParams, - final org.drip.state.discount.MergedDiscountForwardCurve dcNum, - final org.drip.state.discount.MergedDiscountForwardCurve dcDenom, - final boolean bBasisOnDenom) + final int[] dateNodeArray, + final ValuationParams valuationParams, + final MergedDiscountForwardCurve numeratorDiscountCurve, + final MergedDiscountForwardCurve denominatorDiscountCurve, + final boolean basisOnDenominator) { - if (null == aiDateNode) return null; + if (null == dateNodeArray) { + return null; + } - int iNumBasis = aiDateNode.length; - double[] adblImpliedNodeRate = new double[iNumBasis]; + int dateNodeCount = dateNodeArray.length; + double[] impliedNodeRateArray = new double[dateNodeCount]; - if (0 == iNumBasis) return null; + if (0 == dateNodeCount) { + return null; + } - for (int i = 0; i < iNumBasis; ++i) { + for (int dateNodeIndex = 0; dateNodeIndex < dateNodeCount; ++dateNodeIndex) { try { - double dblBaseImpliedRate = java.lang.Double.NaN; - - if (bBasisOnDenom) - dblBaseImpliedRate = dcNum.zero (aiDateNode[i]); - else - dblBaseImpliedRate = dcDenom.zero (aiDateNode[i]); - - adblImpliedNodeRate[i] = dblBaseImpliedRate + nodeBasis (i, valParams, dcNum, dcDenom, - bBasisOnDenom); - } catch (java.lang.Exception e) { + impliedNodeRateArray[dateNodeIndex] = ( + basisOnDenominator ? numeratorDiscountCurve.zero (dateNodeArray[dateNodeIndex]) : + denominatorDiscountCurve.zero (dateNodeArray[dateNodeIndex]) + ) + nodeBasis ( + dateNodeIndex, + valuationParams, + numeratorDiscountCurve, + denominatorDiscountCurve, + basisOnDenominator + ); + } catch (Exception e) { e.printStackTrace(); } } - return adblImpliedNodeRate; + return impliedNodeRateArray; } @Override public double[] bootstrapBasis ( - final int[] aiDateNode, - final org.drip.param.valuation.ValuationParams valParams, - final org.drip.state.discount.MergedDiscountForwardCurve dcNum, - final org.drip.state.discount.MergedDiscountForwardCurve dcDenom, - final boolean bBasisOnDenom) + final int[] dateNodeArray, + final ValuationParams valuationParams, + final MergedDiscountForwardCurve numeratorDiscountCurve, + final MergedDiscountForwardCurve denominatorDiscountCurve, + final boolean basisOnDenominator) { - if (null == aiDateNode) return null; + if (null == dateNodeArray) { + return null; + } - int iNumBasis = aiDateNode.length; - double[] adblBasis = new double[iNumBasis]; - org.drip.state.discount.MergedDiscountForwardCurve dcBasis = bBasisOnDenom ? dcDenom : dcNum; + int dateNodeCount = dateNodeArray.length; + double[] basisArray = new double[dateNodeCount]; + MergedDiscountForwardCurve basisDiscountCurve = basisOnDenominator ? + denominatorDiscountCurve : numeratorDiscountCurve; - if (0 == iNumBasis || null == dcBasis) return null; + if (0 == dateNodeCount || null == basisDiscountCurve) { + return null; + } - for (int i = 0; i < iNumBasis; ++i) { + for (int dateNodeIndex = 0; dateNodeIndex < dateNodeCount; ++dateNodeIndex) { try { - if (bBasisOnDenom) - adblBasis[i] = nodeBasis (aiDateNode[i], valParams, dcNum, dcBasis, true); - else - adblBasis[i] = nodeBasis (aiDateNode[i], valParams, dcBasis, dcDenom, false); - } catch (java.lang.Exception e) { + basisArray[dateNodeIndex] = nodeBasis ( + dateNodeArray[dateNodeIndex], + valuationParams, + basisOnDenominator ? numeratorDiscountCurve : basisDiscountCurve, + basisOnDenominator ? basisDiscountCurve : denominatorDiscountCurve, + true + ); + } catch (Exception e) { e.printStackTrace(); return null; } } - return adblBasis; + return basisArray; } - @Override public org.drip.state.discount.MergedDiscountForwardCurve bootstrapBasisDC ( - final int[] aiDateNode, - final org.drip.param.valuation.ValuationParams valParams, - final org.drip.state.discount.MergedDiscountForwardCurve dcNum, - final org.drip.state.discount.MergedDiscountForwardCurve dcDenom, - final boolean bBasisOnDenom) + @Override public MergedDiscountForwardCurve bootstrapBasisDC ( + final int[] dateNodeArray, + final ValuationParams valuationParams, + final MergedDiscountForwardCurve numeratorDiscountCurve, + final MergedDiscountForwardCurve denominatorDiscountCurve, + final boolean basisOnDenominator) { - double[] adblImpliedRate = impliedNodeRates (aiDateNode, valParams, dcNum, dcDenom, bBasisOnDenom); - - if (null == adblImpliedRate) return null; + double[] impliedRateArray = impliedNodeRates ( + dateNodeArray, + valuationParams, + numeratorDiscountCurve, + denominatorDiscountCurve, + basisOnDenominator + ); + + if (null == impliedRateArray) { + return null; + } - int iNumDF = adblImpliedRate.length; - double[] adblDF = new double[iNumDF]; - org.drip.state.discount.MergedDiscountForwardCurve dc = bBasisOnDenom ? dcDenom : dcNum; + int discountFactorCount = impliedRateArray.length; + double[] discountFactorArray = new double[discountFactorCount]; + MergedDiscountForwardCurve discountCurve = basisOnDenominator ? + denominatorDiscountCurve : numeratorDiscountCurve; - if (0 == iNumDF) return null; + if (0 == discountFactorCount) { + return null; + } - int iSpotDate = valParams.valueDate(); + int spotDate = valuationParams.valueDate(); - java.lang.String strCurrency = dc.currency(); + String currency = discountCurve.currency(); - for (int i = 0; i < iNumDF; ++i) - adblDF[i] = java.lang.Math.exp (-1. * adblImpliedRate[i] * (aiDateNode[i] - iSpotDate) / - 365.25); + for (int discountFactorIndex = 0; discountFactorIndex < discountFactorCount; ++discountFactorIndex) { + discountFactorArray[discountFactorIndex] = Math.exp ( + -1. * impliedRateArray[discountFactorIndex] * (dateNodeArray[discountFactorIndex] - spotDate) + / 365.25 + ); + } try { - return org.drip.state.creator.ScenarioDiscountCurveBuilder.CubicPolynomialDiscountCurve - (strCurrency + "::BASIS", new org.drip.analytics.date.JulianDate (iSpotDate), strCurrency, - aiDateNode, adblDF); - } catch (java.lang.Exception e) { + return ScenarioDiscountCurveBuilder.CubicPolynomialDiscountCurve ( + currency + "::BASIS", + new JulianDate (spotDate), + currency, + dateNodeArray, + discountFactorArray + ); + } catch (Exception e) { e.printStackTrace(); } @@ -304,63 +379,76 @@ public double fxSpot() } @Override public double rate ( - final int[] aiDateNode, - final org.drip.param.valuation.ValuationParams valParams, - final org.drip.state.discount.MergedDiscountForwardCurve dcNum, - final org.drip.state.discount.MergedDiscountForwardCurve dcDenom, - final int iDate, - final boolean bBasisOnDenom) - throws java.lang.Exception + final int[] dateNodeArray, + final ValuationParams valuationParams, + final MergedDiscountForwardCurve numeratorDiscountCurve, + final MergedDiscountForwardCurve denominatorDiscountCurve, + final int date, + final boolean basisOnDenominator) + throws Exception { - org.drip.state.discount.MergedDiscountForwardCurve dcImplied = bootstrapBasisDC (aiDateNode, valParams, dcNum, - dcDenom, bBasisOnDenom); - - if (null == dcImplied) - throw new java.lang.Exception ("BasisSplineFXForward::rate: Cannot imply basis DC!"); + MergedDiscountForwardCurve impliedDiscountCurve = bootstrapBasisDC ( + dateNodeArray, + valuationParams, + numeratorDiscountCurve, + denominatorDiscountCurve, + basisOnDenominator + ); + + if (null == impliedDiscountCurve) { + throw new Exception ("BasisSplineFXForward::rate: Cannot imply basis DC!"); + } - return dcImplied.zero (iDate); + return impliedDiscountCurve.zero (date); } - @Override public org.drip.numerical.differentiation.WengertJacobian jackDForwardDManifestMeasure ( - final java.lang.String strManifestMeasure, - final int iDate) + @Override public WengertJacobian jackDForwardDManifestMeasure ( + final String manifestMeasure, + final int date) { return null; } @Override public boolean setNodeValue ( - final int iNodeIndex, - final double dblValue) + final int nodeIndex, + final double value) { - if (!org.drip.numerical.common.NumberUtil.IsValid (dblValue) || iNodeIndex > _adblFXForward.length) + if (!NumberUtil.IsValid (value) || nodeIndex > _fxForwardArray.length) { return false; + } - for (int i = iNodeIndex; i < _adblFXForward.length; ++i) - _adblFXForward[i] = dblValue; + for (int fxForwardIndex = nodeIndex; fxForwardIndex < _fxForwardArray.length; ++fxForwardIndex) { + _fxForwardArray[fxForwardIndex] = value; + } return true; } @Override public boolean bumpNodeValue ( - final int iNodeIndex, - final double dblValue) + final int nodeIndex, + final double value) { - if (!org.drip.numerical.common.NumberUtil.IsValid (dblValue) || iNodeIndex > _adblFXForward.length) + if (!NumberUtil.IsValid (value) || nodeIndex > _fxForwardArray.length) { return false; + } - for (int i = iNodeIndex; i < _adblFXForward.length; ++i) - _adblFXForward[i] += dblValue; + for (int fxForwardIndex = nodeIndex; fxForwardIndex < _fxForwardArray.length; ++fxForwardIndex) { + _fxForwardArray[fxForwardIndex] += value; + } return true; } @Override public boolean setFlatValue ( - final double dblValue) + final double value) { - if (!org.drip.numerical.common.NumberUtil.IsValid (dblValue)) return false; + if (!NumberUtil.IsValid (value)) { + return false; + } - for (int i = 0; i < _adblFXForward.length; ++i) - _adblFXForward[i] = dblValue; + for (int fxForwardIndex = 0; fxForwardIndex < _fxForwardArray.length; ++fxForwardIndex) { + _fxForwardArray[fxForwardIndex] = value; + } return true; } diff --git a/src/main/java/org/drip/state/nonlinear/FlatForwardForwardCurve.java b/src/main/java/org/drip/state/nonlinear/FlatForwardForwardCurve.java index 27f1c1385194..4fdd2d79154e 100644 --- a/src/main/java/org/drip/state/nonlinear/FlatForwardForwardCurve.java +++ b/src/main/java/org/drip/state/nonlinear/FlatForwardForwardCurve.java @@ -1,11 +1,20 @@ package org.drip.state.nonlinear; +import org.drip.analytics.date.JulianDate; +import org.drip.numerical.common.NumberUtil; +import org.drip.numerical.differentiation.WengertJacobian; +import org.drip.state.forward.ForwardCurve; +import org.drip.state.identifier.ForwardLabel; + /* * -*- mode: java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /*! + * Copyright (C) 2025 Lakshmi Krishnamurthy + * Copyright (C) 2024 Lakshmi Krishnamurthy + * Copyright (C) 2023 Lakshmi Krishnamurthy * Copyright (C) 2022 Lakshmi Krishnamurthy * Copyright (C) 2021 Lakshmi Krishnamurthy * Copyright (C) 2020 Lakshmi Krishnamurthy @@ -85,53 +94,60 @@ /** * FlatForwardForwardCurve contains an implementation of the flat forward rate forward curve. * - *

- * - *

+ *
+ * + * + * + * + * + * + * + *
Module Product Core Module
Library Fixed Income Analytics
Project Latent State Inference and Creation Utilities
Package Nonlinear (i.e., Boot) Latent State Construction
* * @author Lakshmi Krishnamurthy */ -public class FlatForwardForwardCurve extends org.drip.state.forward.ForwardCurve { - private double _dblFlatForwardRate = java.lang.Double.NaN; +public class FlatForwardForwardCurve extends ForwardCurve +{ + private double _flatForwardRate = Double.NaN; /** * FlatForwardForwardCurve constructor * - * @param dtEpoch The Forward Curve Epoch Date - * @param fri The Floating Rate Index - * @param dblFlatForwardRate The Flat FOrward Rate + * @param epochDate The Forward Curve Epoch Date + * @param forwardLabel The Floating Rate Index Forward Label + * @param flatForwardRate The Flat FOrward Rate * - * @throws java.lang.Exception Thrown if the Inputs are Invalid + * @throws Exception Thrown if the Inputs are Invalid */ public FlatForwardForwardCurve ( - final org.drip.analytics.date.JulianDate dtEpoch, - final org.drip.state.identifier.ForwardLabel fri, - final double dblFlatForwardRate) - throws java.lang.Exception + final JulianDate epochDate, + final ForwardLabel forwardLabel, + final double flatForwardRate) + throws Exception { - super (dtEpoch.julian(), fri); + super (epochDate.julian(), forwardLabel); - if (!org.drip.numerical.common.NumberUtil.IsValid (_dblFlatForwardRate = dblFlatForwardRate)) - throw new java.lang.Exception ("FlatForwardForwardCurve ctr: Invalid Inputs"); + if (!NumberUtil.IsValid (_flatForwardRate = flatForwardRate)) { + throw new Exception ("FlatForwardForwardCurve ctr: Invalid Inputs"); + } } @Override public double forward ( - final int iDate) - throws java.lang.Exception + final int date) + throws Exception { - return _dblFlatForwardRate; + return _flatForwardRate; } - @Override public org.drip.numerical.differentiation.WengertJacobian jackDForwardDManifestMeasure ( - final java.lang.String strManifestMeasure, - final int iDate) + @Override public WengertJacobian jackDForwardDManifestMeasure ( + final String manifestMeasure, + final int date) { return null; } diff --git a/src/main/java/org/drip/state/nonlinear/FlatForwardGovvieCurve.java b/src/main/java/org/drip/state/nonlinear/FlatForwardGovvieCurve.java index 58769843bbe4..1fb32eeaa236 100644 --- a/src/main/java/org/drip/state/nonlinear/FlatForwardGovvieCurve.java +++ b/src/main/java/org/drip/state/nonlinear/FlatForwardGovvieCurve.java @@ -1,11 +1,19 @@ package org.drip.state.nonlinear; +import org.drip.analytics.daycount.ActActDCParams; +import org.drip.analytics.daycount.Convention; +import org.drip.analytics.support.Helper; +import org.drip.state.govvie.ExplicitBootGovvieCurve; + /* * -*- mode: java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /*! + * Copyright (C) 2025 Lakshmi Krishnamurthy + * Copyright (C) 2024 Lakshmi Krishnamurthy + * Copyright (C) 2023 Lakshmi Krishnamurthy * Copyright (C) 2022 Lakshmi Krishnamurthy * Copyright (C) 2021 Lakshmi Krishnamurthy * Copyright (C) 2020 Lakshmi Krishnamurthy @@ -83,94 +91,109 @@ * FlatForwardGovvieCurve manages the Govvie Latent State, using the Flat Forward Rate as the State * Response Representation. * - *

- * - *

+ *
+ * + * + * + * + * + * + * + *
Module Product Core Module
Library Fixed Income Analytics
Project Latent State Inference and Creation Utilities
Package Nonlinear (i.e., Boot) Latent State Construction
* * @author Lakshmi Krishnamurthy */ -public class FlatForwardGovvieCurve extends org.drip.state.govvie.ExplicitBootGovvieCurve { - private int[] _aiDate = null; - private double[] _adblForwardYield = null; - - private double yearFract ( - final int iStartDate, - final int iEndDate, - final org.drip.analytics.daycount.ActActDCParams aap, - final java.lang.String strDayCount) - throws java.lang.Exception +public class FlatForwardGovvieCurve extends ExplicitBootGovvieCurve +{ + private int[] _dateArray = null; + private double[] _forwardYieldArray = null; + + private double yearFraction ( + final int startDate, + final int endDate, + final ActActDCParams actActDCParams, + final String dayCount) + throws Exception { - return org.drip.analytics.daycount.Convention.YearFraction (iStartDate, iEndDate, strDayCount, false, - aap, currency()); + return Convention.YearFraction (startDate, endDate, dayCount, false, actActDCParams, currency()); } /** * Construct a Govvie Curve from an Array of Dates and Flat Forward Yields * - * @param iEpochDate Epoch Date - * @param strTreasuryCode Treasury Code - * @param strCurrency Currency - * @param aiDate Array of Dates - * @param adblForwardYield Array of Forward Yields + * @param epochDate Epoch Date + * @param treasuryCode Treasury Code + * @param currency Currency + * @param dateArray Array of Dates + * @param forwardYieldArray Array of Forward Yields * - * @throws java.lang.Exception Thrown if the curve cannot be created + * @throws Exception Thrown if the curve cannot be created */ public FlatForwardGovvieCurve ( - final int iEpochDate, - final java.lang.String strTreasuryCode, - final java.lang.String strCurrency, - final int[] aiDate, - final double[] adblForwardYield) - throws java.lang.Exception + final int epochDate, + final String treasuryCode, + final String currency, + final int[] dateArray, + final double[] forwardYieldArray) + throws Exception { - super (iEpochDate, strTreasuryCode, strCurrency); + super (epochDate, treasuryCode, currency); - if (null == (_aiDate = aiDate) || null == (_adblForwardYield = adblForwardYield)) - throw new java.lang.Exception ("FlatForwardGovvieCurve Constructor => Invalid Inputs!"); + if (null == (_dateArray = dateArray) || null == (_forwardYieldArray = forwardYieldArray)) { + throw new Exception ("FlatForwardGovvieCurve Constructor => Invalid Inputs!"); + } - int iNumNode = _aiDate.length; + int nodeCount = _dateArray.length; - if (0 == iNumNode || iNumNode != _adblForwardYield.length) - throw new java.lang.Exception ("FlatForwardGovvieCurve Constructor => Invalid Inputs!"); + if (0 == nodeCount || nodeCount != _forwardYieldArray.length) { + throw new Exception ("FlatForwardGovvieCurve Constructor => Invalid Inputs!"); + } } @Override public double yld ( - final int iDate) - throws java.lang.Exception + final int date) + throws Exception { - if (iDate <= _iEpochDate) return 1.; + if (date <= _iEpochDate) { + return 1.; + } int i = 0; - double dblDF = 1.; - int iStartDate = _iEpochDate; - int iNumDate = _aiDate.length; + double discountFactor = 1.; + int startDate = _iEpochDate; + int dateArrayCount = _dateArray.length; - int iFreq = freq(); + int frequency = freq(); - java.lang.String strDayCount = dayCount(); + String dayCount = dayCount(); - org.drip.analytics.daycount.ActActDCParams aap = - org.drip.analytics.daycount.ActActDCParams.FromFrequency (iFreq); + ActActDCParams actActDCParams = ActActDCParams.FromFrequency (frequency); - while (i < iNumDate && (int) iDate >= (int) _aiDate[i]) { - dblDF *= java.lang.Math.pow (1. + (_adblForwardYield[i] / iFreq), -1. * yearFract (iStartDate, - _aiDate[i], aap, strDayCount) * iFreq); + while (i < dateArrayCount && (int) date >= (int) _dateArray[i]) { + discountFactor *= Math.pow ( + 1. + (_forwardYieldArray[i] / frequency), + -1. * yearFraction (startDate, _dateArray[i], actActDCParams, dayCount) * frequency + ); - iStartDate = _aiDate[i++]; + startDate = _dateArray[i++]; } - if (i >= iNumDate) i = iNumDate - 1; + if (i >= dateArrayCount) { + i = dateArrayCount - 1; + } - return org.drip.analytics.support.Helper.DF2Yield (iFreq, dblDF * java.lang.Math.pow (1. + - (_adblForwardYield[i] / iFreq), -1. * yearFract (iStartDate, iDate, aap, strDayCount) * iFreq), - yearFract (_iEpochDate, iDate, aap, strDayCount)); + return Helper.DF2Yield ( + frequency, + discountFactor * Math.pow (1. + (_forwardYieldArray[i] / frequency), + -1. * yearFraction (startDate, date, actActDCParams, dayCount) * frequency), + yearFraction (_iEpochDate, date, actActDCParams, dayCount) + ); } @Override public boolean setNodeValue ( @@ -179,12 +202,12 @@ public FlatForwardGovvieCurve ( { if (!org.drip.numerical.common.NumberUtil.IsValid (dblValue)) return false; - int iNumDate = _aiDate.length; + int iNumDate = _dateArray.length; if (iNodeIndex > iNumDate) return false; for (int i = iNodeIndex; i < iNumDate; ++i) - _adblForwardYield[i] = dblValue; + _forwardYieldArray[i] = dblValue; return true; } @@ -195,12 +218,12 @@ public FlatForwardGovvieCurve ( { if (!org.drip.numerical.common.NumberUtil.IsValid (dblValue)) return false; - int iNumDate = _aiDate.length; + int iNumDate = _dateArray.length; if (iNodeIndex > iNumDate) return false; for (int i = iNodeIndex; i < iNumDate; ++i) - _adblForwardYield[i] += dblValue; + _forwardYieldArray[i] += dblValue; return true; } @@ -210,10 +233,10 @@ public FlatForwardGovvieCurve ( { if (!org.drip.numerical.common.NumberUtil.IsValid (dblValue)) return false; - int iNumDate = _aiDate.length; + int iNumDate = _dateArray.length; for (int i = 0; i < iNumDate; ++i) - _adblForwardYield[i] = dblValue; + _forwardYieldArray[i] = dblValue; return true; }