Ejemplo n.º 1
0
 public IFundingInstrument Clone() => new IrBasisSwap
 {
     BasisPay          = BasisPay,
     BasisRec          = BasisRec,
     Currency          = Currency,
     Counterparty      = Counterparty,
     DiscountCurve     = DiscountCurve,
     EndDate           = EndDate,
     FlowSchedulePay   = FlowSchedulePay.Clone(),
     FlowScheduleRec   = FlowScheduleRec.Clone(),
     ForecastCurvePay  = ForecastCurvePay,
     ForecastCurveRec  = ForecastCurveRec,
     NDates            = NDates,
     Notional          = Notional,
     ParSpreadPay      = ParSpreadPay,
     ParSpreadRec      = ParSpreadRec,
     PayLeg            = PayLeg,
     PillarDate        = PillarDate,
     RecLeg            = RecLeg,
     ResetDates        = (DateTime[])ResetDates.Clone(),
     ResetFrequencyPay = ResetFrequencyPay,
     ResetFrequencyRec = ResetFrequencyRec,
     SolveCurve        = SolveCurve,
     StartDate         = StartDate,
     SwapTenor         = SwapTenor,
     TradeId           = TradeId
 };
Ejemplo n.º 2
0
 public IFundingInstrument Clone() => new XccyBasisSwap
 {
     BasisPay          = BasisPay,
     BasisRec          = BasisRec,
     CcyPay            = CcyPay,
     CcyRec            = CcyRec,
     Counterparty      = Counterparty,
     DiscountCurvePay  = DiscountCurvePay,
     DiscountCurveRec  = DiscountCurveRec,
     EndDate           = EndDate,
     FlowSchedulePay   = FlowSchedulePay.Clone(),
     FlowScheduleRec   = FlowScheduleRec.Clone(),
     ForecastCurvePay  = ForecastCurvePay,
     ForecastCurveRec  = ForecastCurveRec,
     MtmSwapType       = MtmSwapType,
     NDates            = NDates,
     NotionalExchange  = NotionalExchange,
     NotionalPay       = NotionalPay,
     NotionalRec       = NotionalRec,
     ParSpreadPay      = ParSpreadPay,
     ParSpreadRec      = ParSpreadRec,
     PayLeg            = PayLeg.Clone(),
     PillarDate        = PillarDate,
     Pvccy             = Pvccy,
     RecLeg            = RecLeg.Clone(),
     ResetDates        = ResetDates,
     ResetFrequencyPay = ResetFrequencyPay,
     ResetFrequencyRec = ResetFrequencyRec,
     SolveCurve        = SolveCurve,
     StartDate         = StartDate,
     SwapTenor         = SwapTenor,
     TradeId           = TradeId
 };
Ejemplo n.º 3
0
        public double CalculateParRate(IFundingModel model)
        {
            var discountCurvePay = model.Curves[DiscountCurvePay];
            var discountCurveRec = model.Curves[DiscountCurveRec];
            var forecastCurvePay = model.Curves[ForecastCurvePay];
            var forecastCurveRec = model.Curves[ForecastCurveRec];

            var payCCY  = MtmSwapType == MTMSwapType.ReceiveNotionalFixed ? CcyRec : CcyPay;
            var recCCY  = MtmSwapType == MTMSwapType.PayNotionalFixed ? CcyPay : CcyRec;
            var baseCCY = Pvccy ?? payCCY;

            var fxPayToBase = model.GetFxRate(model.BuildDate, payCCY, baseCCY);
            var fxRecToBase = model.GetFxRate(model.BuildDate, recCCY, baseCCY);

            if (ParSpreadPay != 0.0)
            {
                var newSched = FlowSchedulePay.Clone();

                var recPV = FlowScheduleRec.PV(discountCurveRec, forecastCurveRec, true, true, true, BasisRec, null);
                recPV *= fxRecToBase;

                var targetFunc = new Func <double, double>(spread =>
                {
                    foreach (var s in newSched.Flows.Where(x => x.FlowType == FlowType.FloatRate))
                    {
                        s.FixedRateOrMargin = spread;
                    }
                    var pv = newSched.PV(discountCurvePay, forecastCurvePay, true, true, true, BasisPay, null);
                    pv    *= fxPayToBase;
                    return(pv - recPV);
                }
                                                           );
                var newSpread = Math.Solvers.Newton1D.MethodSolve(targetFunc, 0, 0.000001);
                return(newSpread);
            }
            else
            {
                var newSched = FlowScheduleRec.Clone();
                var payPV    = FlowSchedulePay.PV(discountCurvePay, forecastCurvePay, true, true, true, BasisPay, null);
                payPV *= fxPayToBase;
                var targetFunc = new Func <double, double>(spread =>
                {
                    foreach (var s in newSched.Flows.Where(x => x.FlowType == FlowType.FloatRate))
                    {
                        s.FixedRateOrMargin = spread;
                    }
                    var pv = newSched.PV(discountCurveRec, forecastCurveRec, true, true, true, BasisRec, null);
                    pv    *= fxRecToBase;
                    return(pv - payPV);
                }
                                                           );
                var newSpread = Math.Solvers.Newton1D.MethodSolve(targetFunc, 0, 0.000001);
                return(newSpread);
            }
        }
