示例#1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="valueDate"></param>
        /// <param name="datesAsArray"></param>
        /// <param name="amountsAsArray"></param>
        /// <param name="interpType"></param>
        /// <returns></returns>
        public double InterpolateOnDates(DateTime valueDate, Excel.Range datesAsArray, Excel.Range amountsAsArray, string interpType)
        {
            //At this stage only linear interpolation is supported
            var dates   = DataRangeHelper.StripDateTimeRange(datesAsArray);
            var amounts = DataRangeHelper.StripDoubleRange(amountsAsArray);

            return(EquitiesLibrary.InterpolateOnDates(valueDate, dates.ToArray(), amounts.ToArray(), interpType));
        }
示例#2
0
        /// <summary>
        /// Adds the period to an array of dates.
        /// </summary>
        /// <param name="dateArray">The dates as an array.</param>
        /// <param name="dayType">The day type.</param>
        /// <param name="periodInterval">The period interval.</param>
        /// <param name="businessDayConvention">The business day convention.</param>
        /// <param name="location">The calendar. </param>
        /// <returns>A range of dates.</returns>
        public object[,] AddPeriods1(Excel.Range dateArray, string dayType, string periodInterval, string businessDayConvention, string location)
        {
            List <DateTime> dateVals = DataRangeHelper.StripDateTimeRange(dateArray);
            List <DateTime> periods  = CalendarService.AddPeriods(dateVals.ToArray(), dayType, periodInterval, businessDayConvention, new[] { location });
            var             resVals  = RangeHelper.ConvertArrayToRange(periods);

            return(resVals);
        }
示例#3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="spot"></param>
        /// <param name="strike"></param>
        /// <param name="vol"></param>
        /// <param name="paystyle"></param>
        /// <param name="today"></param>
        /// <param name="expiry"></param>
        /// <param name="zeroDatesAsArray"></param>
        /// <param name="zeroRatesAsArray"></param>
        /// <param name="q"></param>
        /// <returns></returns>
        public double BlackScholesPricerContDiv(double spot, double strike, double vol, string paystyle, DateTime today,
                                                DateTime expiry, Excel.Range zeroDatesAsArray, Excel.Range zeroRatesAsArray, double q)
        {
            var    zeroDates = DataRangeHelper.StripDateTimeRange(zeroDatesAsArray);
            var    zeroRates = DataRangeHelper.StripDoubleRange(zeroRatesAsArray);
            double pr        = EquitiesLibrary.BlackScholesPricerContDiv(spot, strike, vol, paystyle, today, expiry, zeroDates.ToArray(), zeroRates.ToArray(), q);

            return(pr);
        }
示例#4
0
        /// <summary>
        /// Returns the PV (as at the valueDate) of the payment stream.
        /// Only payments occuring on or between valueDate and finalDate are included in the sum.
        /// All other payments are ignored.
        /// </summary>
        /// <param name="valueDate">The date at which the PV is taken.</param>
        /// <param name="paymentDatesAsArray">The dates on which payments are made, in ascending order.</param>
        /// <param name="paymentAmountsAsArray">The amounds of payments.</param>
        /// <param name="zeroDatesAsArray">The dates corresponding to the ZCB discount curve, in ascending order.</param>
        /// <param name="zeroRatesAsArray">The rates corresponding to the ZCB discount curve.</param>
        /// <param name="finalDate">The final date on which payments are to be included.</param>
        /// <returns>A double representing the PV.</returns>
        public double PVofPaymentStream(DateTime valueDate, DateTime finalDate, Excel.Range paymentDatesAsArray, Excel.Range paymentAmountsAsArray,
                                        Excel.Range zeroDatesAsArray, Excel.Range zeroRatesAsArray)
        {
            var paymentDates   = DataRangeHelper.StripDateTimeRange(paymentDatesAsArray);
            var paymentAmounts = DataRangeHelper.StripDoubleRange(paymentAmountsAsArray);
            var zeroDates      = DataRangeHelper.StripDateTimeRange(zeroDatesAsArray);
            var zeroRates      = DataRangeHelper.StripDoubleRange(zeroRatesAsArray);

            return(EquitiesLibrary.PVofPaymentStream(valueDate, finalDate, paymentDates.ToArray(), paymentAmounts.ToArray(), zeroDates.ToArray(), zeroRates.ToArray()));
        }
