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))
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))
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
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))