/// <summary> /// Values at, overriding calibrated Wing Model with supplied parms /// </summary> /// <param name="stock"></param> /// <param name="expiry">The expiry.</param> /// <param name="strikes">The strikes.</param> /// <param name="parms">The parms.</param> /// <param name="oride"></param> /// <param name="cache">if set to <c>true</c> [cache].</param> /// <returns></returns> public ForwardExpiry ValueAt(Stock stock, DateTime expiry, List <Double> strikes, OrcWingParameters parms, bool oride, bool cache) { var fwdExpiry = new ForwardExpiry { ExpiryDate = expiry }; double forward = stock.GetForward(stock.Date, expiry); fwdExpiry.FwdPrice = Convert.ToDecimal(forward); foreach (double strike in strikes) { double val = OrcWingVol.Value(strike, parms); IVolatilityPoint vp = new VolatilityPoint(); vp.SetVolatility(Convert.ToDecimal(val), VolatilityState.Default()); bool node = VolatilitySurfaceHelper.IsMatch(strike, expiry, NodalExpiries); Strike newstrike; if (node & oride) { newstrike = VolatilitySurfaceHelper.GetStrike(strike, expiry, NodalExpiries); //new data points, derefernce fitting model newstrike.InterpModel = null; } else { //var wingModel = new WingInterp {WingParams = parms}; newstrike = new Strike { StrikePrice = strike, InterpModel = null }; //newstrike.InterpModel = wingModel; fwdExpiry.AddStrike(newstrike, node); } newstrike.SetVolatility(vp); } return(fwdExpiry); }
private static object[,] DisplayVolatilitySurface2(Pair <PricingStructure, PricingStructureValuation> fpMLPair) { var points = ((VolatilityMatrix)fpMLPair.Second).dataPoints.point; var matrixAsTwoDimArray = VolatilitySurfaceHelper.GetExpirationByStikeVolatilityMatrixWithDimensions(points); return(matrixAsTwoDimArray); }
/// <summary> /// /// </summary> /// <param name="expirationAsDate"></param> /// <param name="strike"></param> /// <returns></returns> public double GetValueByExpirationAndStrike(DateTime expirationAsDate, double strike) { var dataPoints = GetDataPoints(); var baseDate = PricingStructureValuation.baseDate.Value; double dimension1 = (expirationAsDate - baseDate).TotalDays / 365.0; return(VolatilitySurfaceHelper.GetValue(dataPoints, dimension1, strike)); }
public void LoadInterestRateVolCurveTest() { CreateATMRateVolCurve("AUD", "3M", IrVolInstruments, IrVolValues, IrStrikes); var curve = (CapVolatilityCurve)CurveEngine.LoadVolatilityCurve(Market, "AUD", "3M", null); Assert.IsNotNull(curve); // 3M does exist Assert.AreEqual("3M", curve.GetPricingStructureId().Properties.GetString("IndexTenor", true)); //var baseDate = curve.GetBaseDate(); var expiration = VolatilitySurfaceHelper.GetDimensionValues(curve.GetVolatilityMatrix().dataPoints?.point, CubeDimension.Expiration); var volatilities = VolatilitySurfaceHelper.GetDimensionValues(curve.GetVolatilityMatrix().dataPoints?.point, CubeDimension.Volatility); var valArray = new List <Decimal>(); foreach (var vol in volatilities) { valArray.Add((decimal)vol); } var expiryArray = new List <TimeDimension>(); //var valArray = new List<Decimal>(); //Debug.Print(baseDate.ToString(CultureInfo.InvariantCulture)); foreach (var expiry in expiration) { //Temporary if (expiry is TimeDimension timeDimension) { expiryArray.Add(timeDimension); } //var date = expiry as DateTime? ?? baseDate.AddDays(1); //expiryArray.Add(date); //Debug.Print(expiry.ToString()); } var termPoints = TermPointsFactory.Create(expiryArray, valArray); var termCurve = new TermCurve { point = termPoints }; var output = XmlSerializerHelper.SerializeToString(termCurve); Debug.Print(output); }
/// <summary> /// Values at. /// </summary> /// <param name="stock"></param> /// <param name="expiries">The expiries.</param> /// <param name="strikes">The strikes.</param> /// <param name="?">Cache to vol object</param> /// <param name="cache"></param> /// <returns></returns> public List <ForwardExpiry> ValueAt(Stock stock, List <DateTime> expiries, List <Double> strikes, bool cache) { var forwardExpiries = new List <ForwardExpiry>(); foreach (DateTime exp in expiries) { var fwdExpiry = new ForwardExpiry(); foreach (double str in strikes) { var wingModel = new WingInterp(); double forward = stock.GetForward(stock.Date, exp.Date); double spot = Convert.ToDouble(stock.Spot); fwdExpiry.FwdPrice = Convert.ToDecimal(forward); double y = str; double x = (exp.Subtract(Date)).Days / 365.0; IPoint point = new Point2D(x, y); InterpCurve.Forward = forward; InterpCurve.Spot = spot; var val = InterpCurve.Value(point); IVolatilityPoint vp = new VolatilityPoint(); vp.SetVolatility(Convert.ToDecimal(val), VolatilityState.Default()); fwdExpiry.ExpiryDate = exp; bool node = VolatilitySurfaceHelper.IsMatch(str, exp, NodalExpiries); // copy model used to return ForwardExpiry object var newstrike = new Strike { StrikePrice = str }; var wing = (WingModelInterpolation)InterpCurve.GetYAxisInterpolatingFunction(); //SABRModelInterpolation wing = (SABRModelInterpolation)_interpCurve.GetYAxisInterpolatingFunction(); wingModel.WingParams = wing.WingParameters; newstrike.InterpModel = wingModel; fwdExpiry.AddStrike(newstrike, node); newstrike.SetVolatility(vp); } forwardExpiries.Add(fwdExpiry); } return(forwardExpiries); }
///<summary> ///</summary> ///<param name="dimension1"></param> ///<param name="dimension2"></param> ///<returns></returns> ///<exception cref="NotImplementedException"></exception> public double GetValue(double dimension1, double dimension2) { var dataPoints = GetDataPoints(); return(VolatilitySurfaceHelper.GetValue(dataPoints, dimension1, dimension2)); }