示例#5
0
        /// <summary>
        /// Gets the ATM forward.
        /// </summary>
        /// <param name="spot"></param>
        /// <param name="zeroDatesAsArray"></param>
        /// <param name="zeroRatesAsArray">The zero curve.</param>
        /// <param name="divDatesAsArray"></param>
        /// <param name="divAmsAsArray">The div curve.</param>
        /// <param name="today"></param>
        /// <param name="expiry"></param>
        /// <returns></returns>
        public double GetForward(DateTime today, DateTime expiry, double spot, Excel.Range zeroDatesAsArray, Excel.Range zeroRatesAsArray,
                                 Excel.Range divDatesAsArray, Excel.Range divAmsAsArray)
        {
            var zeroDates = DataRangeHelper.StripDateTimeRange(zeroDatesAsArray);
            var zeroRates = DataRangeHelper.StripDoubleRange(zeroRatesAsArray);
            var divDates  = DataRangeHelper.StripDateTimeRange(divDatesAsArray);
            var divAms    = DataRangeHelper.StripDoubleRange(divAmsAsArray);

            return(EquitiesLibrary.GetForward(today, expiry, spot, zeroDates.ToArray(), zeroRates.ToArray(), divDates.ToArray(), divAms.ToArray()));
        }
示例#6
0
        /// <summary>
        /// Pricers the specified style.
        /// </summary>
        /// <param name="style">The style.</param>
        /// <param name="spot">The spot.</param>
        /// <param name="strike">The strike.</param>
        /// <param name="vol">The vol.</param>
        /// <param name="today"></param>
        /// <param name="expiry"></param>
        /// <param name="paystyle">The paystyle.</param>
        /// <param name="zeroDatesAsArray"></param>
        /// <param name="zeroRatesAsArray">The zero curve.</param>
        /// <param name="divDatesAsArray"></param>
        /// <param name="divAmsAsArray">The div curve.</param>
        /// <param name="gridsteps">The gridsteps.</param>
        /// <param name="smoo">The smoo.</param>
        /// <param name="flatFlag">if set to <c>true</c> [flat flag].</param>
        /// <returns></returns>
        public double BinomialRelativePricer(string style, double spot, double strike, double vol, DateTime today, DateTime expiry,
                                             string paystyle, Excel.Range zeroDatesAsArray, Excel.Range zeroRatesAsArray, Excel.Range divDatesAsArray, Excel.Range divAmsAsArray, double gridsteps, string smoo, bool flatFlag)
        {
            var    divDates  = DataRangeHelper.StripDateTimeRange(divDatesAsArray);
            var    divAms    = DataRangeHelper.StripDoubleRange(divAmsAsArray);
            var    zeroDates = DataRangeHelper.StripDateTimeRange(zeroDatesAsArray);
            var    zeroRates = DataRangeHelper.StripDoubleRange(zeroRatesAsArray);
            double pr        = EquitiesLibrary.BinomialRelativePricer(style, spot, strike, vol, today, expiry, paystyle, zeroDates.ToArray(), zeroRates.ToArray(), divDates.ToArray(), divAms.ToArray(), gridsteps, smoo, flatFlag);

            return(pr);
        }
示例#7
0
        /// <summary>
        /// Gets the greeks.
        /// </summary>
        /// <param name="style">The style.</param>
        /// <param name="spot">The spot.</param>
        /// <param name="strike">The strike.</param>
        /// <param name="vol">The vol.</param>
        /// <param name="expiry"></param>
        /// <param name="paystyle">The paystyle.</param>
        /// <param name="zeroDatesAsArray"></param>
        /// <param name="zeroRatesAsArray">The zero curve.</param>
        /// <param name="divDatesAsArray"></param>
        /// <param name="divAmsAsArray">The div curve.</param>
        /// <param name="gridsteps">The gridsteps.</param>
        /// <param name="smoo">The smoo.</param>
        /// <param name="flatFlag">if set to <c>true</c> [flat flag].</param>
        /// <param name="today"></param>
        /// <returns></returns>
        public object[,] BinomialRelativeGetGreeks(string style, double spot, double strike, double vol, DateTime today, DateTime expiry,
                                                   string paystyle, Excel.Range zeroDatesAsArray, Excel.Range zeroRatesAsArray, Excel.Range divDatesAsArray, Excel.Range divAmsAsArray, double gridsteps, string smoo, bool flatFlag)
        {
            var zeroDates = DataRangeHelper.StripDateTimeRange(zeroDatesAsArray);
            var zeroRates = DataRangeHelper.StripDoubleRange(zeroRatesAsArray);
            var divDates  = DataRangeHelper.StripDateTimeRange(divDatesAsArray);
            var divAms    = DataRangeHelper.StripDoubleRange(divAmsAsArray);
            var retArray  = EquitiesLibrary.BinomialRelativeGetGreeks(style, spot, strike, vol, today, expiry, paystyle, zeroDates.ToArray(), zeroRates.ToArray(), divDates.ToArray(), divAms.ToArray(), gridsteps, smoo, flatFlag);
            var result    = RangeHelper.ConvertArrayToRange(retArray);

            return(result);
        }
