public double CalcAnnualizedYieldCleanPrice(string calcRequestType, double inputValue1, double inputValue2, Dictionary <string, double> result) { double returnValue = 0.0; try { IUnivariateFunction fcn; switch (calcRequestType) { case "AnnualYieldFromCleanPrice": fcn = new FunctionVariable.UnivariateFunction(result, YieldEquation, inputValue1, inputValue2, double.NaN); returnValue = BrentZero2 <IUnivariateFunction> .DoSolve(fcn, -1000, 1000, 0.05, 2); CalcTotal(result); break; case "EndCleanPriceFromAnnual": fcn = new FunctionVariable.UnivariateFunction(result, YieldEquation, inputValue1, double.NaN, inputValue2); returnValue = BrentZero2 <IUnivariateFunction> .DoSolve(fcn, 0.0, 10000.0, 100.0, 1); CalcTotal(result); break; case "StartCleanPriceFromAnnual": fcn = new FunctionVariable.UnivariateFunction(result, YieldEquation, double.NaN, inputValue1, inputValue2); returnValue = BrentZero2 <IUnivariateFunction> .DoSolve(fcn, 0.0, 10000.0, 100.0, 0); CalcTotal(result); break; case "EndCleanPriceFromPnl": fcn = new FunctionVariable.UnivariateFunction(result, NetPnlEquation, inputValue1, double.NaN, inputValue2); returnValue = BrentZero2 <IUnivariateFunction> .DoSolve(fcn, 0.0, 10000.0, 100.0, 1); CalcTotal(result); break; case "StartCleanPriceFromPnl": fcn = new FunctionVariable.UnivariateFunction(result, NetPnlEquation, double.NaN, inputValue1, inputValue2); returnValue = BrentZero2 <IUnivariateFunction> .DoSolve(fcn, 0.0, 10000.0, 100.0, 0); CalcTotal(result); break; } } catch (Exception ex) { throw new PricingBaseException("HoldingPeriod AnnualizedYield does not converbe " + ex.GetDetail()); } return(returnValue); }
public void TestBrentZero2CurveBuild() { double finalR; try { finalR = BrentZero2 <IUnivariateFunction> .DoSolve(f : new CurveCalibTest2(), min : min, max : max, initial : initial, changeIndex : 0, accuracy : accuracy); } catch (Exception ex) { throw new PricingLibraryException(string.Format("Fail to calibrate")); } Console.WriteLine($"solved = {finalR}"); }
public Dictionary <string, Dictionary <string, RateRecord> > CalcEquation(string calcType) { var psDict = new Dictionary <string, Dictionary <string, RateRecord> >(); var fundingCurve = _market.RiskfreeCurve.HasValue ? _market.RiskfreeCurve.Value : YieldCurve.GetConstRateCurve(_market.DiscountCurve.Value, 0.0); var reinvestmentCurve = _market.DiscountCurve.HasValue ? _market.DiscountCurve.Value : YieldCurve.GetConstRateCurve(_market.RiskfreeCurve.Value, 0.0); var bonds = _bondFuture.Deliverables; var length = bonds.Length; var resultRateRecord = new Dictionary <string, double> [length]; for (var i = 0; i < length; ++i) { var resultDic = new Dictionary <string, double>(); _bond = bonds[i]; var tfBondId = _bondFuture.Id + "_" + _bond.Id; _cleanPriceMktFlg = IsCleandPrice(_bond.Id); resultDic["AiStart"] = _bond.GetAccruedInterest(_market.ValuationDate, _market, false); resultDic["AiEnd"] = _bond.GetAccruedInterest(_bondFuture.UnderlyingMaturityDate, _market, false); resultDic["ConversionFactor"] = _bondFuture.GetConversionFactor(_bond, _market); resultDic["fundingRate"] = fundingCurve.GetSpotRate(0.0); _cashflows = _bond.GetCashflows(_market, false).Where(x => x.PaymentDate > _market.ValuationDate && x.PaymentDate <= _bondFuture.UnderlyingMaturityDate).ToArray(); if (_cashflows.Any()) { resultDic["Coupon"] = _cashflows.Sum(x => x.PaymentAmount); resultDic["TimeWeightedCoupon"] = _cashflows.Sum(x => x.PaymentAmount * _bondFuture.DayCount.CalcDayCountFraction(x.PaymentDate, _bondFuture.UnderlyingMaturityDate)); resultDic["couponsAccruedByReinvestment"] = _cashflows.Sum(x => x.PaymentAmount * (reinvestmentCurve.GetCompoundedRate2(x.PaymentDate, _bondFuture.UnderlyingMaturityDate) - 1.0)); } else { resultDic["Coupon"] = 0.0; resultDic["TimeWeightedCoupon"] = 0.0; resultDic["couponsAccruedByReinvestment"] = 0.0; } //Note: what is this interest income for? resultDic["InterestIncome"] = resultDic["AiEnd"] - resultDic["AiStart"]; // * resultDic["ConversionFactor"]; resultDic["interestCostRate"] = RepoCostRate(); resultDic["dt"] = _bondFuture.DayCount.CalcDayCountFraction(_market.ValuationDate, _bondFuture.UnderlyingMaturityDate); var inputValues = new double[3]; double calcMin = 0.0; double calcMax = 0.0; int changIndex = 0; FunctionVariable.UnivariateFunction fcn = null; switch (calcType) { case "FromFuturesPriceAndBondPrice": inputValues[0] = FuturePrice(); inputValues[1] = double.NaN; inputValues[2] = double.NaN; calcMin = -500.0; calcMax = 500.0; changIndex = 2; fcn = new FunctionVariable.UnivariateFunction(resultDic, IrrEquation, inputValues); break; case "FromBondPriceAndIrr": inputValues[0] = double.NaN; inputValues[1] = double.NaN; fcn = GetCalcEquation(tfBondId, inputValues, resultDic); calcMin = 1.0; calcMax = 50000.0; changIndex = 0; //BrentZero2<IUnivariateFunction>.DoSolve(fcn, 0.0, 50000.0, 0); break; case "FromFuturesPriceAndIrr": inputValues[0] = FuturePrice(); inputValues[1] = double.NaN; fcn = GetCalcEquation(tfBondId, inputValues, resultDic); calcMin = 1.0; calcMax = 50000.0; changIndex = 1; //BrentZero2<IUnivariateFunction>.DoSolve(fcn, calcMin, calcMax, changIndex); break; } BrentZero2 <IUnivariateFunction> .DoSolve(fcn, calcMin, calcMax, changIndex); resultRateRecord[i] = resultDic; } var resultKeyList = new List <string>() { "FuturesPrice" , "BondDirtyPrice" , "BondCleanPrice" , "BondYieldToMaturity" , "ConversionFactor" , "AiStart" , "AiEnd" , "Coupon" , "InterestIncome" , "InterestCost" , "PnL" , "InvoicePrice" , "Margin" , "Spread" , "Irr" , "Basis" , "NetBasis" , "ModifiedDuration" , "TimeWeightedCoupon" }; foreach (var resultKey in resultKeyList) { psDict[resultKey] = resultRateRecord.Select((x, i) => Tuple.Create(bonds[i].Id, new RateRecord { Rate = x[resultKey] })).ToDictionary(x => x.Item1, x => x.Item2); } return(psDict); }