public static object DupireSsviLookbackOptionPriceMC( [ExcelArgument(Description = "the current risky asset price")] double S0, [ExcelArgument(Description = "constant continuously compounded rate of return")] double riskFreeRate, [ExcelArgument(Description = "parameter in theta(t) := alpha^2(e^(beta^2 t) - 1)")] double alpha, [ExcelArgument(Description = "parameter in theta(t) := alpha^2(e^(beta^2 t) - 1)")] double beta, [ExcelArgument(Description = "SSVI parameter")] double gamma, [ExcelArgument(Description = "SSVI parameter")] double eta, [ExcelArgument(Description = "SSVI parameter")] double rho, [ExcelArgument(Description = "option maturity (time to expiry)")] double maturity, [ExcelArgument(Description = "number of time steps e.g. 252")] int numSteps, [ExcelArgument(Description = "number of trials e.g. 10 000")] int numTrials) { if (ExcelDnaUtil.IsInFunctionWizard()) { return(null); } try { double[] ssviParams = new double[] { alpha, beta, gamma, eta, rho }; MonteCarloPricingLocalVol McPricer = new MonteCarloPricingLocalVol(riskFreeRate, numTrials, numSteps, ssviParams); return(McPricer.CalculateLookbackOptionPrice(S0, maturity)); } catch (Exception e) { XLInterfaceBase.AddErrorMessage("DupireSsviLookbackOptionPriceMC error: " + e.Message); } return(null); }
public static object DupireSsviBarrierPriceWithMC([ExcelArgument(Description = "the current risky asset price")] double S0, [ExcelArgument(Description = "constant continuously compounded rate of return")] double riskFreeRate, [ExcelArgument(Description = "parameter in theta(t) := alpha^2(e^(beta^2 t) - 1)")] double alpha, [ExcelArgument(Description = "parameter in theta(t) := alpha^2(e^(beta^2 t) - 1)")] double beta, [ExcelArgument(Description = "SSVI parameter")] double gamma, [ExcelArgument(Description = "SSVI parameter")] double eta, [ExcelArgument(Description = "SSVI parameter")] double rho, [ExcelArgument(Description = "option maturity (time to expiry)")] double maturity, [ExcelArgument(Description = "option strike")] double strike, [ExcelArgument(Description = "option barrier")] double barrier, [ExcelArgument(Description = "option type, 'C' for call 'P' for put")] string CallOrPut, [ExcelArgument(Description = "option type, 'U' for up 'D' for down")] string UpOrDown, [ExcelArgument(Description = "option type, 'I' for in 'O' for out")] string InOrOut, [ExcelArgument(Description = "number of time steps e.g. 252")] int numSteps, [ExcelArgument(Description = "number of trials e.g. 10 000")] int numTrials) { if (ExcelDnaUtil.IsInFunctionWizard()) { return(null); } try { double[] ssviParams = new double[] { alpha, beta, gamma, eta, rho }; MonteCarloPricingLocalVol pricer = new MonteCarloPricingLocalVol(riskFreeRate, numTrials, numSteps, ssviParams); if (CallOrPut == "C") { return(pricer.CalculateCallBarrierOptionPrice(S0, strike, maturity, UpOrDown, InOrOut, barrier)); } else if (CallOrPut == "P") { return(pricer.CalculatePutBarrierOptionPrice(S0, strike, maturity, UpOrDown, InOrOut, barrier)); } else { throw new ArgumentException("Input must be either C or P."); } } catch (Exception e) { XLInterfaceBase.AddErrorMessage("DupireSsviEuropeanPriceWithMC error: " + e.Message); } return(null); }
public static object DupireSsviAsianOptionPriceMC( [ExcelArgument(Description = "the current risky asset price")] double S0, [ExcelArgument(Description = "constant continuously compounded rate of return")] double riskFreeRate, [ExcelArgument(Description = "parameter in theta(t) := alpha^2(e^(beta^2 t) - 1)")] double alpha, [ExcelArgument(Description = "parameter in theta(t) := alpha^2(e^(beta^2 t) - 1)")] double beta, [ExcelArgument(Description = "SSVI parameter")] double gamma, [ExcelArgument(Description = "SSVI parameter")] double eta, [ExcelArgument(Description = "SSVI parameter")] double rho, [ExcelArgument(Description = "option maturity (time to expiry)")] double maturity, [ExcelArgument(Description = "option strike")] double strike, [ExcelArgument(Description = "an Nx1 XL range of values over which the average is taken")] object monitoringTimes, [ExcelArgument(Description = "option type, 'C' for call 'P' for put")] string type, [ExcelArgument(Description = "number of time steps e.g. 252")] int numSteps, [ExcelArgument(Description = "number of trials e.g. 10 000")] int numTrials) { try { double[] monitoringT = XLInterfaceBase.ConvertToVector <double>(monitoringTimes); double[] ssviParams = new double[] { alpha, beta, gamma, eta, rho }; MonteCarloPricingLocalVol McPricer = new MonteCarloPricingLocalVol(riskFreeRate, numTrials, numSteps, ssviParams); if (type == "Call" || type == "call" || type == "C" || type == "c") { return(McPricer.CalculateAsianCallOptionPrice(S0, strike, monitoringT, maturity)); } else if (type == "Put" || type == "put" || type == "P" || type == "p") { return(McPricer.CalculateAsianPutOptionPrice(S0, strike, monitoringT, maturity)); } else { throw new ArgumentException("Input must be either Call, call, C, c, Put, put, P or p."); } } catch (Exception e) { XLInterfaceBase.AddErrorMessage("DupireSsviAsianOptionPriceMC error: " + e.Message); } return(null); }