/// <summary> /// Initializes a new instance of the <see cref="Strike"/> class. /// </summary> /// <param name="moneyness">The moneyness.</param> /// <param name="fwdPrice">The FWD price.</param> /// <param name="callPosition">The call position.</param> /// <param name="putPosition">The put position.</param> public Strike(Double moneyness, double fwdPrice, OptionPosition callPosition, OptionPosition putPosition) { VolatilityHasBeenSet = false; Volatility = null; Moneyness = 0; PriceUnits = Units.Cents; InputValidator.NotZero("StrikePrice", moneyness, true); StrikePrice = moneyness * fwdPrice; _strikePositions = new Pair <OptionPosition, OptionPosition>(callPosition, putPosition); //this.InterpModel = new SABRInterp(); InterpModel = new WingInterp(); }
/// <summary> /// Initializes a new instance of the <see cref="Strike"/> class. /// </summary> /// <param name="strikePrice">The strike price.</param> /// <param name="callPosition">The call position.</param> /// <param name="putPosition">The put position.</param> /// <param name="units">The units.</param> public Strike(Double strikePrice, OptionPosition callPosition, OptionPosition putPosition, Units units) { VolatilityHasBeenSet = false; Volatility = null; Moneyness = 0; InputValidator.NotZero("StrikePrice", strikePrice, true); StrikePrice = strikePrice; _strikePositions = new Pair <OptionPosition, OptionPosition>(callPosition, putPosition); // this.InterpModel = new SABRInterp(); InterpModel = new WingInterp(); PriceUnits = units; }
/// <summary> /// Calibrates this instance. /// </summary> public void Calibrate() { SetInterpolatedCurve(); foreach (ForwardExpiry fwdExp in NodalExpiries) { foreach (Strike strike in fwdExp.Strikes) { var wingModel = new WingInterp(); InterpCurve.Forward = Convert.ToDouble(fwdExp.FwdPrice); InterpCurve.Spot = Convert.ToDouble(SpotPrice); wingModel.Fit(this, strike.StrikePrice, fwdExp.ExpiryDate); strike.InterpModel = wingModel; } } }
/// <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); }