예제 #1
0
        public static object eqRatesCompoundFactor(
            [ExcelArgument(Description = "interest rate ")] double r,
            [ExcelArgument(Description = "time in years ")] double t,
            [ExcelArgument(Description = "DayCounter (e.g. Actual365) ")] string dc,
            [ExcelArgument(Description = "Compounding (e.g. Continuous) ")] string comp,
            [ExcelArgument(Description = "Frequency (e.g. Annual) ")] string freq,
            [ExcelArgument(Description = "trigger ")] object trigger)
        {
            if (ExcelUtil.CallFromWizard())
            {
                return("");
            }

            string callerAddress = ExcelUtil.getActiveCellAddress();

            try
            {
                DayCounter  daycounter  = EliteQuant.EQConverter.ConvertObject <DayCounter>(dc);
                Compounding compounding = EliteQuant.EQConverter.ConvertObject <Compounding>(comp);
                Frequency   frequency   = EliteQuant.EQConverter.ConvertObject <Frequency>(freq);

                InterestRate ir = new InterestRate(r, daycounter, compounding, frequency);

                return(ir.compoundFactor(t));
            }
            catch (Exception e)
            {
                ExcelUtil.logError(callerAddress, System.Reflection.MethodInfo.GetCurrentMethod().Name.ToString(), e.Message);
                return("#EQ_ERR!");
            }
        }
예제 #2
0
        public ForwardRateAgreement(Date valueDate, Date maturityDate, Position.Type type, double strikeForwardRate,
                                    double notionalAmount, IborIndex index, Handle <YieldTermStructure> discountCurve)
            : base(
                index.dayCounter(), index.fixingCalendar(), index.businessDayConvention(), index.fixingDays(), new Payoff(),
                valueDate, maturityDate, discountCurve)
        {
            fraType_        = type;
            notionalAmount_ = notionalAmount;
            index_          = index;

            Utils.QL_REQUIRE(notionalAmount > 0.0, () => "notional Amount must be positive");

            // do I adjust this ?
            Date fixingDate = calendar_.advance(valueDate_, -settlementDays_, TimeUnit.Days);

            forwardRate_       = new InterestRate(index.fixing(fixingDate), index.dayCounter(), Compounding.Simple, Frequency.Once);
            strikeForwardRate_ = new InterestRate(strikeForwardRate, index.dayCounter(), Compounding.Simple, Frequency.Once);
            double strike = notionalAmount_ * strikeForwardRate_.compoundFactor(valueDate_, maturityDate_);

            payoff_ = new ForwardTypePayoff(fraType_, strike);
            // incomeDiscountCurve_ is irrelevant to an FRA
            incomeDiscountCurve_ = discountCurve_;
            // income is irrelevant to FRA - set it to zero
            underlyingIncome_ = 0.0;

            index_.registerWith(update);
        }
