public ResultStore GetResultStore() { var result = new ResultStore(); result.Add("maturityDate", maturityDate); result.Add("annualCouponRate", annualCouponRate); return(result); }
public static ResultStore GetRiskMeasures(this BesaJseBond bond, Date settleDate, double ytm) { var riskmeasures = new ResultStore(); riskmeasures.Add(Keys.Delta, bond.Delta(settleDate, ytm)); riskmeasures.Add(Keys.RandsPerPoint, bond.RandsPerPoint(settleDate, ytm)); riskmeasures.Add(Keys.Duration, bond.Duration(settleDate, ytm)); riskmeasures.Add(Keys.ModifiedDuration, bond.ModefiedDuration(settleDate, ytm)); riskmeasures.Add(Keys.Convexity, bond.Convexity(settleDate, ytm)); return(riskmeasures); }
/// <summary> /// /// </summary> /// <param name="bond"></param> /// <param name="settleDate"></param> /// <param name="ytm"></param> /// <returns></returns> public static ResultStore GetSpotMeasures(this BesaJseBond bond, Date settleDate, double ytm) { var spotmeasures = new ResultStore(); spotmeasures.Add(Keys.RoundedAip, bond.RoundedAIP(settleDate, ytm)); spotmeasures.Add(Keys.RoundedClean, bond.RoundedClean(settleDate, ytm)); spotmeasures.Add(Keys.UnroundedAip, bond.UnroundedAIP(settleDate, ytm)); spotmeasures.Add(Keys.UnroundedClean, bond.UnroundedClean(settleDate, ytm)); spotmeasures.Add(Keys.UnroundedAccrued, bond.UnroundedAccruedInterest(settleDate)); return(spotmeasures); }
/// <summary> /// Gets all the data that might be of interest after a simulation. /// </summary> /// <param name="portfolioIn">The portfolio in.</param> /// <param name="valueDate">The value date.</param> /// <param name="fwdValueDates">The forward value dates.</param> /// <returns></returns> public ResultStore GetValuePaths(Product[] portfolioIn, Date valueDate, Date[] fwdValueDates) { CalculateAll(portfolioIn, valueDate, fwdValueDates); ResultStore results = new ResultStore(); results.Add("regressedFwdsPVs", regressedValues); double[,] fwdCashflowPVs = new double[N, fwdValueDates.Count()]; for (int i = 0; i < fwdValueDates.Count(); i++) { fwdCashflowPVs.SetColumn(i, simulatedCFs.GetPathwisePV(fwdValueDates[i], originalTrades)); } results.Add("fwdCashflowPVs", fwdCashflowPVs); for (int regressorNumber = 0; regressorNumber < simulatedRegs.GetNumberOfRegressors(); regressorNumber++) { results.Add("regressor" + regressorNumber.ToString(), simulatedRegs.GetRegressors(regressorNumber, fwdValueDates)); } return(results); }
public static ResultStore InflationLinkedSwapMeasures(this InflationLinkedSwap inflationLinkedSwap, Date[] cpiDates, double[] cpiRates, IFloatingRateSource forecastCurve) { //Create Inflation Swap var swap = CreateInflationLinkedSwap(inflationLinkedSwap.payFixed, inflationLinkedSwap.startDate, inflationLinkedSwap.nominal, inflationLinkedSwap.tenor, inflationLinkedSwap.fixedRate, inflationLinkedSwap.index, inflationLinkedSwap.spread, inflationLinkedSwap.zaCalendar, inflationLinkedSwap.ccy); //Set value date swap.SetValueDate(inflationLinkedSwap.startDate); //Set index values var indexValues = new double[swap.indexDates.Length]; for (var i = 0; i < swap.indexDates.Length; i++) { indexValues[i] = forecastCurve.GetForwardRate(swap.indexDates[i]); } swap.SetIndexValues(swap.index, indexValues); //Determine swap end date var unAdjEndDate = inflationLinkedSwap.startDate.AddMonths(12 * inflationLinkedSwap.tenor.Years); var endDate = BusinessDayStore.ModifiedFollowing.Adjust(unAdjEndDate, inflationLinkedSwap.zaCalendar); //Calculate value of fixed and floating cashflows var floatingCashFlows = swap.GetCFs(); var floatingLegCashFlows = floatingCashFlows.Last().Amount; var cpiStartDate = LaggedCPI.GetCPI(inflationLinkedSwap.startDate, cpiDates, cpiRates); var cpiEndDate = LaggedCPI.GetCPI(endDate, cpiDates, cpiRates); var fixedCashFlows = inflationLinkedSwap.payFixed * inflationLinkedSwap.nominal * Math.Pow((1 + inflationLinkedSwap.fixedRate / 2), 2 * (endDate - inflationLinkedSwap.startDate) / 365) * cpiEndDate / cpiStartDate; var netCashFlows = floatingLegCashFlows + fixedCashFlows; // Store results var results = new ResultStore(); results.Add(Keys.FloatingLegCashFlows, floatingLegCashFlows); results.Add(Keys.FixedLegCashFlows, fixedCashFlows); results.Add(Keys.NetCashFlows, netCashFlows); return(results); }
/// <summary> /// Gets all the data that might be of interest after a simulation. /// </summary> /// <param name="portfolioIn">The portfolio in.</param> /// <param name="valueDate">The value date.</param> /// <param name="fwdValueDates">The forward value dates.</param> /// <returns></returns> public ResultStore GetValuePaths(IProduct[] portfolioIn, Date valueDate, Date[] fwdValueDates) { CalculateAll(portfolioIn, valueDate, fwdValueDates); var results = new ResultStore(); results.Add("regressedFwdsPVs", _regressedValues); var fwdCashflowPVs = new double[_numberOfPaths, fwdValueDates.Count()]; for (var i = 0; i < fwdValueDates.Length; i++) { fwdCashflowPVs.SetColumn(i, _simulatedCFs.GetPathwisePV(fwdValueDates[i], _originalTrades)); } results.Add("fwdCashflowPVs", fwdCashflowPVs); for (var regressorNumber = 0; regressorNumber < _simulatedRegs.GetNumberOfRegressors(); regressorNumber++) { results.Add("regressor" + regressorNumber, _simulatedRegs.GetRegressors(regressorNumber, fwdValueDates)); } return(results); }
/// <summary> /// /// </summary> /// <param name="bondforward"></param> /// <param name="settleDate"></param> /// <param name="ytm"></param> /// <param name="repo"></param> /// <returns></returns> public static ResultStore ForwardPrice(this JSEBondForward bondforward, Date settleDate, double ytm, double repo) { var N = 100.0; var couponamount = N * bondforward.underlyingBond.annualCouponRate / 2; var forwardDate = bondforward.forwardDate; if (settleDate > forwardDate) { throw new ArgumentException("settlement date must be before forward date."); } // get all-in price of underlying bond var results = bondforward.underlyingBond.GetSpotMeasures(settleDate, ytm); var AIP = (double)results.GetScalar(BesaJseBondEx.Keys.RoundedAip); // calculate Unadjusted Forward Price var dt = (double)(forwardDate - settleDate) / 365; var ForwardPrice = AIP * (1 + repo * dt); // get coupon dates between settlement and forward date and calculate equivalent value function var CouponDates = GetCouponDates(bondforward.underlyingBond, settleDate, forwardDate); // adjust forward price for any coupons the counterparty might receive var EV = new List <double>(); double AdjustedForwardPrice = 0; if (CouponDates.Any()) { foreach (var date in CouponDates) { if (date <= forwardDate) { EV.Add(1 + repo * (forwardDate - date) / 365); } else { EV.Add(Math.Pow(1 + repo * (date - forwardDate) / 365, -1)); } } AdjustedForwardPrice = ForwardPrice - couponamount * EV.Sum(); } else { AdjustedForwardPrice = ForwardPrice; } var resultStore = new ResultStore(); resultStore.Add(Keys.ForwardPrice, AdjustedForwardPrice); return(resultStore); }
public ResultStore GetResultStore() { var result = new ResultStore(); result.Add("notional", notional); result.Add("accrualFraction", accrualFraction); result.Add("rate", rate); result.Add("nearDate", nearDate); result.Add("farDate", farDate); result.Add("floatIndex", floatIndex.ToString()); result.Add("payFixed", payFixed.ToString()); result.Add("ccy", ccy.ToString()); return(result); }
public static ResultStore Value([ExcelArgument(Description = "A list of products.")] Product[] products, [QuantSAExcelArgument(Description = "The value date.")] Date valueDate, [QuantSAExcelArgument(Description = "A model able to handle all the market observables required to calculate the cashflows in the portfolio.")] NumeraireSimulator model, [QuantSAExcelArgument(Description = "Optional. The number of simulations required if the model requires simulation. If left blank will use a default value depending on the model.", Default = "1")] int nSims) { //int N = (nSims[0, 0] is ExcelMissing) ? 1 : XU.GetInt0D(nSims, "nSims"); Coordinator coordinator = new Coordinator(model, new List <Simulator>(), nSims); double value = coordinator.Value(products, valueDate); ResultStore result = new ResultStore(); result.Add("value", value); return(result); }
public static ResultStore BlackOption(JSEBondOption bondoption, double strike, double vol, double repo, JSEBondForward bond, double yieldToMaturity) { var settleDate = bondoption.settleDate; var timeToMaturity = bondoption.timeToMaturity; var ytm = yieldToMaturity; var bondforwardprice1 = (double)bond.ForwardPrice(settleDate, ytm, repo).GetScalar(JSEBondForwardEx.Keys.ForwardPrice); var discountFactor = Math.Exp(-repo * timeToMaturity); var optionPrice = BlackEtc.Black(PutOrCall.Call, strike, timeToMaturity, bondforwardprice1, vol, discountFactor); var resultStore = new ResultStore(); resultStore.Add(Keys.BlackOption, optionPrice); return(resultStore); }
/// <summary> /// /// </summary> /// <param name="bond"></param> /// <param name="settleDate"></param> /// <param name="ytm"></param> /// <returns></returns> public static ResultStore GetSpotMeasures(this BesaJseBond bond, Date settleDate, double ytm) { var N = 100.0; var typicalCoupon = N * bond.annualCouponRate / 2; var t0 = bond.GetLastCouponDateOnOrBefore(settleDate); var t1 = bond.GetNextCouponDate(t0); var n = (int)Math.Round((bond.maturityDate - t1) / 182.625); var tradingWithNextCoupon = t1 - settleDate > bond.booksCloseDateDays; var d = tradingWithNextCoupon ? settleDate - t0 : settleDate - t1; var unroundedAccrued = N * bond.annualCouponRate * d / 365.0; var roundedAccrued = Math.Round(unroundedAccrued, 5); var couponAtT1 = tradingWithNextCoupon ? typicalCoupon : 0.0; var v = 1 / (1 + ytm / 2); double brokenPeriodDf; if (n > 0) { brokenPeriodDf = Math.Pow(v, ((double)t1 - settleDate) / (t1 - t0)); } else { brokenPeriodDf = 1 / (1 + ytm * ((double)t1 - settleDate) / 365.0); } var unroundedAip = brokenPeriodDf * (couponAtT1 + typicalCoupon * v * (1 - Math.Pow(v, n)) / (1 - v) + N * Math.Pow(v, n)); var unroundedClean = unroundedAip - unroundedAccrued; var roundedClean = Math.Round(unroundedClean, 5); var roundedAip = roundedClean + roundedAccrued; var results = new ResultStore(); results.Add(Keys.RoundedAip, roundedAip); results.Add(Keys.RoundedClean, roundedClean); results.Add(Keys.UnroundedAip, unroundedAip); results.Add(Keys.UnroundedClean, unroundedClean); results.Add(Keys.UnroundedAccrued, unroundedAccrued); results.Add(Keys.TradingWithNextCoupon, tradingWithNextCoupon ? 1.0 : 0.0); return(results); }
public static ResultStore AssetSwapMeasures(this AssetSwap assetSwap, Date settleDate, double ytm, IDiscountingSource discountCurve) { //Create Asset Swap var swap = CreateAssetSwap(assetSwap.payFixed, assetSwap.underlyingBond, settleDate, assetSwap.index, assetSwap.spread, assetSwap.zaCalendar, assetSwap.ccy, discountCurve); //Create trade date of the swap var effectiveDateDays = 3; var unAdjTradeDate = settleDate.AddDays(-effectiveDateDays); var tradeDate = BusinessDayStore.ModifiedFollowing.Adjust(unAdjTradeDate, assetSwap.zaCalendar); //Set value date assetSwap.SetValueDate(tradeDate); // Calculate the first fixing off the curve to use at all past dates. var df1 = discountCurve.GetDF(tradeDate); var laterDate = tradeDate.AddTenor(assetSwap.index.Tenor); var df2 = discountCurve.GetDF(laterDate); var noOfDays = 365; var dt = (laterDate - tradeDate) / noOfDays; var rate = (df1 / df2 - 1) / dt; // Create the forecast curve from the discount curve IFloatingRateSource forecastCurve = new ForecastCurveFromDiscount(discountCurve, assetSwap.index, new FloatingRateFixingCurve1Rate(tradeDate, rate, assetSwap.index)); //Setting index values var indexValues = new double[swap.indexDates.Count]; for (var i = 0; i < swap.indexDates.Count; i++) { indexValues[i] = forecastCurve.GetForwardRate(swap.indexDates[i]); } assetSwap.SetIndexValues(assetSwap.index, indexValues); //Calculate present value of fixed and floating cashflows var numeratorCFs = swap.GetCFs().PV(discountCurve); //Calculate present value of denominator cashflows for spread equation var denomCFs = new List <Cashflow>(); var nominalAmount = 100; for (var i = 0; i < swap.paymentDatesFloating.Count; i++) { if (i <= swap.paymentDatesFloating.Count) { denomCFs.Add(new Cashflow(swap.paymentDatesFloating[i], -nominalAmount * swap.accrualFractions[i], swap.ccy)); } } var bondresults = assetSwap.underlyingBond.GetSpotMeasures(settleDate, ytm); var roundedAip = (double)bondresults.GetScalar(BesaJseBondEx.Keys.RoundedAip); var denominatorCFs = denomCFs.PV(discountCurve); var firstCF = new List <Cashflow>(); for (var i = 0; i < 1; i++) { if (i <= 1) { firstCF.Add(new Cashflow(settleDate, (roundedAip - 100), swap.ccy)); } } var pvFirstCF = firstCF.PV(discountCurve); //This is the assetSwapSpread calculation var assetSwapSpread = (pvFirstCF + numeratorCFs) / denominatorCFs; var results = new ResultStore(); results.Add(Keys.RoundedAip, roundedAip); results.Add(Keys.PVFirstCF, pvFirstCF); results.Add(Keys.NumeratorCashFlowsPrice, numeratorCFs); results.Add(Keys.DenominatorCashFlowsPrice, denominatorCFs); results.Add(Keys.AssetSwapSpread, assetSwapSpread); return(results); }