Exemplo n.º 1
0
 def test_analytical_vega(self):
     while self.tdi.has_next():
         row = self.tdi.next_row()
         S, K, t, r, sigma = row['S'], row['K'], row['t'], row['R'], row[
             'v']
         self.assertAlmostEqual(analytical.vega('c', S, K, t, r, sigma, q),
                                row['CV'] * .01,
                                delta=0.000001)
         self.assertAlmostEqual(analytical.vega('p', S, K, t, r, sigma, q),
                                row['PV'] * .01,
                                delta=0.000001)
Exemplo n.º 2
0
    def test_analytical_vega(self):
        S = 49
        K = 50
        sigma = .2
        r = .05
        t = 0.3846
        q = 0.2

        flag = 'p'
        c_put = c_analytical.vega(flag, S, K, t, r, sigma, q)
        py_put = py_analytical.vega(flag, S, K, t, r, sigma, q)
        self.assertTrue(almost_equal(c_put, py_put))

        flag = 'c'
        c_call = c_analytical.vega(flag, S, K, t, r, sigma, q)
        py_call = py_analytical.vega(flag, S, K, t, r, sigma, q)
        self.assertTrue(almost_equal(c_call, py_call))
Exemplo n.º 3
0
 def test_vega(self):
     vegas = [
         vega(flag, S, K, t, r, sigma, q)
         for flag, S, K, t, r, sigma, q in self.arg_combinations
     ]
     nvegas = [
         nvega(flag, S, K, t, r, sigma, q)
         for flag, S, K, t, r, sigma, q in self.arg_combinations
     ]
     self.assertTrue(self.diff_mean(vegas, nvegas) < self.epsilon)
def get_malliavin_greeks_bs_flat(s0: float, t: float, no_steps: int,
                                 no_paths: int, r: float, q: float,
                                 sigma: float, payoff: Callable[[ndarray],
                                                                ndarray],
                                 euler_scheme: EULER_SCHEME_TYPE):
    shift_delta = 0.01
    shift_vega = 0.01

    z = np.random.standard_normal(size=(no_paths, no_steps - 1))
    drift_t = partial(bs_drift_flat, rate_t=r, dividend_t=q)
    sigma_t = partial(bs_sigma_flat, sigma_t=sigma)
    sigma_t_shift = partial(bs_sigma_flat, sigma_t=sigma + shift_vega)

    s_t = sde_euler_simulation(0.0, t, s0, no_steps, no_paths, z, drift_t,
                               sigma_t, euler_scheme)

    s_t_shift_delta = sde_euler_simulation(0.0, t, s0 + shift_delta, no_steps,
                                           no_paths, z, drift_t, sigma_t,
                                           euler_scheme)

    s_t_shift_vega = sde_euler_simulation(0.0, t, s0, no_steps, no_paths, z,
                                          drift_t, sigma_t_shift, euler_scheme)

    phi_t = payoff(s_t[:, -1])
    mc_price = np.average(phi_t) * np.exp(-r * t)
    mc_price_delta = np.average(payoff(s_t_shift_delta[:, -1])) * np.exp(
        -r * t)
    mc_price_vega = np.average(payoff(s_t_shift_vega[:, -1])) * np.exp(-r * t)

    delta = analytical.delta('c', s0, 90, t, r, sigma, q)
    price = black_scholes_merton('c', s0, 90, t, r, sigma, q)
    vega = analytical.vega('c', s0, 90, t, r, sigma, q) * 100

    mc_delta = (mc_price_delta - mc_price) / shift_delta
    malliavin_delta = get_malliavin_delta_bs_flat(phi_t, s_t[:, -1], s0, sigma,
                                                  r, q, t)

    mc_vega = (mc_price_vega - mc_price) / shift_vega
    malliavin_vega = get_malliavin_vega_bs_flat(phi_t, s_t[:, -1], s0, sigma,
                                                r, q, t)

    return mc_delta, malliavin_delta
Exemplo n.º 5
0
 def vega(self, S, vol):
     return bsg.vega(self.flag, S, self.K, option.time_exp[self.exp],
                     self.rate, vol, 0.)