Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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}");
        }
Exemplo n.º 3
0
        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);
        }