public Option(OptionInfo optInfo) { optionInfo = optInfo; rnds = new RndGenerator(optionInfo.NumberOfSteps); SS1 = new double[optionInfo.NumberOfSteps + 1]; SS2 = new double[optionInfo.NumberOfSteps + 1]; }
public Greeks(OptionInfo optInfo) { optionInfo = optInfo; Prices = new double[optionInfo.NumberOfSimulation]; Asian_Prices = new double[optionInfo.NumberOfSimulation]; Digital_Prices = new double[optionInfo.NumberOfSimulation]; Lookback_Prices = new double[optionInfo.NumberOfSimulation]; Range_Prices = new double[optionInfo.NumberOfSimulation]; Barrier_Prices = new double[optionInfo.NumberOfSimulation]; rnd = new RndGenerator(optionInfo.NumberOfSteps); rnds = new double[optionInfo.NumberOfSteps]; }
public Digitaloption(OptionInfo op) : base(op) { opt = op; }
public RangeOption(OptionInfo op) : base(op) { opt = op; }
public BarrierOption(OptionInfo op) : base(op) { opt = op; }
} //Calculate the greek values of Range Option. public void Calculate_Barrier() { OptionInfo optionInfo1 = optionInfo.copy(); // Copy the information from the OptionInfo. barrier = new BarrierOption(optionInfo1); long M = optionInfo1.NumberOfSimulation; double eps = optionInfo1.Epslion; // double[] rnds = new double[optionInfo1.NumberOfSteps]; double[] Delta = new double[M]; double[] Gamma = new double[M]; double[] Vega = new double[M]; double[] Theta = new double[M]; double[] Rho = new double[M]; double[] Standarderror = new double[M]; for (int i = 0; i <= M - 1; i++) { rnds = rnd.Normal(); // Original barrier.CalculateOption(rnds); Barrier_Prices[i] = barrier.Calculate(); // Delta optionInfo1.UnderlyingPrice *= (1.0 + eps); barrier.CalculateOption(rnds); value1 = barrier.Calculate(); optionInfo1.UnderlyingPrice = optionInfo.UnderlyingPrice; optionInfo1.UnderlyingPrice *= (1.0 - eps); barrier.CalculateOption(rnds); value2 = barrier.Calculate(); Delta[i] = (value1 - value2) / (2 * eps * optionInfo.UnderlyingPrice); // Gamma Gamma[i] = (value1 + value2 - 2 * Barrier_Prices[i]) / (eps * eps * optionInfo.UnderlyingPrice * optionInfo.UnderlyingPrice); optionInfo1.UnderlyingPrice = optionInfo.UnderlyingPrice; // Vega optionInfo1.Volatility *= (1.0 + eps); barrier.CalculateOption(rnds); value1 = barrier.Calculate(); optionInfo1.Volatility = optionInfo.Volatility; optionInfo1.Volatility *= (1.0 - eps); barrier.CalculateOption(rnds); value2 = barrier.Calculate(); Vega[i] = (value1 - value2) / (2 * eps * optionInfo.Volatility); optionInfo1.Volatility = optionInfo.Volatility; // Rho optionInfo1.InterestRate *= (1.0 + eps); barrier.CalculateOption(rnds); value1 = barrier.Calculate(); optionInfo1.InterestRate = optionInfo.InterestRate; optionInfo1.InterestRate *= (1.0 - eps); barrier.CalculateOption(rnds); value2 = barrier.Calculate(); Rho[i] = (value1 - value2) / (2 * eps * optionInfo.InterestRate); optionInfo1.InterestRate = optionInfo.InterestRate; // Theta optionInfo1.Tenor *= (1.0 + eps); barrier.CalculateOption(rnds); value1 = barrier.Calculate(); optionInfo1.Tenor = optionInfo.Tenor; optionInfo1.Tenor *= (1.0 - eps); barrier.CalculateOption(rnds); value2 = barrier.Calculate(); Theta[i] = (value1 - value2) / (2 * eps * optionInfo.Tenor); optionInfo1.Tenor = optionInfo.Tenor; } double totalPrices = 0; double totalDelta = 0; double totalTheta = 0; double totalGamma = 0; double totalRho = 0; double totalVega = 0; for (int j = 0; j <= M - 1; j++) { totalPrices += Barrier_Prices[j]; totalDelta += Delta[j]; totalTheta += Theta[j]; totalGamma += Gamma[j]; totalRho += Rho[j]; totalVega += Vega[j]; } Barrier_original = totalPrices / M; Barrier_delta = totalDelta / M; Barrier_gamma = totalGamma / M; Barrier_theta = -totalTheta / M; Barrier_rho = totalRho / M; Barrier_vega = totalVega / M; double std = 0.0; for (int i = 0; i < M; i++) { std += (Barrier_Prices[i] - Barrier_original) * (Barrier_Prices[i] - Barrier_original); } Barrier_TOE = Math.Sqrt(std / (M - 1) / M); } //Calculate the greek values of Barrier Option
public void Calculate_European() { OptionInfo optionInfo1 = optionInfo.copy(); // Copy the information from the OptionInfo. europ = new EuropeanOption(optionInfo1); long M = optionInfo1.NumberOfSimulation; double eps = optionInfo1.Epslion; //double[] rnds = new double[optionInfo1.NumberOfSteps]; double[] Delta = new double[M]; double[] Gamma = new double[M]; double[] Vega = new double[M]; double[] Theta = new double[M]; double[] Rho = new double[M]; double[] Standarderror = new double[M]; for (int i = 0; i <= M - 1; i++) { rnds = rnd.Normal(); // Original europ.CalculateOption(rnds); original = europ.Calculate(); // Delta optionInfo1.UnderlyingPrice *= (1.0 + eps); europ.CalculateOption(rnds); value1 = europ.Calculate(); optionInfo1.UnderlyingPrice = optionInfo.UnderlyingPrice; optionInfo1.UnderlyingPrice *= (1.0 - eps); europ.CalculateOption(rnds); value2 = europ.Calculate(); delta = (value1 - value2) / (2 * eps * optionInfo.UnderlyingPrice); // Gamma gamma = (value1 + value2 - 2 * original) / (eps * eps * optionInfo.UnderlyingPrice * optionInfo.UnderlyingPrice); optionInfo1.UnderlyingPrice = optionInfo.UnderlyingPrice; // Vega optionInfo1.Volatility *= (1.0 + eps); europ.CalculateOption(rnds); value1 = europ.Calculate(); optionInfo1.Volatility = optionInfo.Volatility; optionInfo1.Volatility *= (1.0 - eps); europ.CalculateOption(rnds); value2 = europ.Calculate(); vega = (value1 - value2) / (2 * eps * optionInfo.Volatility); optionInfo1.Volatility = optionInfo.Volatility; // Rho optionInfo1.InterestRate *= (1.0 + eps); europ.CalculateOption(rnds); value1 = europ.Calculate(); optionInfo1.InterestRate = optionInfo.InterestRate; optionInfo1.InterestRate *= (1.0 - eps); europ.CalculateOption(rnds); value2 = europ.Calculate(); rho = (value1 - value2) / (2 * eps * optionInfo.InterestRate); optionInfo1.InterestRate = optionInfo.InterestRate; // Theta optionInfo1.Tenor *= (1.0 + eps); europ.CalculateOption(rnds); value1 = europ.Calculate(); optionInfo1.Tenor = optionInfo.Tenor; optionInfo1.Tenor *= (1.0 - eps); europ.CalculateOption(rnds); value2 = europ.Calculate(); theta = (value1 - value2) / (2 * eps * optionInfo.Tenor); optionInfo1.Tenor = optionInfo.Tenor; Prices[i] = original; Delta[i] = delta; Theta[i] = theta; Gamma[i] = gamma; Rho[i] = rho; Vega[i] = vega; } double totalPrices = 0; double totalDelta = 0; double totalTheta = 0; double totalGamma = 0; double totalRho = 0; double totalVega = 0; for (int j = 0; j <= M - 1; j++) { totalPrices += Prices[j]; totalDelta += Delta[j]; totalTheta += Theta[j]; totalGamma += Gamma[j]; totalRho += Rho[j]; totalVega += Vega[j]; } original = totalPrices / M; delta = totalDelta / M; gamma = totalGamma / M; theta = -totalTheta / M; rho = totalRho / M; vega = totalVega / M; double std = 0.0; for (int i = 0; i < M; i++) { std += (Prices[i] - original) * (Prices[i] - original); } TOE = Math.Sqrt(std / (M - 1) / M); } //Calculate the greek values of European Option
public EuropeanOption(OptionInfo op) : base(op) { opt = op; }
public LookbackOption(OptionInfo op) : base(op) { opt = op; }
public Thread_values(OptionInfo op) { opt = op; }
public AsianOption(OptionInfo op) : base(op) { opt = op; } //Constructor function