Esempio n. 1
0
    def test_std_estimate_works_with_arrays(self):
        num_dims = 16
        mean_est = np.ones(num_dims)
        mean_sq_est = np.ones(num_dims)
        stddev_est = util.stddev_est(mean_est, mean_sq_est)

        self.assertAllEqual(stddev_est, np.zeros(num_dims))
Esempio n. 2
0
    def test_std_estimate_works_with_tensors(self):
        num_dims = 16
        mean_est = tf.ones(num_dims)
        mean_sq_est = tf.ones(num_dims)
        stddev_est = util.stddev_est(mean_est, mean_sq_est)

        with self.test_session() as session:
            stddev_est_eval = session.run(stddev_est)

        self.assertAllEqual(stddev_est_eval, np.zeros(num_dims))
Esempio n. 3
0
    def _run_mc_step():
        """Run one mini-batch step of the Monte-Carlo method."""
        feed_dict.update({key_placeholder: num_steps})
        batch_mean_est, batch_mean_sq_est = tf_session.run(
            (mean_est, mean_sq_est), feed_dict=feed_dict)

        new_mean_est_eval = util.running_mean_estimate(mean_est_eval,
                                                       batch_mean_est,
                                                       num_samples, batch_size)
        new_mean_sq_est_eval = util.running_mean_estimate(
            mean_sq_est_eval, batch_mean_sq_est, num_samples, batch_size)
        std_est_eval = util.stddev_est(new_mean_est_eval, new_mean_sq_est_eval)

        half_conf_interval = util.half_clt_conf_interval(
            confidence, num_samples + batch_size, std_est_eval)

        return new_mean_est_eval, new_mean_sq_est_eval, half_conf_interval
Esempio n. 4
0
    def test_european_call_log_euler_mc_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.01
        discount = tf.exp(-r * maturity)

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

        num_samples = int(1e4)
        initial_state = tf.constant(current_price)

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

        (mean_outcome, mean_sq_outcome,
         _) = monte_carlo_manager.non_callable_price_mc(
             tf.log(initial_state), dynamics_op, payoff_fn, maturity,
             num_samples, dt)

        std_outcomes = util.stddev_est(mean_outcome, mean_sq_outcome)

        with self.test_session() as session:
            bs_call_price_eval = session.run(bs_call_price)
            mean_outcome_eval, std_outcomes_eval = session.run(
                (mean_outcome, std_outcomes))

        self.assertLessEqual(
            mean_outcome_eval, bs_call_price_eval +
            3.0 * std_outcomes_eval / np.sqrt(num_samples))
        self.assertGreaterEqual(
            mean_outcome_eval, bs_call_price_eval -
            3.0 * std_outcomes_eval / np.sqrt(num_samples))