// Composition - forward part in non-cutoff period; past/valuation date case dealt with in previous methods internal double compositionFactorNonCutoff() { if (!nextFixing.isAfter(lastFixingNonCutoff)) { OvernightIndexObservation obs = computation.observeOn(nextFixing); LocalDate startDate = obs.EffectiveDate; LocalDate endDate = computation.calculateMaturityFromFixing(lastFixingNonCutoff); double accrualFactor = dayCount.yearFraction(startDate, endDate); double rate = rates.periodRate(obs, endDate); return(1.0d + accrualFactor * rate); } return(1.0d); }
// Compute the accrued interest on a given period by approximation private static double approximatedInterest(OvernightIndexObservation observation, LocalDate endDate, OvernightIndexRates rates) { DayCount dayCount = observation.Index.DayCount; double remainingFixingAccrualFactor = dayCount.yearFraction(observation.EffectiveDate, endDate); double forwardRate = rates.periodRate(observation, endDate); return(Math.Log(1.0 + forwardRate * remainingFixingAccrualFactor)); }
// Compute the accrued interest sensitivity on a given period by approximation private static PointSensitivityBuilder approximatedInterestSensitivity(OvernightIndexObservation observation, LocalDate endDate, OvernightIndexRates rates) { DayCount dayCount = observation.Index.DayCount; double remainingFixingAccrualFactor = dayCount.yearFraction(observation.EffectiveDate, endDate); double forwardRate = rates.periodRate(observation, endDate); PointSensitivityBuilder forwardRateSensitivity = rates.periodRatePointSensitivity(observation, endDate); double rateExp = 1.0 + forwardRate * remainingFixingAccrualFactor; forwardRateSensitivity = forwardRateSensitivity.multipliedBy(remainingFixingAccrualFactor / rateExp); return(forwardRateSensitivity); }