Beispiel #1
0
    def test_mc_estimator_converges_with_multiple_fixed_estimates_nd(self):
        num_dims = 8
        mean = np.arange(1.27, 1.349, 0.01)
        stddev = 2.0
        batch_size = int(1e5)
        dummy_key_placeholder = tf.placeholder(shape=(), dtype=tf.int32)

        mean_est = tf.constant(mean)
        mean_sq_est = tf.ones([num_dims]) * (stddev**2)

        tol = 5e-3
        conf_level = 0.99

        max_num_steps = (util.half_clt_conf_interval(conf_level, 1, stddev) /
                         (np.min(mean) * tol))**2 + 1
        with self.test_session() as session:
            (mean_est_eval, rel_half_conf_interval,
             converged) = monte_carlo_manager.mc_estimator(
                 mean_est, mean_sq_est, batch_size, dummy_key_placeholder, {},
                 tol, conf_level, max_num_steps, session)

        self.assertAllAlmostEqual(mean_est_eval, mean * np.ones([num_dims]))
        self.assertTrue(converged)
        self.assertAllGreaterEqual(
            rel_half_conf_interval * mean,
            util.half_clt_conf_interval(conf_level, max_num_steps * batch_size,
                                        stddev))
Beispiel #2
0
    def test_mc_estimator_converges_with_fixed_estimates(self):
        mean = 1.3
        stddev = 2.0
        batch_size = int(1e5)
        dummy_key_placeholder = tf.placeholder(shape=(), dtype=tf.int32)

        mean_est = tf.constant(mean)
        mean_sq_est = tf.constant(stddev**2)

        tol = 5e-3
        conf_level = 0.99

        max_num_steps = (util.half_clt_conf_interval(conf_level, 1, stddev) /
                         (mean * tol))**2 + 1

        with self.test_session() as session:
            (mean_est_eval, rel_half_conf_interval,
             converged) = monte_carlo_manager.mc_estimator(
                 mean_est, mean_sq_est, batch_size, dummy_key_placeholder, {},
                 tol, conf_level, max_num_steps, session)

        self.assertAlmostEqual(mean_est_eval, mean)
        self.assertTrue(converged)
        self.assertGreaterEqual(
            rel_half_conf_interval,
            util.half_clt_conf_interval(conf_level, max_num_steps * batch_size,
                                        stddev) / mean)
Beispiel #3
0
    def test_european_call_estimator_converges_close_to_black_scholes(self):
        current_price = 100.0
        r = interest_rate = 0.05
        vol = 0.2
        strike = 120.0
        maturity = 0.5
        dt = 0.001
        discount = tf.exp(-r * maturity)

        tol = 5e-2
        conf_level = 0.95
        batch_size = int(1e4)
        k = key_placeholder = tf.placeholder(shape=(), dtype=tf.int32)
        max_num_steps = 1e5

        bs_call_price = util.black_scholes_call_price(current_price,
                                                      interest_rate, vol,
                                                      strike, maturity)

        initial_state = tf.constant(current_price)

        dynamics_op = lambda s, t, dt: dynamics.gbm_euler_step(
            s, r, vol, t, dt, k)
        payoff_fn = lambda s: discount * payoffs.call_payoff(s, strike)

        (mean_est, mean_sq_est, _) = monte_carlo_manager.non_callable_price_mc(
            initial_state, dynamics_op, payoff_fn, maturity, batch_size, dt)

        with self.test_session() as session:
            (mean_est_eval, _, converged) = monte_carlo_manager.mc_estimator(
                mean_est, mean_sq_est, batch_size, key_placeholder, {}, tol,
                conf_level, max_num_steps, session)

            bs_call_price_eval = session.run(bs_call_price)

        self.assertTrue(converged)
        # Here the discretization bias would make these asserts fail with larger dt.
        self.assertLessEqual(mean_est_eval, bs_call_price_eval * (1.0 + tol))
        self.assertGreaterEqual(mean_est_eval,
                                bs_call_price_eval * (1.0 - tol))