protected virtual Decimal CalculateOptionValue2()
        {
            var result = OptionAnalytics.Opt(AnalyticParameters.IsCall, (double)AnalyticParameters.Rate + (double)AnalyticParameters.Spread - 0.0001, (double)GetStrike(),
                                             (double)GetVolatility(), (double)AnalyticParameters.ExpiryYearFraction);

            return((decimal)result);
        }
예제 #2
0
        protected virtual Decimal CalculateOptionDelta()
        {
            var result = OptionAnalytics.OptWithGreeks(GetIsCall(), (double)FloatingIndex, (double)GetStrike(),
                                                       (double)GetVolatility(), (double)GetExpiry())[1];

            return((decimal)result);
        }
        protected Decimal CalculateOptionValue()
        {
            var result = OptionAnalytics.Opt(AnalyticParameters.IsCall, (double)AnalyticParameters.SwapBreakEvenRate, (double)AnalyticParameters.Strike,
                                             (double)Volatility, (double)AnalyticParameters.TimeToExpiry);

            return((decimal)result);
        }
        protected Decimal CalculateStrikeDelta()
        {
            var result = OptionAnalytics.OptWithGreeks(AnalyticParameters.IsCall, (double)AnalyticParameters.SwapBreakEvenRate, (double)AnalyticParameters.Strike,
                                                       (double)Volatility, (double)AnalyticParameters.TimeToExpiry)[6];

            return((decimal)result);
        }
예제 #5
0
        /// <summary>
        /// Values a digital option with greeks.
        /// </summary>
        /// <param name="callFlag"></param>
        /// <param name="fwdPrice"></param>.
        /// <param name="strike"></param>
        /// <param name="vol"></param>
        /// <param name="t"></param>
        /// <returns>value, d_dfwdPrice, d2_dfwdPrice2, d_dvol, d_dstrike, d2_dstrike2, d_dt</returns>
        public object[,] DigitalWithGreeks(bool callFlag, double fwdPrice, double strike, double vol, double t)
        {
            var unqVals = OptionAnalytics.DigitalWithGreeks(callFlag, fwdPrice, strike, vol, t);
            var result  = RangeHelper.ConvertArrayToRange(unqVals);

            return(result);
        }
예제 #6
0
        /// <summary>
        /// Valuation of a regular chooser option:
        /// The pricing model values this as the sum of a call option of expiry tL
        ///  and strike strike, plus a put option of expiry tS and strike strike * df(tS,tL)
        ///  where df(tS,tL) is the discount function between dates tS and tL.
        /// </summary>
        /// <param name="fwdPrice">Outright: to pay now for assured delivery of asset at tL</param>
        /// <param name="vol">Volatility</param>
        /// <param name="tS">Time to date where choice has to be made (years)</param>
        /// <param name="tL">Time to expiry of underlying option (years; must be greater than tS)</param>
        /// <param name="strike">strike of option</param>
        /// <param name="rL">exp(-rL.tL) is DF from now to time tL</param>
        /// <returns>An array of calculated doubles: Premium, delta, gamma, vega, rhoL, thetal, thetaS.</returns>
        public object[,] ChooserOpt(double fwdPrice, double vol, double tS, double tL, double strike, double rL)
        {
            var unqVals = OptionAnalytics.ChooserOpt(fwdPrice, vol, tS, tL, strike, rL);
            var result  = RangeHelper.ConvertArrayToRange(unqVals);

            return(result);
        }
