public NArray this[int timeIndex] { get { var t = _timePoints[timeIndex].YearsFromBaseDate; return(NMath.Exp(-ZeroRatesT0.GetValue(_timePoints[timeIndex].DateTime) * t) * _state[timeIndex]); } }
/// <summary> /// Calculates discount factor for payment at time t2 at the supplied simulation time index /// </summary> /// <param name="timeIndex"></param> /// <param name="t2"></param> /// <returns></returns> public NArray DiscountFactor(int timeIndex, DateTime t2) { var B = NArray.CreateScalar(0); var simulationT0 = _timePoints.First().DateTime; double tenor = IntervalInYears(_timePoints[timeIndex].DateTime, t2); for (int factorIndex = 0; factorIndex < _factors.Length; ++factorIndex) { B += Sigma(factorIndex) * E(Lambda(factorIndex), tenor) * _factorPaths[factorIndex][timeIndex]; } var lnDF0t2 = -ZeroRatesT0.GetValue(t2) * IntervalInYears(simulationT0, t2); var lnDF0t1 = -ZeroRatesT0.GetValue(_timePoints[timeIndex].DateTime) * _timePoints[timeIndex].YearsFromBaseDate; double drift = GetDrift(timeIndex, tenor); return(NMath.Exp(lnDF0t2 - lnDF0t1 - 0.5 * drift + B)); }
/// <summary> /// Calculate forward rate that applies between times t1 and t2 (t2 > t1) /// </summary> /// <param name="timeIndex"></param> /// <param name="t1"></param> /// <param name="t2"></param> /// <returns></returns> public NArray ForwardRate(int timeIndex, DateTime t1, DateTime t2) { var B = NArray.CreateScalar(0); var simulationT0 = _timePoints.First().DateTime; double tenor1 = IntervalInYears(_timePoints[timeIndex].DateTime, t1); double tenor2 = IntervalInYears(_timePoints[timeIndex].DateTime, t2); for (int factorIndex = 0; factorIndex < _factors.Length; ++factorIndex) { B += Sigma(factorIndex) * (E(Lambda(factorIndex), tenor1) - E(Lambda(factorIndex), tenor2)) * _factorPaths[factorIndex][timeIndex]; } var lnDF0t1 = -ZeroRatesT0.GetValue(t1) * IntervalInYears(simulationT0, t1); var lnDF0t2 = -ZeroRatesT0.GetValue(t2) * IntervalInYears(simulationT0, t2); double drift = GetDrift(timeIndex, tenor1) - GetDrift(timeIndex, tenor2); var dfRatio = NMath.Exp(lnDF0t1 - lnDF0t2 - 0.5 * drift + B); // df(t, t1) / df(t, t2) double alpha = IntervalInYears(t1, t2); return((dfRatio - 1) / alpha); }