@Override public double getCoupon( final double dblValueDate, final org.drip.param.definition.ComponentMarketParams mktParams) throws java.lang.Exception { if (!org.drip.quant.common.NumberUtil.IsValid(dblValueDate) || null == mktParams) throw new java.lang.Exception("FloatingStream::getCoupon => Invalid Inputs"); org.drip.analytics.period.Period currentPeriod = null; for (org.drip.analytics.period.CashflowPeriod period : _lsCouponPeriod) { if (null == period) continue; if (dblValueDate >= period.getStartDate() && dblValueDate < period.getEndDate()) { currentPeriod = period; break; } } if (null == currentPeriod) throw new java.lang.Exception("FloatingStream::getCoupon => Invalid Inputs"); java.util.Map< org.drip.analytics.date.JulianDate, org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double>> mapFixings = mktParams.getFixings(); if (null != mapFixings) { double dblCurrentResetDate = currentPeriod.getResetDate(); if (org.drip.quant.common.NumberUtil.IsValid(dblCurrentResetDate)) { org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> mapIndexFixing = mapFixings.get(new org.drip.analytics.date.JulianDate(dblCurrentResetDate)); if (null != mapIndexFixing) { java.lang.Double dblFixing = mapIndexFixing.get(_fri.fullyQualifiedName()); if (null != dblFixing) return dblFixing + _dblSpread; } } } org.drip.analytics.rates.DiscountCurve dc = mktParams.getDiscountCurve(); if (null == dc) throw new java.lang.Exception("FloatingStream::getCoupon => cant determine index"); return dc.libor(currentPeriod.getStartDate(), currentPeriod.getEndDate()) + _dblSpread; }
@Override public org.drip.quant.calculus.WengertJacobian calcQuoteDFMicroJack( final java.lang.String strQuote, final org.drip.param.valuation.ValuationParams valParams, final org.drip.param.pricer.PricerParams pricerParams, final org.drip.param.definition.ComponentMarketParams mktParams, final org.drip.param.valuation.QuotingParams quotingParams) { if (null == valParams || valParams.valueDate() >= _dblMaturity || null == strQuote || null == mktParams || null == mktParams.getDiscountCurve()) return null; if ("Rate".equalsIgnoreCase(strQuote) || "SwapRate".equalsIgnoreCase(strQuote)) { org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> mapMeasures = value(valParams, pricerParams, mktParams, quotingParams); if (null == mapMeasures) return null; double dblDirtyDV01 = mapMeasures.get("DirtyDV01"); double dblParSwapRate = mapMeasures.get("SwapRate"); try { org.drip.quant.calculus.WengertJacobian wjSwapRateDFMicroJack = null; org.drip.analytics.rates.DiscountCurve dc = mktParams.getDiscountCurve(); for (org.drip.analytics.period.CashflowPeriod p : _lsCouponPeriod) { double dblPeriodPayDate = p.getPayDate(); if (dblPeriodPayDate < valParams.valueDate()) continue; org.drip.quant.calculus.WengertJacobian wjPeriodFwdRateDF = dc.getForwardRateJack(p.getStartDate(), p.getEndDate()); org.drip.quant.calculus.WengertJacobian wjPeriodPayDFDF = dc.jackDDFDQuote(dblPeriodPayDate); if (null == wjPeriodFwdRateDF || null == wjPeriodPayDFDF) continue; double dblForwardRate = dc.libor(p.getStartDate(), p.getEndDate()); double dblPeriodPayDF = dc.df(dblPeriodPayDate); if (null == wjSwapRateDFMicroJack) wjSwapRateDFMicroJack = new org.drip.quant.calculus.WengertJacobian(1, wjPeriodFwdRateDF.numParameters()); double dblPeriodNotional = getNotional(p.getStartDate(), p.getEndDate()); double dblPeriodDCF = p.getCouponDCF(); for (int k = 0; k < wjPeriodFwdRateDF.numParameters(); ++k) { double dblPeriodMicroJack = (dblForwardRate - dblParSwapRate) * wjPeriodPayDFDF.getFirstDerivative(0, k) + dblPeriodPayDF * wjPeriodFwdRateDF.getFirstDerivative(0, k); if (!wjSwapRateDFMicroJack.accumulatePartialFirstDerivative( 0, k, dblPeriodNotional * dblPeriodDCF * dblPeriodMicroJack / dblDirtyDV01)) return null; } } return wjSwapRateDFMicroJack; } catch (java.lang.Exception e) { e.printStackTrace(); } } return null; }
@Override public org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> value( final org.drip.param.valuation.ValuationParams valParams, final org.drip.param.pricer.PricerParams pricerParams, final org.drip.param.definition.ComponentMarketParams mktParams, final org.drip.param.valuation.QuotingParams quotingParams) { if (null == valParams || null == mktParams) return null; org.drip.analytics.rates.DiscountCurve dc = mktParams.getDiscountCurve(); if (null == dc) return null; long lStart = System.nanoTime(); double dblFixing01 = 0.; double dblAccrued01 = 0.; double dblDirtyDV01 = 0.; boolean bFirstPeriod = true; double dblDirtyFloatingPV = 0.; double dblCashPayDF = java.lang.Double.NaN; double dblResetDate = java.lang.Double.NaN; double dblResetRate = java.lang.Double.NaN; java.lang.String strFRI = _fri.fullyQualifiedName(); org.drip.analytics.rates.ForwardRateEstimator fc = mktParams.getForwardCurve(); if (null != fc && !_fri.match(fc.index())) fc = null; for (org.drip.analytics.period.CashflowPeriod period : _lsCouponPeriod) { double dblFloatingRate = 0.; double dblDirtyPeriodDV01 = java.lang.Double.NaN; double dblPeriodPayDate = period.getPayDate(); if (dblPeriodPayDate < valParams.valueDate()) continue; if (null == fc) fc = dc.forwardRateEstimator(dblPeriodPayDate, _fri); try { if (bFirstPeriod) { bFirstPeriod = false; if (null == mktParams.getFixings() || null == mktParams .getFixings() .get(new org.drip.analytics.date.JulianDate(period.getResetDate())) || null == mktParams .getFixings() .get(new org.drip.analytics.date.JulianDate(period.getResetDate())) .get(strFRI)) dblResetRate = dblFloatingRate = null == fc ? dc.libor(_fri.tenor()) : fc.forward(period.getPayDate()); else dblResetRate = dblFloatingRate = mktParams .getFixings() .get(new org.drip.analytics.date.JulianDate(period.getResetDate())) .get(strFRI); dblFixing01 = period.getAccrualDCF(valParams.valueDate()) * 0.0001 * getNotional(period.getAccrualStartDate(), valParams.valueDate()); if (period.getStartDate() < valParams.valueDate()) dblAccrued01 = dblFixing01; dblResetDate = period.getResetDate(); } else dblFloatingRate = null == fc ? dc.libor(period.getStartDate(), period.getEndDate()) : fc.forward(period.getPayDate()); dblDirtyPeriodDV01 = 0.0001 * period.getCouponDCF() * mktParams.getDiscountCurve().df(dblPeriodPayDate) * getNotional(period.getAccrualStartDate(), period.getEndDate()); } catch (java.lang.Exception e) { e.printStackTrace(); return null; } if (s_bBlog) { try { System.out.println( new org.drip.analytics.date.JulianDate(period.getResetDate()) + " [" + new org.drip.analytics.date.JulianDate(period.getStartDate()) + "->" + new org.drip.analytics.date.JulianDate(period.getEndDate()) + "] => " + org.drip.quant.common.FormatUtil.FormatDouble(dblFloatingRate, 1, 4, 100.)); } catch (java.lang.Exception e) { e.printStackTrace(); } } dblDirtyDV01 += dblDirtyPeriodDV01; dblDirtyFloatingPV += dblDirtyPeriodDV01 * 10000. * dblFloatingRate; } try { double dblCashSettle = valParams.cashPayDate(); if (null != _settleParams) dblCashSettle = _settleParams.cashSettleDate(valParams.valueDate()); dblCashPayDF = mktParams.getDiscountCurve().df(dblCashSettle); } catch (java.lang.Exception e) { e.printStackTrace(); return null; } dblDirtyDV01 /= dblCashPayDF; dblDirtyFloatingPV /= dblCashPayDF; double dblCleanDV01 = dblDirtyDV01 - dblAccrued01; double dblCleanFloatingPV = dblDirtyFloatingPV - dblAccrued01 * (dblResetRate + _dblSpread); org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> mapResult = new org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double>(); mapResult.put("ResetDate", dblResetDate); mapResult.put("ResetRate", dblResetRate); mapResult.put("Accrued01", dblAccrued01 * _dblNotional); mapResult.put("Fixing01", dblFixing01 * _dblNotional); mapResult.put( "FloatAccrued", dblAccrued01 * 10000. * (dblResetRate + _dblSpread) * _dblNotional); mapResult.put("DV01", dblCleanDV01 * _dblNotional); mapResult.put("CleanDV01", dblCleanDV01 * _dblNotional); mapResult.put("DirtyDV01", dblDirtyDV01 * _dblNotional); mapResult.put("CleanFloatingPV", dblCleanFloatingPV * _dblNotional); mapResult.put("DirtyFloatingPV", dblDirtyFloatingPV * _dblNotional); mapResult.put("PV", dblCleanFloatingPV * _dblNotional); mapResult.put("CleanPV", dblCleanFloatingPV * _dblNotional); mapResult.put("DirtyPV", dblDirtyFloatingPV * _dblNotional); mapResult.put("Upfront", dblCleanFloatingPV * _dblNotional); mapResult.put("FairPremium", dblCleanFloatingPV / dblCleanDV01); mapResult.put("Rate", dblCleanFloatingPV / dblCleanDV01); mapResult.put("ParRate", dblCleanFloatingPV / dblCleanDV01); double dblValueNotional = java.lang.Double.NaN; try { dblValueNotional = getNotional(valParams.valueDate()); } catch (java.lang.Exception e) { e.printStackTrace(); } if (org.drip.quant.common.NumberUtil.IsValid(dblValueNotional)) { double dblPrice = 100. * (1. + (dblCleanFloatingPV / _dblNotional / dblValueNotional)); mapResult.put("Price", dblPrice); mapResult.put("CleanPrice", dblPrice); } mapResult.put("CalcTime", (System.nanoTime() - lStart) * 1.e-09); return mapResult; }