예제 #7
0
 ///<summary>
 /// A dual strike dual notional call option.
 ///</summary>
 ///<param name="nSteps"></param>
 ///<param name="notl1"></param>
 ///<param name="fwdPrice1">price fixable now for purchase of asset 1 at time t</param>
 ///<param name="strike1"></param>
 ///<param name="notl2"></param>
 ///<param name="fwdPrice2">price fixable now for purchase of asset 2 at time t</param>
 ///<param name="strike2"></param>
 ///<param name="vol1"></param>
 ///<param name="vol2"></param>
 ///<param name="corr">correlation coefficient</param>
 ///<param name="r">riskless CC interest rate to option expiry</param>
 ///<param name="t">time to option expiry (years) </param>
 ///<returns></returns>
 public double DualStrikeDualNotionalCall(
     long nSteps,
     double notl1,
     double fwdPrice1,
     double strike1,
     double notl2,
     double fwdPrice2,
     double strike2,
     double vol1,
     double vol2,
     double corr,
     double r,
     double t)
 {
     return(OptionAnalytics.DualStrikeDualNotionalCall(nSteps,
                                                       notl1,
                                                       fwdPrice1,
                                                       strike1,
                                                       notl2,
                                                       fwdPrice2,
                                                       strike2,
                                                       vol1,
                                                       vol2,
                                                       corr,
                                                       r,
                                                       t));
 }
        protected virtual Decimal CalculateCollarOptionValue2()
        {
            var result = OptionAnalytics.Opt(!AnalyticParameters.IsCall, (double)AnalyticParameters.Rate + (double)AnalyticParameters.Spread - 0.0001, (double)CollarFloorStrike,
                                             (double)CollarFloorVolatility, (double)AnalyticParameters.ExpiryYearFraction);

            return((decimal)result);
        }
        protected virtual Decimal CalculateOptionTheta()
        {
            var result = OptionAnalytics.OptWithGreeks(!AnalyticParameters.IsPut, (double)AnalyticParameters.Rate, (double)AnalyticParameters.Strike,
                                                       (double)AnalyticParameters.Volatility, (double)AnalyticParameters.TimeToExpiry)[4];

            return((decimal)result);
        }
        protected virtual Decimal CalculateOptionDelta()
        {
            var result = OptionAnalytics.OptWithGreeks(AnalyticParameters.IsCall, (double)AnalyticParameters.Rate + (double)AnalyticParameters.Spread, (double)GetStrike(),
                                                       (double)GetVolatility(), (double)AnalyticParameters.ExpiryYearFraction)[1];

            return((decimal)result);
        }
        public static Decimal CalculateStrikeDelta(bool isCall, decimal swapBreakEvenRate, decimal strike, double timeToExpiry, double timeToIndex, IVolatilitySurface indexVolSurface)
        {
            var volatility = (decimal)indexVolSurface.GetValue(timeToIndex, (double)strike);
            var result     = OptionAnalytics.OptWithGreeks(isCall, (double)swapBreakEvenRate, (double)strike, (double)volatility, timeToExpiry)[6];

            return((decimal)result);
        }
예제 #12
0
        protected virtual Decimal CalculateOptionValue(decimal forwardRate)
        {
            var result = OptionAnalytics.Opt(GetIsCall(), (double)forwardRate, (double)GetStrike(),
                                             (double)GetVolatility(), (double)GetExpiry());

            return((decimal)result);
        }
예제 #13
0
        protected virtual Decimal CalculateOptionValue2()
        {
            var result = OptionAnalytics.Opt(GetIsCall(), (double)FloatingIndex - 0.0001, (double)GetStrike(),
                                             (double)GetVolatility(), (double)GetExpiry());

            return((decimal)result);
        }
        protected virtual Decimal CalculateVolatility()
        {
            var result = OptionAnalytics.OptSolveVol(!AnalyticParameters.IsPut, (double)AnalyticParameters.Rate, (double)AnalyticParameters.Strike,
                                                     (double)AnalyticParameters.Premium, 0.0, (double)AnalyticParameters.TimeToExpiry);

            return((decimal)result);
        }
        protected virtual Decimal CalculateCollarOptionDelta()
        {
            var result = OptionAnalytics.OptWithGreeks(!AnalyticParameters.IsCall, (double)AnalyticParameters.Rate + (double)AnalyticParameters.Spread, (double)CollarFloorStrike,
                                                       (double)CollarFloorVolatility, (double)AnalyticParameters.ExpiryYearFraction)[1];

            return((decimal)result);
        }
예제 #16
0
        protected virtual Decimal CalculateVolatility()
        {
            var result = OptionAnalytics.OptSolveVol(AnalyticParameters.IsPut, (double)AnalyticParameters.Rate, (double)AnalyticParameters.Strike,
                                                     (double)AnalyticParameters.Premium / (double)AnalyticParameters.PremiumPaymentDiscountFactor, 0.0, (double)AnalyticParameters.TimeToExpiry);

            //result = BlackModel.GetPutOptionValue(AnalyticParameters.ForwardRate, AnalyticParameters.Strike, AnalyticParameters.Volatility, AnalyticParameters.CurveYearFraction);
            return((decimal)result);
        }
