diff --git a/ReleaseNotes/02_09_2023.txt b/ReleaseNotes/02_09_2023.txt new file mode 100644 index 00000000000..c8ac5f965ef --- /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 06563307c05..b7defce962d 100644 Binary files a/ScheduleSheet.xlsx and b/ScheduleSheet.xlsx differ diff --git a/src/main/java/org/drip/state/nonlinear/FlatForwardDiscountCurve.java b/src/main/java/org/drip/state/nonlinear/FlatForwardDiscountCurve.java index f851efc89f6..8e983e63985 100644 --- a/src/main/java/org/drip/state/nonlinear/FlatForwardDiscountCurve.java +++ b/src/main/java/org/drip/state/nonlinear/FlatForwardDiscountCurve.java @@ -694,12 +694,14 @@ public String compoundingDayCount() } @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 < _forwardRateArray.length; ++i) - _forwardRateArray[i] = dblValue; + _forwardRateArray[i] = value; return true; } diff --git a/src/main/java/org/drip/state/nonlinear/FlatForwardFXCurve.java b/src/main/java/org/drip/state/nonlinear/FlatForwardFXCurve.java index e7f110bc914..38349558c17 100644 --- a/src/main/java/org/drip/state/nonlinear/FlatForwardFXCurve.java +++ b/src/main/java/org/drip/state/nonlinear/FlatForwardFXCurve.java @@ -1,11 +1,25 @@ 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.param.valuation.ValuationParams; +import org.drip.product.fx.FXForwardComponent; +import org.drip.product.params.CurrencyPair; +import org.drip.service.common.StringUtil; +import org.drip.state.creator.ScenarioDiscountCurveBuilder; +import org.drip.state.discount.MergedDiscountForwardCurve; +import org.drip.state.fx.ExplicitBootFXCurve; + /* * -*- 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 @@ -84,85 +98,107 @@ * FlatForwardFXCurve 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 27f1c138519..4fdd2d79154 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 58769843bbe..1fb32eeaa23 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; }