def test_gbm_log_euler_step_nd_output_changes_with_t(self): drift = np.asarray([0.1, 0.3, -0.05], dtype=np.float32) vol_matrix = 0.2 * np.asarray( [[1.5, 0.2, 0.3], [0.2, 1.1, -0.1], [0.3, -0.1, 0.8]], dtype=np.float32) dt = 0.01 t_0 = 0.0 num_samples = 8 num_dims = drift.shape[0] t_1 = t_0 + dt log_states = tf.zeros([num_samples, num_dims]) next_log_states_0 = dynamics.gbm_log_euler_step_nd( log_states, drift, vol_matrix, t_0, dt) next_log_states_1 = dynamics.gbm_log_euler_step_nd( log_states, drift, vol_matrix, t_1, dt) with self.session() as session: next_log_states_0_eval, next_log_states_1_eval = session.run( (next_log_states_0, next_log_states_1)) self.assertEqual(next_log_states_0_eval.shape, (num_samples, num_dims)) self.assertEqual(next_log_states_1_eval.shape, (num_samples, num_dims)) # The step is a bijection w.r.t. dw_t, all terms should be different. self.assertAllDistinct(next_log_states_0_eval, next_log_states_1_eval)
def test_gbm_log_euler_step_nd_is_deterministic(self): drift = np.asarray([0.1, 0.3, -0.05], dtype=np.float32) vol_matrix = 0.2 * np.asarray( [[1.5, 0.2, 0.3], [0.2, 1.1, -0.1], [0.3, -0.1, 0.8]], dtype=np.float32) dt = 0.01 t = 0.0 num_samples = 8 num_dims = drift.shape[0] key = 128 log_states = tf.zeros([num_samples, num_dims]) eps_t = contrib_stateless.stateless_random_normal( shape=[num_samples, num_dims], seed=[key, int(t / dt)]) next_log_states = dynamics.gbm_log_euler_step_nd( log_states, drift, vol_matrix, t, dt, random_normal_op=lambda: eps_t) next_log_states_bis = dynamics.gbm_log_euler_step_nd( log_states, drift, vol_matrix, t, dt, key=key) with self.session() as session: next_log_states_eval, next_log_states_bis_eval = session.run( (next_log_states, next_log_states_bis)) self.assertEqual(next_log_states_eval.shape, (num_samples, num_dims)) self.assertEqual(next_log_states_bis_eval.shape, (num_samples, num_dims)) self.assertAllClose(next_log_states_eval, next_log_states_bis_eval)
def test_gbm_log_euler_step_nd_expects_static_shape(self): drift = np.asarray([0.1, 0.3, -0.05], dtype=np.float32) vol_matrix = 0.2 * np.asarray( [[1.5, 0.2, 0.3], [0.2, 1.1, -0.1], [0.3, -0.1, 0.8]], dtype=np.float32) dt = 0.01 t = 0.0 num_dims = drift.shape[0] log_states = tf.placeholder(dtype=tf.float32, shape=[None, num_dims]) with self.assertRaises(ValueError): dynamics.gbm_log_euler_step_nd(log_states, drift, vol_matrix, t, dt)
def test_gbm_log_euler_step_nd_output_is_correct(self): drift = np.asarray([0.1, 0.3, -0.05], dtype=np.float32) vol_matrix = 0.2 * np.asarray( [[1.5, 0.2, 0.3], [0.2, 1.1, -0.1], [0.3, -0.1, 0.8]], dtype=np.float32) dt = 0.01 t = 0.0 num_samples = 8 num_dims = drift.shape[0] log_states = tf.zeros([num_samples, num_dims]) eps_t = np.ndarray.astype( np.random.normal(size=[num_samples, num_dims]), dtype=np.float32) next_log_states = dynamics.gbm_log_euler_step_nd( log_states, drift, vol_matrix, t, dt, random_normal_op=lambda: eps_t) with self.session() as session: next_log_states_eval = session.run(next_log_states) self.assertEqual(next_log_states_eval.shape, (num_samples, num_dims)) for i in range(num_samples): self.assertAllClose( next_log_states_eval[i], np.zeros([num_dims], dtype=np.float32) + (drift - 0.5 * np.sum(vol_matrix**2, axis=0)) * dt + np.matmul(vol_matrix, eps_t[i] * np.sqrt(dt)))
def _dynamics_op(log_s, t, dt): return dynamics.gbm_log_euler_step_nd(log_s, r, vol, t, dt, key=1)
def _dynamics_op(log_s, t, dt): return gbm_log_euler_step_nd(log_s, sim_drift, sim_vol_matrix, t, dt)