示例#8
0
        /// <summary>
        /// Advances the specified date using the underlying calendar locations.
        /// </summary>
        /// <param name="locationsAsArray">The locations range as an array.</param>
        /// <param name="dateRange">The date.</param>
        /// <param name="dayType">The day type: cakendat or business.</param>
        /// <param name="periodInteval">The period inteval.</param>
        /// <param name="businessDayConvention">The business day convention.</param>
        /// <returns>The vertical range of adjusted dates.</returns>
        public object[,] AdvanceDateRange(Excel.Range locationsAsArray, Excel.Range dateRange, string dayType, string periodInteval, string businessDayConvention)
        {
            List <string>   unqVals  = DataRangeHelper.StripRange(locationsAsArray);
            List <DateTime> unqDates = DataRangeHelper.StripDateTimeRange(dateRange);
            List <DateTime> result   = unqDates.Select(element => CalendarService.Advance(unqVals.ToArray(), element, dayType, periodInteval, businessDayConvention)).ToList();
            var             resVals  = new object[result.Count, 1];

            for (int idx = 0; idx < resVals.Length; ++idx)
            {
                resVals[idx, 0] = result[idx];
            }
            return(resVals);
        }
示例#9
0
        public string CreateCalendar(Excel.Range propertiesRange, Excel.Range dateArray)
        {
            var properties = propertiesRange.Value[System.Reflection.Missing.Value] as object[, ];

            properties = (object[, ])DataRangeHelper.TrimNulls(properties);
            var namedValueSet = properties.ToNamedValueSet();
            var dates         = DataRangeHelper.StripDateTimeRange(dateArray);
            var identifier    = namedValueSet.GetValue <string>("UniqueIdentifier", true);
            var calendar      = BusinessCalendarHelper.CreateCalendar(namedValueSet, dates);

            Engine.Cache.SaveObject(calendar, NameSpace + "." + identifier, namedValueSet);
            Engine.Logger.LogDebug("Loaded business center holiday dates: {0}", identifier);
            return(identifier);
        }
示例#10
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="baseAmount"></param>
        /// <param name="valueDate"></param>
        /// <param name="finalDatesAsArray"></param>
        /// <param name="paymentDatesAsArray"></param>
        /// <param name="paymentAmountsAsArray"></param>
        /// <param name="zeroDatesAsArray"></param>
        /// <param name="zeroRatesAsArray"></param>
        /// <returns></returns>
        public object[,] DivYield(double baseAmount, DateTime valueDate, Excel.Range finalDatesAsArray, Excel.Range paymentDatesAsArray,
                                  Excel.Range paymentAmountsAsArray, Excel.Range zeroDatesAsArray,
                                  Excel.Range zeroRatesAsArray)
        {
            var finalDates     = DataRangeHelper.StripDateTimeRange(finalDatesAsArray);
            var paymentDates   = DataRangeHelper.StripDateTimeRange(paymentDatesAsArray);
            var paymentAmounts = DataRangeHelper.StripDoubleRange(paymentAmountsAsArray);
            var zeroDates      = DataRangeHelper.StripDateTimeRange(zeroDatesAsArray);
            var zeroRates      = DataRangeHelper.StripDoubleRange(zeroRatesAsArray);
            var retArray       = EquitiesLibrary.DivYield(baseAmount, valueDate, finalDates.ToArray(), paymentDates.ToArray(), paymentAmounts.ToArray(), zeroDates.ToArray(), zeroRates.ToArray());
            var result         = RangeHelper.ConvertArrayToRange(retArray);

            return(result);
        }
