Пример #1
0
    public static double CapBlack(string Tenor, double strike, double N, IRateCurve curve, BilinearInterpolator VolCapletMatrix)
    {
        Date      refDate = curve.RefDate();
        SwapStyle y       = (SwapStyle) new BuildingBlockFactory().CreateBuildingBlock(refDate, 0, Tenor, curve.GetSwapStyle().buildingBlockType);

        double[] yf       = y.scheduleLeg2.GetYFVect(Dc._Act_360);
        int      toRemove = yf.Length - 1;

        yf = yf.Where((val, inx) => inx != toRemove).ToArray();

        List <Date> ToDate = y.scheduleLeg2.toDates.ToList();

        ToDate.RemoveAt(ToDate.Count - 1);      // remove last element
        double[] T = (from c in ToDate
                      select refDate.YF_365(c)).ToArray();

        // df- getting relevant dates
        Date[] dfDate  = y.scheduleLeg2.payDates;
        int    Ncaplet = yf.Length;   // number of caplets

        double[] df = new double[Ncaplet];
        // fwd rate
        double[] fwd     = new double[Ncaplet];
        Date[]   fwdDate = y.scheduleLeg2.fromDates;

        for (int i = 0; i < Ncaplet; i++) // Note the loop start from 1
        {                                 // first discount factor is on first payment date of caplet (first caplet skipped)
            df[i]  = curve.Df(dfDate[i + 1]);
            fwd[i] = curve.Fwd(fwdDate[i + 1]);
        }

        double[] sigma = (from t in T
                          select VolCapletMatrix.Solve(t, strike)).ToArray();
        return(CapBlack(T, yf, N, strike, sigma, df, fwd));
    }
Пример #2
0
    // NPV of swap
    public static double NPV(SwapStyle BB, IRateCurve c, bool PayOrRec)
    {
        #region FixLeg
        // fixed leg data
        double[] yfFixLeg = BB.scheduleLeg1.GetYFVect(BB.swapLeg1.DayCount);     // fixed is leg 1

        // dfs array of fixed lag
        Date[] dfDates = BB.scheduleLeg1.payDates;     // serial date of fixed lag (each dates we should find df)

        // # of fixed cash flows
        int n_fix = dfDates.Length;

        double NPV_fix = 0.0;
        // calculate df
        for (int i = 0; i < n_fix; i++)
        {
            NPV_fix += c.Df(dfDates[i]) * yfFixLeg[i] * BB.rateValue;      // df*yf
        }
        #endregion

        #region FloatLeg
        // floating leg data
        double[] yfFloatLeg = BB.scheduleLeg2.GetYFVect(BB.swapLeg2.DayCount);     // float is leg 2

        // dfs array of fixed lag
        Date[] dfDatesFloat = BB.scheduleLeg2.payDates;     // serial date of float leg (each dates we should find df)

        Date[] FromDateFloat = BB.scheduleLeg2.fromDates;

        // # of floating cash flows
        int n_float = dfDatesFloat.Length;

        double[] fwd = new double[n_float];     // fwd rates container

        // getting fwd rates
        for (int i = 0; i < n_float; i++)
        {
            fwd[i] = c.Fwd(FromDateFloat[i]);
        }

        double NPV_float = 0.0;
        // calculate df
        for (int i = 0; i < n_float; i++)
        {
            NPV_float += c.Df(dfDatesFloat[i]) * yfFloatLeg[i] * fwd[i];      // df*yf
        }

        #endregion
        if (!PayOrRec)
        {
            return(-NPV_fix + NPV_float);
        }                                // Receiver Swap
        return(NPV_fix - NPV_float);     // NPV Payer Swap
    }
