def mscAsianOption(C_P, S0, K, T, r, sigma, M, I): if C_P == 'C': par = 1.0 elif C_P == 'P': par = -1.0 else: return ("the value can not be calculatable") prng = rand.PRNG(seed=10000) prngx = Blas() dt = T / M S = np.zeros((M + 1, I)) ArithSum = np.zeros((1, I)) GeoSum = np.ones((1, I)) S[0] = S0 sigma_x = sigma * sqrt(float((M + 1) * (2 * M + 1)) / (6 * M**2)) r_x = float((r - 0.5 * sigma**2) * (M + 1)) / (2 * M) + 0.5 * sigma_x**2 d1 = (log(float(S0) / K) + (r_x + 0.5 * sigma_x**2) * T) / (sigma_x * sqrt(T)) d2 = d1 - sigma_x * sqrt(T) S_geoc = par * S0 * exp(r_x * T) * stats.norm.cdf(par * d1) K_geoc = par * K * stats.norm.cdf(par * d2) Vgeoc = exp(-r * T) * (S_geoc - K_geoc) for t in range(1, M + 1): z = np.empty(I) prng.normal(z, mean=0, sigma=1) S[t] = S[t - 1] * np.exp((r - 0.5 * sigma**2) * dt + sigma * sqrt(dt) * z) for i in range(1, M, 2): ArithSum += S[i] + S[i + 1] #ts:time series GeoSum *= S[i] * S[i + 1] X = np.maximum(par * ArithSum / M - par * K, 0.0) Y = np.maximum(par * np.power(GeoSum, 1.0 / M) - par * K, 0.0) theta = np.cov(X, Y)[0][1] / np.var(Y) D = exp(-r * T) Varith = D * prngx.asum(X[0]) / I Vgeo = D * prngx.asum(Y[0]) / I # V = Varith+theta*(Vgeoc - Vgeo) Varray = D * X + theta * (Vgeoc - D * Y) Vmean = prngx.asum(Varray[0]) / I Vstd = np.std(Varray) Vconf = [Vmean - 1.96 * Vstd / sqrt(I), Vmean + 1.96 * Vstd / sqrt(I)] return Vmean, Vconf, Varith, Vgeo
def mscBasketOption(C_P, S10, S20, K, T, r, sigma1, sigma2, cov, I): if C_P == 'C': par = 1.0 elif C_P == 'P': par = -1.0 else: return ("the value can not be calculatable") prng = rand.PRNG(seed=10000) prngx = Blas() D = exp(-r * T) z1 = np.empty(I) z2 = np.empty(I) prng.normal(z1, mean=0, sigma=1) prng.normal(z2, mean=0, sigma=1) z3 = cov * z1 + sqrt(1 - cov**2) * z2 S1T = S10 * np.exp((r - 0.5 * sigma1**2) * T + sigma1 * sqrt(T) * z1) S2T = S20 * np.exp((r - 0.5 * sigma2**2) * T + sigma2 * sqrt(T) * z3) Sa = (S1T + S2T) * 0.5 Sg = np.sqrt(S1T * S2T) hTa = np.maximum(par * Sa - par * K, 0) hTg = np.maximum(par * Sg - par * K, 0) Va = D * prngx.asum(hTa) / I Vg = D * prngx.asum(hTg) / I B0 = sqrt(S10 * S20) Bsigma = 0.5 * sqrt(sigma1**2 + sigma2**2 + 2 * sigma1 * sigma2 * cov) Bu = r - (sigma1**2 + sigma2**2) / (2 * 2) + 0.5 * Bsigma**2 d1_x_nominator = log(float(B0) / K) + (Bu + 0.5 * Bsigma**2) * T d1_x = d1_x_nominator / (Bsigma * sqrt(T)) d2_x = d1_x - Bsigma * sqrt(T) CB_nominator = par * B0 * exp(Bu * T) * stats.norm.cdf( par * d1_x) - par * K * stats.norm.cdf(par * d2_x) Vgc = D * CB_nominator theta = np.cov(hTa, hTg)[0][1] / np.var(hTg) # V = Va + theta*(Vgc - Vg) Varray = D * hTa + theta * (Vgc - D * hTg) Vmean = prngx.asum(Varray) / I Vstd = np.std(Varray) Vconf = [Vmean - 1.96 * Vstd / sqrt(I), Vmean + 1.96 * Vstd / sqrt(I)] return Vmean, Vconf, Va, Vg, Vgc