コード例 #1
0
    // Check if the process will match the starting inputs
    public static void FwdStartSwap()
    {
        #region Inputs
        // Start input
        Date refDate = new Date(2021, 10, 11);  // ref date, this is only an example

        // I populate market rates set: from file, from real time, ... here not real data
        RateSet mktRates = new RateSet(refDate);

        // Depos
        mktRates.Add(1.243e-2, "1m", BuildingBlockType.EURDEPO);
        mktRates.Add(1.435e-2, "3m", BuildingBlockType.EURDEPO);
        mktRates.Add(1.720e-2, "6m", BuildingBlockType.EURDEPO);
        // Swap Vs 6M
        mktRates.Add(1.869e-2, "1Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(2.316e-2, "2Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(2.544e-2, "3Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(2.745e-2, "4Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(2.915e-2, "5Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(3.057e-2, "6Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(3.175e-2, "7Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(3.273e-2, "8Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(3.362e-2, "9Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(3.442e-2, "10Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(3.589e-2, "12Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(3.750e-2, "15Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(3.835e-2, "20Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(3.787e-2, "25Y", BuildingBlockType.EURSWAP6M);
        #endregion end Inputs

        // my curve
        IRateCurve Curve1 = new SingleCurveBuilderStandard <OnLogDf, LinearInterpolator>(mktRates, OneDimensionInterpolation.Linear);

        #region print output
        Console.WriteLine("Input Rate (1Y): {0},   ReCalc Rate (1Y): {1} \n\n", 1.869e-2, Curve1.SwapFwd(refDate, "1Y"));

        // Start and Tenor of each point in my fwd matrix (2Y15Y is a 15Y swap starting in 2Y)
        string[] Start = new string[] { "1Y", "2Y", "3Y", "5Y", "7Y", "10Y" };
        string[] Tenor = new string[] { "1Y", "2Y", "5Y", "7Y", "10Y" };

        // print fwd swap matrix using multi curve
        Console.WriteLine("Matrix using {0}\n", Curve1.ToString());
        for (int i = 0; i < Start.Length; i++)
        {
            for (int t = 0; t < Tenor.Length; t++)
            {
                Console.Write("{0}{1}:{2:P3}  ", Start[i], Tenor[t], Curve1.SwapFwd(refDate.add_period(Start[i]), Tenor[t]));
            }
            Console.Write("\n\n");
        }
        #endregion end print output
    }
コード例 #2
0
    // Calculate the time for initialise a SingleCurveBuilderInterpBestFit
    public static void TimeForBestFitVs3m()
    {
        #region Inputs
        // Start input
        Date refDate = (new Date(DateTime.Now)).mod_foll();

        // I populate market rates set: from file, from real time, ... here not real data
        RateSet mktRates = new RateSet(refDate);

        // Depos
        mktRates.Add(1.434e-2, "3m", BuildingBlockType.EURDEPO);

        // Swap Vs 3M
        mktRates.Add(2.813e-2, "1Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(3.096e-2, "2Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(3.322e-2, "3Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(3.529e-2, "4Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(3.709e-2, "5Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(3.862e-2, "6Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(3.991e-2, "7Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(4.101e-2, "8Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(4.197e-2, "9Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(4.285e-2, "10Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(4.443e-2, "12Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(4.614e-2, "15Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(4.711e-2, "20Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(4.671e-2, "25Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(4.589e-2, "30Y", BuildingBlockType.EURSWAP3M);
        #endregion end Inputs

        #region building curve

        DateTime timer; // initialise the timer

        timer = DateTime.Now;
        double firstFixing = 1.434e-2; SingleCurveBuilderSmoothingFwd <OnLogDf, SimpleCubicInterpolator> C = new SingleCurveBuilderSmoothingFwd <OnLogDf, SimpleCubicInterpolator>(mktRates, firstFixing);
        Console.WriteLine("\n{0} \nFitted in {1}", C.ToString(), DateTime.Now - timer);

        timer = DateTime.Now;
        SingleCurveBuilderInterpBestFit <OnLogDf, SimpleCubicInterpolator> C1 = new SingleCurveBuilderInterpBestFit <OnLogDf, SimpleCubicInterpolator>(mktRates);
        Console.WriteLine("\n{0} \nFitted in {1}", C1.ToString(), DateTime.Now - timer);

        timer = DateTime.Now;
        SingleCurveBuilderStandard <OnLogDf, LinearInterpolator> C2 = new SingleCurveBuilderStandard <OnLogDf, LinearInterpolator>(mktRates, OneDimensionInterpolation.Linear);
        Console.WriteLine("\n{0} \nFitted in {1}", C2.ToString(), DateTime.Now - timer);

        #endregion building curve
    }
コード例 #3
0
    // Calculate the time for initialise a SingleCurveBuilderInterpBestFit
    public static void TimeForBestFitVs6m()
    {
        #region Inputs
        // Start input
        Date refDate = (new Date(DateTime.Now)).mod_foll();

        // I populate markets rates set: from file, from real time, ... here not real data
        RateSet mktRates = new RateSet(refDate);

        // Depos
        mktRates.Add(2.243e-2, "1m", BuildingBlockType.EURDEPO);
        mktRates.Add(2.435e-2, "3m", BuildingBlockType.EURDEPO);
        mktRates.Add(2.620e-2, "6m", BuildingBlockType.EURDEPO);
        // Swap Vs 6M
        mktRates.Add(2.869e-2, "1Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(3.316e-2, "2Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(3.544e-2, "3Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(3.745e-2, "4Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(3.915e-2, "5Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(4.057e-2, "6Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(4.175e-2, "7Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(4.273e-2, "8Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(4.362e-2, "9Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(4.442e-2, "10Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(4.589e-2, "12Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(4.750e-2, "15Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(4.835e-2, "20Y", BuildingBlockType.EURSWAP6M);
        mktRates.Add(4.787e-2, "25Y", BuildingBlockType.EURSWAP6M);
        #endregion end Inputs

        #region building curve
        DateTime timer;

        timer = DateTime.Now;
        double firstFixing = 1.62e-2; SingleCurveBuilderSmoothingFwd <OnLogDf, SimpleCubicInterpolator> C = new SingleCurveBuilderSmoothingFwd <OnLogDf, SimpleCubicInterpolator>(mktRates, firstFixing);
        Console.WriteLine("\n{0} \nFitted in {1}", C.ToString(), DateTime.Now - timer);

        timer = DateTime.Now;
        SingleCurveBuilderInterpBestFit <OnLogDf, SimpleCubicInterpolator> C1 = new SingleCurveBuilderInterpBestFit <OnLogDf, SimpleCubicInterpolator>(mktRates);
        Console.WriteLine("\n{0} \nFitted in {1}", C1.ToString(), DateTime.Now - timer);

        timer = DateTime.Now;
        SingleCurveBuilderStandard <OnLogDf, LinearInterpolator> C2 = new SingleCurveBuilderStandard <OnLogDf, LinearInterpolator>(mktRates, OneDimensionInterpolation.Linear);
        Console.WriteLine("\n{0} \nFitted in {1}", C2.ToString(), DateTime.Now - timer);
        #endregion building curve
    }
コード例 #4
0
    // Print on excel forward rate using different curve builder for OIS fwd 3m
    public static void CheckFwdRatesOIS3m()
    {
        #region Inputs
        // ref date
        Date refDate = (new Date(DateTime.Now)).mod_foll();

        // I populate market rates set: from file, from real time, ...
        RateSet mktRates = new RateSet(refDate);

        mktRates.Add(2.338e-2, "1d", BuildingBlockType.EURDEPO);    //
        mktRates.Add(2.272e-2, "1w", BuildingBlockType.EONIASWAP);  //
        mktRates.Add(2.241e-2, "2w", BuildingBlockType.EONIASWAP);  //
        mktRates.Add(2.16e-2, "3w", BuildingBlockType.EONIASWAP);   //
        mktRates.Add(2.226e-2, "1m", BuildingBlockType.EONIASWAP);  //
        mktRates.Add(2.299e-2, "2m", BuildingBlockType.EONIASWAP);  //
        mktRates.Add(2.323e-2, "3m", BuildingBlockType.EONIASWAP);  //
        mktRates.Add(2.344e-2, "4m", BuildingBlockType.EONIASWAP);  //
        mktRates.Add(2.371e-2, "5m", BuildingBlockType.EONIASWAP);  //
        mktRates.Add(2.39e-2, "6m", BuildingBlockType.EONIASWAP);   //
        mktRates.Add(2.41e-2, "7m", BuildingBlockType.EONIASWAP);   //
        mktRates.Add(2.4316e-2, "8m", BuildingBlockType.EONIASWAP); //
        mktRates.Add(2.449e-2, "9m", BuildingBlockType.EONIASWAP);  //
        mktRates.Add(2.466e-2, "10m", BuildingBlockType.EONIASWAP); //
        mktRates.Add(2.48e-2, "11m", BuildingBlockType.EONIASWAP);  //

        mktRates.Add(2.529e-2, "15m", BuildingBlockType.EONIASWAP); //
        mktRates.Add(2.565e-2, "18m", BuildingBlockType.EONIASWAP); //
        mktRates.Add(2.603e-2, "21m", BuildingBlockType.EONIASWAP); //

        mktRates.Add(2.493e-2, "1Y", BuildingBlockType.EONIASWAP);
        mktRates.Add(2.644e-2, "2Y", BuildingBlockType.EONIASWAP);
        mktRates.Add(2.849e-2, "3Y", BuildingBlockType.EONIASWAP);
        mktRates.Add(3.08e-2, "4Y", BuildingBlockType.EONIASWAP);
        mktRates.Add(3.292e-2, "5Y", BuildingBlockType.EONIASWAP);
        mktRates.Add(3.471e-2, "6Y", BuildingBlockType.EONIASWAP);
        mktRates.Add(3.621e-2, "7Y", BuildingBlockType.EONIASWAP);
        mktRates.Add(3.748e-2, "8Y", BuildingBlockType.EONIASWAP);
        mktRates.Add(3.86e-2, "9Y", BuildingBlockType.EONIASWAP);
        mktRates.Add(3.965e-2, "10Y", BuildingBlockType.EONIASWAP);
        mktRates.Add(4.064e-2, "11Y", BuildingBlockType.EONIASWAP);
        mktRates.Add(4.155e-2, "12Y", BuildingBlockType.EONIASWAP);
        // From here interpolation is need
        mktRates.Add(4.358e-2, "15Y", BuildingBlockType.EONIASWAP);
        mktRates.Add(4.48e-2, "20Y", BuildingBlockType.EONIASWAP);
        mktRates.Add(4.465e-2, "25Y", BuildingBlockType.EONIASWAP);
        mktRates.Add(4.415e-2, "30Y", BuildingBlockType.EONIASWAP);

        List <IRateCurve> CurveList   = new List <IRateCurve>(); // list containing curve
        List <string>     CurveString = new List <string>();     // list containing labels

        #endregion end Inputs

        #region building curve
        SingleCurveBuilderStandard <OnDf, LinearInterpolator> C1 = new SingleCurveBuilderStandard <OnDf, LinearInterpolator>(mktRates, OneDimensionInterpolation.Linear);
        SingleCurveBuilderInterpBestFit <OnLogDf, SimpleCubicInterpolator> C2 = new SingleCurveBuilderInterpBestFit <OnLogDf, SimpleCubicInterpolator>(mktRates);
        #endregion end building curve

        // populate lists
        CurveList.Add(C1); CurveString.Add(C1.ToString());
        CurveList.Add(C2); CurveString.Add(C2.ToString());

        #region printing output
        // I get the longer eonia swap available from the input data
        SwapStyle LS = (SwapStyle)mktRates.GetArrayOfBB().Last();
        Schedule  s  = new Schedule(refDate, LS.endDate, "3m", Rule.Backward, LS.swapLeg1.SwapBusDayRollsAdj, "0d", LS.swapLeg1.SwapBusDayPayAdj);

        Dc     dc       = Dc._Act_360;
        Date[] FromDate = s.fromDates;
        Date[] ToDate   = s.toDates;
        int    N        = FromDate.Length;
        List <Vector <double> > Fwds = new List <Vector <double> >();
        double[] dt = new double[N];
        for (int i = 0; i < N; i++)
        {
            dt[i] = FromDate[0].YF(ToDate[i], Dc._30_360);
        }

        foreach (IRateCurve myC in CurveList)
        {
            double[] fwd = new double[N];
            for (int i = 0; i < N; i++)
            {
                double yf     = FromDate[i].YF(ToDate[i], dc);
                double df_ini = myC.Df(FromDate[i]);
                double df_end = myC.Df(ToDate[i]);
                fwd[i] = ((df_ini / df_end) - 1) / yf;
            }
            Fwds.Add(new Vector <double>(fwd));
        }

        ExcelMechanisms exl = new ExcelMechanisms();

        exl.printInExcel(new Vector <double>(dt), CurveString, Fwds, "Fwd 3M", "time", "rate"); // .printInExcel<T>
        #endregion end printing output
    }
コード例 #5
0
    // Print on excel forward rate using different curve builder for 3m
    public static void CheckFwdRatesVs3m()
    {
        #region Inputs
        // Start input
        Date refDate = (new Date(DateTime.Now)).mod_foll();

        // I populate market rates set: from file, from real time, ...
        RateSet mktRates = new RateSet(refDate);

        // Depos
        mktRates.Add(0.434e-2, "3m", BuildingBlockType.EURDEPO);

        // Swap Vs 3M
        mktRates.Add(0.813e-2, "1Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(1.096e-2, "2Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(1.322e-2, "3Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(1.529e-2, "4Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(1.709e-2, "5Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(1.862e-2, "6Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(1.991e-2, "7Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(2.101e-2, "8Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(2.197e-2, "9Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(2.285e-2, "10Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(2.443e-2, "12Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(2.614e-2, "15Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(2.711e-2, "20Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(2.671e-2, "25Y", BuildingBlockType.EURSWAP3M);
        mktRates.Add(2.589e-2, "30Y", BuildingBlockType.EURSWAP3M);
        #endregion end Inputs

        #region building curve

        SingleCurveBuilderInterpBestFit <OnLogDf, SimpleCubicInterpolator> C1 = new SingleCurveBuilderInterpBestFit <OnLogDf, SimpleCubicInterpolator>(mktRates);
        double firstFixing = 0.434e-2; SingleCurveBuilderSmoothingFwd <OnLogDf, SimpleCubicInterpolator> C2 = new SingleCurveBuilderSmoothingFwd <OnLogDf, SimpleCubicInterpolator>(mktRates, firstFixing);
        SingleCurveBuilderStandard <OnLogDf, LinearInterpolator> C3 = new SingleCurveBuilderStandard <OnLogDf, LinearInterpolator>(mktRates, OneDimensionInterpolation.Linear);
        #endregion end building curve

        List <IRateCurve> CurveList   = new List <IRateCurve>(); // list containing curve
        List <string>     CurveString = new List <string>();     // list containing labels

        // populate lists
        CurveList.Add(C1); CurveString.Add(C1.ToString());
        CurveList.Add(C2); CurveString.Add(C2.ToString());
        CurveList.Add(C3); CurveString.Add(C3.ToString());

        #region printing output
        // I get the longer swap
        SwapStyle LS = (SwapStyle)mktRates.GetArrayOfBB().Last();

        Dc     dc       = Dc._Act_360;
        Date[] FromDate = LS.scheduleLeg2.fromDates;
        Date[] ToDate   = LS.scheduleLeg2.toDates;
        int    N        = FromDate.Length;
        List <Vector <double> > Fwds = new List <Vector <double> >();
        double[] dt = new double[N];
        for (int i = 0; i < N; i++)
        {
            dt[i] = FromDate[0].YF(ToDate[i], Dc._30_360);
        }

        foreach (IRateCurve myC in CurveList)
        {
            double[] fwd = new double[N];
            for (int i = 0; i < N; i++)
            {
                double yf     = FromDate[i].YF(ToDate[i], dc);
                double df_ini = myC.Df(FromDate[i]);
                double df_end = myC.Df(ToDate[i]);
                fwd[i] = ((df_ini / df_end) - 1) / yf;
            }
            Fwds.Add(new Vector <double>(fwd));
        }

        ExcelMechanisms exl = new ExcelMechanisms();

        exl.printInExcel(new Vector <double>(dt), CurveString, Fwds, "Fwd vs 3M", "time", "rate"); // .printInExcel<T>
        #endregion end printing output
    }