示例#11
0
        /// <summary>
        /// Returns the calculated year fraction for the dates provided.
        /// </summary>
        /// <param name="startDateArray">The start date array.</param>
        /// <param name="endDateArray">The end date arrray.</param>
        /// <param name="dayCountType">The day count fraction type, eg Actual/365.</param>
        /// <returns>The year fractions as a range of decimals.</returns>
        public object[,] YearFractions(Excel.Range startDateArray, Excel.Range endDateArray, string dayCountType)
        {
            var unqStartDateVals = DataRangeHelper.StripDateTimeRange(startDateArray);
            var unqEndDateVals   = DataRangeHelper.StripDateTimeRange(endDateArray);
            int count            = unqStartDateVals.Count;

            if (count != unqEndDateVals.Count)
            {
                throw new ArgumentException("Size of startDates and endDates arrays must match");
            }
            IDayCounter dayCounter    = DayCounterHelper.Parse(dayCountType);
            var         yearFractions = new List <double>();

            for (int i = 0; i < count; i++)
            {
                yearFractions.Add(dayCounter.YearFraction(unqStartDateVals[i], unqEndDateVals[i]));
            }
            return(RangeHelper.ConvertArrayToRange(yearFractions));
        }
示例#12
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="today"></param>
        /// <param name="spot"></param>
        /// <param name="strike"></param>
        /// <param name="sig"></param>
        /// <param name="dexp"></param>
        /// <param name="sPay"></param>
        /// <param name="sStyle"></param>
        /// <param name="nGrid"></param>
        /// <param name="tStep"></param>
        /// <param name="iNum"></param>
        /// <param name="divamsAsArray"></param>
        /// <param name="divdatesAsArray"></param>
        /// <param name="zeramsAsArray"></param>
        /// <param name="zerdatesAsArray"></param>
        /// <returns></returns>
        public double GetEquityGreeks(DateTime today,
                                      double spot,
                                      double strike,
                                      double sig,
                                      DateTime dexp,
                                      string sPay,
                                      string sStyle,
                                      int nGrid,
                                      double tStep,
                                      int iNum,
                                      Excel.Range divamsAsArray,
                                      Excel.Range divdatesAsArray,
                                      Excel.Range zeramsAsArray,
                                      Excel.Range zerdatesAsArray
                                      )
        {
            //Map the ranges
            var divams   = DataRangeHelper.StripDoubleRange(divamsAsArray);
            var divdates = DataRangeHelper.StripDateTimeRange(divamsAsArray);
            var zerams   = DataRangeHelper.StripDoubleRange(zeramsAsArray);
            var zerdates = DataRangeHelper.StripDateTimeRange(zerdatesAsArray);
            //set up the DivList
            int nd    = divdates.Count; //GetUpperBound(0) + 1;
            var myDiv = new DivList {
                Divpoints = nd
            };

            myDiv.MakeArrays();
            for (int idx = 0; idx != nd; idx++)
            {
                double   r  = divams[idx];
                DateTime dp = divdates[idx];
                TimeSpan ts = dp - today;
                myDiv.SetD(idx, r, ts.Days / 365.0);
            }
            //set up the zero
            int nz     = zerdates.Count;//GetUpperBound(0) + 1;
            var myZero = new ZeroCurve {
                Ratepoints = nz
            };

            myZero.MakeArrays();
            for (int idx = 0; idx != nz; idx++)
            {
                double   r  = zerams[idx];
                DateTime dp = zerdates[idx];
                TimeSpan ts = dp - today;
                myZero.SetR(idx, r, ts.Days / 365.0);
            }
            //compute the discounted dividends to  expiry and work out continuous
            TimeSpan tsE  = dexp - today;
            double   texp = tsE.Days / 365.0;

            for (int idx = 0; idx != nd; idx++)
            {
                if (myDiv.GetT(idx) <= texp)
                {
                    double d = myDiv.GetD(idx) * Math.Exp(-myDiv.GetT(idx) * myZero.LinInterp(myDiv.GetT(idx)));
                }
            }
            //double qc = -Math.Log((spot - sum) / spot) / texp;
            //double rc = myZero.linInterp(texp);
            var myG = new Grid
            {
                XL     = Math.Log(spot) - 8.0 * sig * Math.Sqrt(texp),
                Xu     = Math.Log(spot) + 8.0 * sig * Math.Sqrt(texp),
                Steps  = nGrid,
                Strike = strike,
                Spot   = spot,
                SPay   = sPay,
                SStyle = sStyle,
                T      = texp
            };

            myG.NTsteps = Convert.ToInt32(myG.T / tStep);
            myG.Sig     = sig;
            var    greeks = new double[4];
            double price  = myG.Pricer(myZero, myDiv, ref greeks, true);

            myG.Sig += 0.01;
            double priceUp = myG.Pricer(myZero, myDiv, ref greeks, false);

            greeks[3] = priceUp - price;
            return(greeks[iNum]);
        }