Ejemplo n.º 4
0
        public double Pv(IFundingModel model, bool updateState)
        {
            var updateDF     = updateState || model.CurrentSolveCurve == DiscountCurve;
            var updatePayEst = updateState || model.CurrentSolveCurve == ForecastCurvePay;
            var updateRecEst = updateState || model.CurrentSolveCurve == ForecastCurveRec;

            var discountCurve    = model.Curves[DiscountCurve];
            var forecastCurvePay = model.Curves[ForecastCurvePay];
            var forecastCurveRec = model.Curves[ForecastCurveRec];
            var payPV            = FlowSchedulePay.PV(discountCurve, forecastCurvePay, updateState, updateDF, updatePayEst, BasisPay, null);
            var recPV            = FlowScheduleRec.PV(discountCurve, forecastCurveRec, updateState, updateDF, updateRecEst, BasisRec, null);

            return(payPV + recPV);
        }
Ejemplo n.º 5
0
        public double CalculateParRate(IFundingModel model)
        {
            var discountCurve    = model.Curves[DiscountCurve];
            var forecastCurvePay = model.Curves[ForecastCurvePay];
            var forecastCurveRec = model.Curves[ForecastCurveRec];

            if (ParSpreadPay != 0.0)
            {
                var newSched   = FlowSchedulePay.Clone();
                var recPV      = FlowScheduleRec.PV(discountCurve, forecastCurveRec, true, true, true, BasisRec, null);
                var targetFunc = new Func <double, double>(spread =>
                {
                    foreach (var s in newSched.Flows.Where(x => x.FlowType == FlowType.FloatRate))
                    {
                        s.FixedRateOrMargin = spread;
                    }
                    var pv = newSched.PV(discountCurve, forecastCurvePay, true, true, true, BasisPay, null);
                    return(pv - recPV);
                }
                                                           );
                var newSpread = Math.Solvers.Newton1D.MethodSolve(targetFunc, 0, 0.000001);
                return(newSpread);
            }
            else
            {
                var newSched   = FlowScheduleRec.Clone();
                var payPV      = FlowSchedulePay.PV(discountCurve, forecastCurvePay, true, true, true, BasisPay, null);
                var targetFunc = new Func <double, double>(spread =>
                {
                    foreach (var s in newSched.Flows.Where(x => x.FlowType == FlowType.FloatRate))
                    {
                        s.FixedRateOrMargin = spread;
                    }
                    var pv = newSched.PV(discountCurve, forecastCurveRec, true, true, true, BasisRec, null);
                    return(pv - payPV);
                }
                                                           );
                var newSpread = Math.Solvers.Newton1D.MethodSolve(targetFunc, 0, 0.000001);
                return(newSpread);
            }
        }