예제 #17
0
        protected virtual Decimal CalculateOptionDelta()
        {
            var result = OptionAnalytics.OptWithGreeks(AnalyticParameters.IsPut, (double)AnalyticParameters.Rate, (double)AnalyticParameters.Strike,
                                                       (double)AnalyticParameters.Volatility, (double)AnalyticParameters.TimeToExpiry)[1];

            //result = BlackModel.GetPutOptionValue(AnalyticParameters.ForwardRate, AnalyticParameters.Strike, AnalyticParameters.Volatility, AnalyticParameters.CurveYearFraction);
            return((decimal)result);
        }
예제 #18
0
        /// <summary>
        /// Valuation of an option on an option:
        /// </summary>
        /// <param name="callOnOptionFlag">Boolean for option on option being call/put</param>
        /// <param name="strikeS">strike of option on option</param>
        /// <param name="rS">exp(-rS.tS) is DF from now to time tS</param>
        /// <param name="tS">Time to expiry of option on option (years)</param>
        /// <param name="callFlag">Boolean for underlying option being call/put</param>
        /// <param name="strikeL">strike of underlying option</param>
        /// <param name="rL">exp(-rL.tL) is DF from now to time tL</param>
        /// <param name="tL">Time to expiry of underlying option (years; must be greater than tS)</param>
        /// <param name="fwdPrice">Outright: to pay now for assured delivery of asset at tL</param>
        /// <param name="vol">The volatility.</param>
        /// <returns>The order of the return types is: Premium, Delta, Gamma, Vega, ThetaS, ThetaL, RhoS, RhoL</returns>
        public double[] CompoundOpt(bool callOnOptionFlag, double strikeS, double rS, double tS,
                                    bool callFlag, double strikeL, double rL, double tL, double fwdPrice, double vol)
        {
            var result = OptionAnalytics.CompoundOpt(callOnOptionFlag, strikeS, rS, tS,
                                                     callFlag, strikeL, rL, tL, fwdPrice, vol);

            return(result);
        }
예제 #19
0
        /// <summary>
        /// European option obtained by approximating log normal integral with a sum ...
        /// </summary>
        /// <param name="callFlag"></param>
        /// <param name="fwdPrice"></param>
        /// <param name="nSteps"></param>
        /// <param name="strike"></param>
        /// <param name="vol"></param>
        /// <param name="df"></param>
        /// <param name="t"></param>
        /// <returns>The value</returns>
        public double CoxEuroOption4(bool callFlag, double fwdPrice, short nSteps,
                                     double strike, double vol, double df, double t)
        {
            var result = OptionAnalytics.CoxEuroOption4(callFlag, fwdPrice, nSteps,
                                                        strike, vol, df, t);

            return(result);
        }
예제 #20
0
 ///<summary>
 ///</summary>
 ///<param name="f"></param>
 ///<param name="k"></param>
 ///<param name="expiry"></param>
 ///<param name="xlParams"></param>
 ///<param name="interpMethod"></param>
 ///<returns></returns>
 public double InterpBlackVolSABR(double f, double k, double expiry, Excel.Range xlParams, string interpMethod)
 {
     object[,] values = xlParams.Value[System.Reflection.Missing.Value] as object[, ];
     interpMethod     = interpMethod.ToUpper();
     interpMethod     = interpMethod.Trim();
     interpMethod     = interpMethod.Substring(0, 1);
     return(OptionAnalytics.InterpBlackVolSABR(f, k, expiry, ArrayHelper.RangeToMatrix(values), interpMethod));
 }
예제 #21
0
        /// <summary>
        /// To value and work out sensitivities for an option where the forward value of the asset
        /// is fwdPrice.exp(corr.vol1.vol2.t)
        /// </summary>
        /// <param name="callFlag"></param>
        /// <param name="fwdPrice"></param>
        /// <param name="strike"></param>
        /// <param name="vol1"></param>
        /// <param name="vol2"></param>
        /// <param name="corr"></param>
        /// <param name="t"></param>
        /// <returns>value, d_dfwdPrice, d2_dfwdPrice2, d_dvol1, d_dvol2, d_dcorr, d_dt, </returns>
        public object[,] QOptWithGreeks(Boolean callFlag, double fwdPrice,
                                        double strike, double vol1, double vol2, double corr, double t)
        {
            var unqVals = OptionAnalytics.QOptWithGreeks(callFlag, fwdPrice,
                                                         strike, vol1, vol2, corr, t);
            var result = RangeHelper.ConvertArrayToRange(unqVals);

            return(result);
        }