예제 #3
0
        public void testConversions()
        {
            InterestRateData[] cases =
            {
                // data from "Option Pricing Formulas", Haug, pag.181-182
                // Rate,Compounding,        Frequency,   Time, Compounding2,      Frequency2,  Rate2, precision
                new InterestRateData(0.0800, Compounding.Compounded,           Frequency.Quarterly,            1.00, Compounding.Continuous,           Frequency.Annual,           0.0792, 4),
                new InterestRateData(0.1200, Compounding.Continuous,           Frequency.Annual,               1.00, Compounding.Compounded,           Frequency.Annual,           0.1275, 4),
                new InterestRateData(0.0800, Compounding.Compounded,           Frequency.Quarterly,            1.00, Compounding.Compounded,           Frequency.Annual,           0.0824, 4),
                new InterestRateData(0.0700, Compounding.Compounded,           Frequency.Quarterly,            1.00, Compounding.Compounded,           Frequency.Semiannual,       0.0706, 4),
                // undocumented, but reasonable :)
                new InterestRateData(0.0100, Compounding.Compounded,           Frequency.Annual,               1.00, Compounding.Simple,               Frequency.Annual,           0.0100, 4),
                new InterestRateData(0.0200, Compounding.Simple,               Frequency.Annual,               1.00, Compounding.Compounded,           Frequency.Annual,           0.0200, 4),
                new InterestRateData(0.0300, Compounding.Compounded,           Frequency.Semiannual,           0.50, Compounding.Simple,               Frequency.Annual,           0.0300, 4),
                new InterestRateData(0.0400, Compounding.Simple,               Frequency.Annual,               0.50, Compounding.Compounded,           Frequency.Semiannual,       0.0400, 4),
                new InterestRateData(0.0500, Compounding.Compounded,           Frequency.EveryFourthMonth,  1.0 / 3, Compounding.Simple,               Frequency.Annual,           0.0500, 4),
                new InterestRateData(0.0600, Compounding.Simple,               Frequency.Annual,            1.0 / 3, Compounding.Compounded,           Frequency.EveryFourthMonth, 0.0600, 4),
                new InterestRateData(0.0500, Compounding.Compounded,           Frequency.Quarterly,            0.25, Compounding.Simple,               Frequency.Annual,           0.0500, 4),
                new InterestRateData(0.0600, Compounding.Simple,               Frequency.Annual,               0.25, Compounding.Compounded,           Frequency.Quarterly,        0.0600, 4),
                new InterestRateData(0.0700, Compounding.Compounded,           Frequency.Bimonthly,         1.0 / 6, Compounding.Simple,               Frequency.Annual,           0.0700, 4),
                new InterestRateData(0.0800, Compounding.Simple,               Frequency.Annual,            1.0 / 6, Compounding.Compounded,           Frequency.Bimonthly,        0.0800, 4),
                new InterestRateData(0.0900, Compounding.Compounded,           Frequency.Monthly,          1.0 / 12, Compounding.Simple,               Frequency.Annual,           0.0900, 4),
                new InterestRateData(0.1000, Compounding.Simple,               Frequency.Annual,           1.0 / 12, Compounding.Compounded,           Frequency.Monthly,          0.1000, 4),

                new InterestRateData(0.0300, Compounding.SimpleThenCompounded, Frequency.Semiannual,           0.25, Compounding.Simple,               Frequency.Annual,           0.0300, 4),
                new InterestRateData(0.0300, Compounding.SimpleThenCompounded, Frequency.Semiannual,           0.25, Compounding.Simple,               Frequency.Semiannual,       0.0300, 4),
                new InterestRateData(0.0300, Compounding.SimpleThenCompounded, Frequency.Semiannual,           0.25, Compounding.Simple,               Frequency.Quarterly,        0.0300, 4),
                new InterestRateData(0.0300, Compounding.SimpleThenCompounded, Frequency.Semiannual,           0.50, Compounding.Simple,               Frequency.Annual,           0.0300, 4),
                new InterestRateData(0.0300, Compounding.SimpleThenCompounded, Frequency.Semiannual,           0.50, Compounding.Simple,               Frequency.Semiannual,       0.0300, 4),
                new InterestRateData(0.0300, Compounding.SimpleThenCompounded, Frequency.Semiannual,           0.75, Compounding.Compounded,           Frequency.Semiannual,       0.0300, 4),

                new InterestRateData(0.0400, Compounding.Simple,               Frequency.Semiannual,           0.25, Compounding.SimpleThenCompounded, Frequency.Quarterly,        0.0400, 4),
                new InterestRateData(0.0400, Compounding.Simple,               Frequency.Semiannual,           0.25, Compounding.SimpleThenCompounded, Frequency.Semiannual,       0.0400, 4),
                new InterestRateData(0.0400, Compounding.Simple,               Frequency.Semiannual,           0.25, Compounding.SimpleThenCompounded, Frequency.Annual,           0.0400, 4),

                new InterestRateData(0.0400, Compounding.Compounded,           Frequency.Quarterly,            0.50, Compounding.SimpleThenCompounded, Frequency.Quarterly,        0.0400, 4),
                new InterestRateData(0.0400, Compounding.Simple,               Frequency.Semiannual,           0.50, Compounding.SimpleThenCompounded, Frequency.Semiannual,       0.0400, 4),
                new InterestRateData(0.0400, Compounding.Simple,               Frequency.Semiannual,           0.50, Compounding.SimpleThenCompounded, Frequency.Annual,           0.0400, 4),

                new InterestRateData(0.0400, Compounding.Compounded,           Frequency.Quarterly,            0.75, Compounding.SimpleThenCompounded, Frequency.Quarterly,        0.0400, 4),
                new InterestRateData(0.0400, Compounding.Compounded,           Frequency.Semiannual,           0.75, Compounding.SimpleThenCompounded, Frequency.Semiannual,       0.0400, 4),
                new InterestRateData(0.0400, Compounding.Simple,               Frequency.Semiannual,           0.75, Compounding.SimpleThenCompounded, Frequency.Annual,           0.0400, 4)
            };

            Rounding     roundingPrecision;
            double       r3;
            double       r2;
            Date         d1 = Date.Today;
            Date         d2;
            InterestRate ir;
            InterestRate ir2;
            InterestRate ir3;
            InterestRate expectedIR;
            double       compoundf;
            double       error;
            double       disc;

            for (int i = 0; i < cases.Length - 1; i++)
            {
                ir = new InterestRate(cases[i].r, new Actual360(), cases[i].comp, cases[i].freq);
                d2 = d1 + new Period((int)(360 * cases[i].t + 0.5), TimeUnit.Days);
                roundingPrecision = new Rounding(cases[i].precision);

                // check that the compound factor is the inverse of the discount factor
                compoundf = ir.compoundFactor(d1, d2);
                disc      = ir.discountFactor(d1, d2);
                error     = Math.Abs(disc - 1.0 / compoundf);
                if (error > 1e-15)
                {
                    QAssert.Fail(ir + "  1.0/compound_factor: " + 1.0 / compoundf);
                }

                // check that the equivalent InterestRate with *same* daycounter,
                // compounding, and frequency is the *same* InterestRate
                //ir2 = ir.equivalentRate(d1, d2, ir.dayCounter(), ir.compounding(), ir.frequency());
                ir2   = ir.equivalentRate(ir.dayCounter(), ir.compounding(), ir.frequency(), d1, d2);
                error = Math.Abs(ir.rate() - ir2.rate());
                if (error > 1e-15)
                {
                    QAssert.Fail("original interest rate: " + ir + " equivalent interest rate: " + ir2 + " rate error: " + error);
                }
                if (ir.dayCounter() != ir2.dayCounter())
                {
                    QAssert.Fail("day counter error original interest rate: " + ir + " equivalent interest rate: " + ir2);
                }
                if (ir.compounding() != ir2.compounding())
                {
                    QAssert.Fail("compounding error original interest rate: " + ir + " equivalent interest rate: " + ir2);
                }
                if (ir.frequency() != ir2.frequency())
                {
                    QAssert.Fail("frequency error original interest rate: " + ir + " equivalent interest rate: " + ir2);
                }

                // check that the equivalent rate with *same* daycounter,
                // compounding, and frequency is the *same* rate
                //r2 = ir.equivalentRate(d1, d2, ir.dayCounter(), ir.compounding(), ir.frequency()).rate();
                r2    = ir.equivalentRate(ir.dayCounter(), ir.compounding(), ir.frequency(), d1, d2).value();
                error = Math.Abs(ir.rate() - r2);
                if (error > 1e-15)
                {
                    QAssert.Fail("original rate: " + ir + " equivalent rate: " + r2 + " error: " + error);
                }

                // check that the equivalent InterestRate with *different*
                // compounding, and frequency is the *expected* InterestRate
                //ir3 = ir.equivalentRate(d1, d2, ir.dayCounter(), cases[i].comp2, cases[i].freq2);
                ir3        = ir.equivalentRate(ir.dayCounter(), cases[i].comp2, cases[i].freq2, d1, d2);
                expectedIR = new InterestRate(cases[i].expected, ir.dayCounter(), cases[i].comp2, cases[i].freq2);
                r3         = roundingPrecision.Round(ir3.rate());
                error      = Math.Abs(r3 - expectedIR.rate());
                if (error > 1.0e-17)
                {
                    QAssert.Fail("original interest rate: " + ir + " calculated equivalent interest rate: " + ir3 + " truncated equivalent rate: " + r3 + " expected equivalent interest rate: " + expectedIR + " rate error: " + error);
                }
                if (ir3.dayCounter() != expectedIR.dayCounter())
                {
                    QAssert.Fail("day counter error original interest rate: " + ir3 + " equivalent interest rate: " + expectedIR);
                }
                if (ir3.compounding() != expectedIR.compounding())
                {
                    QAssert.Fail("compounding error original interest rate: " + ir3 + " equivalent interest rate: " + expectedIR);
                }
                if (ir3.frequency() != expectedIR.frequency())
                {
                    QAssert.Fail("frequency error original interest rate: " + ir3 + " equivalent interest rate: " + expectedIR);
                }

                // check that the equivalent rate with *different*
                // compounding, and frequency is the *expected* rate
                //r3 = ir.equivalentRate(d1, d2, ir.dayCounter(), cases[i].comp2, cases[i].freq2).rate();
                r3    = ir.equivalentRate(ir.dayCounter(), cases[i].comp2, cases[i].freq2, d1, d2).value();
                r3    = roundingPrecision.Round(r3);
                error = Math.Abs(r3 - cases[i].expected);
                if (error > 1.0e-17)
                {
                    QAssert.Fail("calculated equivalent rate: " + r3 + " expected equivalent rate: " + cases[i].expected + " error: " + error);
                }
            }
        }