Beispiel #1
0
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
Beispiel #2
0
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