예제 #22
0
 ///<summary>
 ///</summary>
 ///<param name="f"></param>
 ///<param name="k"></param>
 ///<param name="sigma"></param>
 ///<param name="T"></param>
 ///<param name="lambda"></param>
 ///<returns></returns>
 public object[] BlackFwdPrice(double f, double k, double sigma, double T, int lambda)
 {
     if (f == 0 | k == 0 | sigma == 0 | T == 0 | lambda == 0)
     {
         return(null);
     }
     object[] output = OptionAnalytics.BlackFwdPrice(f, k, sigma, T, lambda);
     return(output);
 }
예제 #23
0
        ///<summary>
        ///</summary>
        ///<param name="f"></param>
        ///<param name="k"></param>
        ///<param name="price"></param>
        ///<param name="T"></param>
        ///<param name="lambda"></param>
        ///<returns></returns>
        public double BlackImpliedVol(double f, double k, double price, double T, int lambda)
        {
            if (f == 0 | k == 0 | price < 0 | T == 0 | lambda == 0)
            {
                return(0);
            }
            double output = OptionAnalytics.BlackImpliedVol(f, k, price, T, lambda);

            return(output);
        }
        protected Decimal CalculateOptionStrike()
        {
            //if (AnalyticParameters.OtherNPV != null)
            //{
            var premium = Math.Abs(AnalyticParameters.OtherNPV) / Math.Abs(AnalyticParameters.SwapAccrualFactor) / 10000;
            var result  = (decimal)OptionAnalytics.OptSolveStrike(AnalyticParameters.IsCall, (double)AnalyticParameters.SwapBreakEvenRate, (double)Volatility,
                                                                  0.0, (double)AnalyticParameters.TimeToExpiry, (double)premium);

            //}
            return(result);
        }
예제 #25
0
        protected Decimal CalculateOptionStrike()
        {
            var result = 0.0m;

            if (AnalyticParameters.Premium != null)
            {
                var premium = (decimal)AnalyticParameters.Premium;
                result = (decimal)OptionAnalytics.OptSolveStrike(GetIsCall(), (double)FloatingIndex, (double)GetVolatility(),
                                                                 0.0, (double)AnalyticParameters.ExpiryYearFraction, (double)premium);
            }
            return(result);
        }
        protected Decimal CalculateOptionStrike()
        {
            var result = 0.0m;

            if (AnalyticParameters.SwapAccrualFactor != 0.0m && AnalyticParameters.Premium != 0.0m)
            {
                var premium = AnalyticParameters.Premium / Math.Abs(AnalyticParameters.SwapAccrualFactor);
                result = (decimal)OptionAnalytics.OptSolveStrike(AnalyticParameters.IsCall, (double)EvaluateBreakEvenRate(), (double)Volatility,
                                                                 0.0, (double)AnalyticParameters.ExpiryYearFraction, (double)premium);
            }
            return(result);
        }
        /// <summary>
        /// Evaluates the npv.
        /// </summary>
        /// <returns></returns>
        protected List <double> EvaluateRawValues()
        {
            var rawValues = new List <double>();
            var rates     = EvaluateRates();

            if (rates.Count == AnalyticParameters.Strikes.Count && rates.Count == AnalyticParameters.Volatilities.Count && rates.Count == AnalyticParameters.TimesToExpiry.Count)
            {
                var index = 0;
                foreach (var rate in rates)
                {
                    var value = OptionAnalytics.Opt(!AnalyticParameters.IsPut, rate, AnalyticParameters.Strikes[index],
                                                    AnalyticParameters.Volatilities[index], AnalyticParameters.TimesToExpiry[index]);
                    rawValues.Add(value);
                    index++;
                }
            }
            return(rawValues);
        }
        /// <summary>
        /// Evaluates the greeks.
        /// </summary>
        /// <returns>The option greeks.</returns>
        protected List <double[]> EvaluateGreeks()
        {
            var greekValues = new List <double[]>();
            var rates       = EvaluateRates();

            if (ValidateOptionInputs(rates))
            {
                var index = 0;
                foreach (var rate in rates)
                {
                    var value = OptionAnalytics.OptWithGreeks(!AnalyticParameters.IsPut, rate, AnalyticParameters.Strikes[index],
                                                              AnalyticParameters.Volatilities[index], AnalyticParameters.TimesToExpiry[index]);
                    greekValues.Add(value);
                    index++;
                }
            }
            return(greekValues);
        }