Пример #3
0
    // constructor
    public CapletMatrixVolBuilder(string[] Tenor, IRateCurve Curve, double[] strike, List <double[]> VolSilos)
    {
        #region preparing data

        // yf of longer cap
        SwapStyle y        = (SwapStyle) new BuildingBlockFactory().CreateBuildingBlock(Curve.RefDate(), 0, Tenor.Last(), Curve.GetSwapStyle().buildingBlockType);
        double[]  yf       = y.scheduleLeg2.GetYFVect(Dc._Act_360);
        int       toRemove = yf.Length - 1;
        yf = yf.Where((val, inx) => inx != toRemove).ToArray();

        // T all tenor needed. They are more than input
        Date        refDate = Curve.RefDate();
        List <Date> ToDate  = y.scheduleLeg2.toDates.ToList();
        ToDate.RemoveAt(ToDate.Count - 1);    // remove last element
        double[] T = (from c in ToDate
                      select refDate.YF_365(c)).ToArray();

        // available T from input
        double[] Tquoted = new double[Tenor.Length];
        for (int i = 0; i < Tquoted.Length; i++)
        {        // calculate yf of each available T as it was a swap
            SwapStyle myS    = (SwapStyle) new BuildingBlockFactory().CreateBuildingBlock(Curve.RefDate(), 0, Tenor[i], Curve.GetSwapStyle().buildingBlockType);
            int       L      = myS.scheduleLeg2.toDates.Count() - 1;
            Date[]    toDate = myS.scheduleLeg2.toDates;
            Tquoted[i] = refDate.YF_365(toDate[L - 1]);
        }

        // df- getting relevant dates
        Date[]   dfDate  = y.scheduleLeg2.payDates;
        int      Ncaplet = yf.Length; // number of caplets
        double[] df      = new double[Ncaplet];
        // fwd rate
        double[] fwd     = new double[Ncaplet];
        Date[]   fwdDate = y.scheduleLeg2.fromDates;

        for (int i = 0; i < Ncaplet; i++) // Note the loop start from 1
        {                                 // first discount factor is on first payment date of caplet (first caplet skipped)
            df[i]  = Curve.Df(dfDate[i + 1]);
            fwd[i] = Curve.Fwd(fwdDate[i + 1]);
        }

        #endregion

        Ini(T, df, fwd, yf, Tquoted, VolSilos, strike);
    }
Пример #4
0
    // used in constructor
    private void Ini(string tenor, IRateCurve curve, BilinearInterpolator capletVolMatrix, double nominal)
    {
        stringTenor = tenor;
        rateCurve   = curve;
        volMatrix   = capletVolMatrix;
        N           = nominal;

        // yf of longer cap
        SwapStyle y = (SwapStyle) new BuildingBlockFactory().CreateBuildingBlock(curve.RefDate(), 0, tenor, curve.GetSwapStyle().buildingBlockType);

        yf          = y.scheduleLeg2.GetYFVect(Dc._Act_360);
        capSchedule = y.scheduleLeg2;
        int toRemove = yf.Length - 1;

        yf = yf.Where((val, inx) => inx != toRemove).ToArray();

        // T all tenor needed. They are more than input
        Date        refDate = curve.RefDate();
        List <Date> ToDate  = y.scheduleLeg2.toDates.ToList();

        ToDate.RemoveAt(ToDate.Count - 1);  // remove last element
        T = (from c in ToDate
             select refDate.YF_365(c)).ToArray();
        // df- getting relevant dates
        Date[] dfDate  = y.scheduleLeg2.payDates;
        int    Ncaplet = yf.Length; // number of caplets

        df = new double[Ncaplet];
        // fwd rate
        fwd = new double[Ncaplet];
        Date[] fwdDate = y.scheduleLeg2.fromDates;

        for (int i = 0; i < Ncaplet; i++) // Note the loop start from 1
        {                                 // first discount factor is on first payment date of caplet (first caplet skipped)
            df[i]  = curve.Df(dfDate[i + 1]);
            fwd[i] = curve.Fwd(fwdDate[i + 1]);
        }
    }
Пример #5
0
    public static double FwdBasis(Date StartDate, string SwapTenor, IRateCurve Curve1, IRateCurve Curve2)
    {
        SwapStyle S1 = (SwapStyle) new BuildingBlockFactory().CreateBuildingBlock(StartDate, 0.0, SwapTenor, Curve1.GetSwapStyle().buildingBlockType);
        SwapStyle S2 = (SwapStyle) new BuildingBlockFactory().CreateBuildingBlock(StartDate, 0.0, SwapTenor, Curve2.GetSwapStyle().buildingBlockType);

        double[] yfFloatLeg1 = S1.scheduleLeg2.GetYFVect(S1.swapLeg2.DayCount);

        // using LINQ syntax
        double[] dfFloatLeg1 = (from d in S1.scheduleLeg2.payDates
                                select Curve1.Df(d)).ToArray <double>();
        double[] fwdFloatLeg1 = (from d in S1.scheduleLeg2.fromDates
                                 select Curve1.Fwd(d)).ToArray <double>();

        double[] yfFloatLeg2 = S2.scheduleLeg2.GetYFVect(S2.swapLeg2.DayCount);
        // using LINQ syntax
        double[] dfFloatLeg2 = (from d in S2.scheduleLeg2.payDates
                                select Curve2.Df(d)).ToArray <double>();

        double[] fwdFloatLeg2 = (from d in S2.scheduleLeg2.fromDates
                                 select Curve2.Fwd(d)).ToArray <double>();

        return(SpreadBasisFormula(yfFloatLeg1, dfFloatLeg1, fwdFloatLeg1,
                                  yfFloatLeg2, dfFloatLeg2, fwdFloatLeg2));
    }