/// <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)); }
/// <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); }
/// <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); }
/// <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())); }
/// <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())); }
/// <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); }
/// <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); }
/// <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); }
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); }
/// <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); }
/// <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)); }
/// <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]); }