예제 #29
0
        public void TestCrankNicolson()
        {
            double spot    = 385.5;
            double epsilon = 0.0001;
            double strike  = 400;

            double[] rt = { 0.0425,
                            0.0452,
                            0.0457,
                            0.0462 };
            int[]    tt        = { 1, 32, 63, 93 };
            int[]    divdays   = { 0, 48 };
            double[] divs      = { 20, 10 };
            double   vol       = 0.2046;
            int      steps     = 80;
            double   tStepSize = 0.01;
            DateTime today     = new DateTime(2010, 05, 07);
            DateTime expiry    = new DateTime(2010, 06, 24);
            //string style = "European";
            double t   = expiry.Subtract(today).Days / 365.0 + epsilon; // For CN backwards propagation div time needs to be strictly less than expiry time
            double fwd = EquityAnalytics.GetForwardCCLin365(spot, t, divdays, divs, tt, rt);
            double df  = EquityAnalytics.GetDFCCLin365(0, t, tt, rt);

            BlackScholes  bs  = new BlackScholes(spot, strike, false, t, vol, tt, rt, divdays, divs);
            CrankNicolson lhs = new CrankNicolson(false, false, spot, strike, t, vol, steps, tStepSize, 8.0, divdays, divs, tt, rt);

            double[,] res0 = OptionAnalytics.BlackScholesWithGreeks(false, fwd, strike, vol, t);
            double[] res_cn   = lhs.GetPriceAndGreeks();
            double   pr_bs    = bs.GetPrice();
            double   delta_bs = bs.GetDelta();
            double   gamma_bs = bs.GetGamma();
            double   theta_bs = bs.GetTheta();
            double   pr_cn    = res_cn[0];
            double   delta_cn = res_cn[1];
            double   gamma_cn = res_cn[2];
            double   theta_cn = res_cn[3];

            Assert.AreEqual(pr_cn, pr_bs, 0.50);
            Assert.AreEqual(delta_cn, delta_bs, 0.03);
            Assert.AreEqual(gamma_cn, 0.012931145370580023, 0.005);
            Assert.AreEqual(bs.GetTheta(), theta_cn, 0.01);
        }
예제 #30
0
        /// <summary>
        /// SpreadOptWithGreeks
        /// </summary>
        /// <param name="nSteps"></param>
        /// <param name="fwdPrice1">price fixable now for purchase of asset 1 at time t</param>
        /// <param name="fwdPrice2">price fixable now for purchase of asset 2 at time t</param>
        /// <param name="strike">strike</param>
        /// <param name="vol1">volatility of asset 1</param>
        /// <param name="vol2">volatility of asset 2</param>
        /// <param name="corr">correlation coefficient</param>
        /// <param name="t">time to option expiry in years</param>
        /// <returns>delta1, delta2, gamma11, gamma22,
        /// gamma12, vega1, vega2, corrSens, theta and the nsteps</returns>
        public object[,] SpreadOptWithGreeks(long nSteps,
                                             double fwdPrice1,         // price fixable now for purchase of asset 1 at time t
                                             double fwdPrice2,         // price fixable now for purchase of asset 2 at time t
                                             double strike,            // strike
                                             double vol1,              // volatility of asset 1
                                             double vol2,              // volatility of asset 2
                                             double corr,              // correlation coefficient
                                             double t)                 // time to option expiry in years
        {
            var unqVals = OptionAnalytics.SpreadOptWithGreeks(nSteps,
                                                              fwdPrice1, // price fixable now for purchase of asset 1 at time t
                                                              fwdPrice2, // price fixable now for purchase of asset 2 at time t
                                                              strike,    // strike
                                                              vol1,      // volatility of asset 1
                                                              vol2,      // volatility of asset 2
                                                              corr,      // correlation coefficient
                                                              t);
            var result = RangeHelper.ConvertArrayToRange(unqVals);

            return(result);
        }