From 0955515c46058c1a9f4d7680a4dcc70d2c38241c Mon Sep 17 00:00:00 2001 From: Andrew Liang Date: Wed, 13 Jul 2016 14:01:50 -0400 Subject: [PATCH] TEST: Test capital changes using target values --- tests/test_algorithm.py | 91 ++++++++++++++++++++++++++++++----------- 1 file changed, 66 insertions(+), 25 deletions(-) diff --git a/tests/test_algorithm.py b/tests/test_algorithm.py index 2ce0cb2d..1161e4ff 100644 --- a/tests/test_algorithm.py +++ b/tests/test_algorithm.py @@ -2023,14 +2023,18 @@ class TestCapitalChanges(WithLogger, index=pd.DatetimeIndex(days), ) - def test_capital_changes_daily_mode(self): + @parameterized.expand([ + ('target', 153000.0), ('delta', 50000.0) + ]) + def test_capital_changes_daily_mode(self, change_type, value): sim_params = factory.create_simulation_parameters( start=pd.Timestamp('2006-01-03', tz='UTC'), end=pd.Timestamp('2006-01-09', tz='UTC') ) capital_changes = { - pd.Timestamp('2006-01-06', tz='UTC'): 50000 + pd.Timestamp('2006-01-06', tz='UTC'): + {'type': change_type, 'value': value} } algocode = """ @@ -2157,8 +2161,22 @@ def order_stuff(context, data): expected_cumulative[stat] ) - @parameterized.expand([('interday',), ('intraday',)]) - def test_capital_changes_minute_mode_daily_emission(self, change): + self.assertEqual( + algo.capital_change_deltas, + {pd.Timestamp('2006-01-06', tz='UTC'): 50000.0} + ) + + @parameterized.expand([ + ('interday_target', [('2006-01-04', 2388.0)]), + ('interday_delta', [('2006-01-04', 1000.0)]), + ('intraday_target', [('2006-01-04 17:00', 2186.0), + ('2006-01-04 18:00', 2806.0)]), + ('intraday_delta', [('2006-01-04 17:00', 500.0), + ('2006-01-04 18:00', 500.0)]), + ]) + def test_capital_changes_minute_mode_daily_emission(self, change, values): + change_loc, change_type = change.split('_') + sim_params = factory.create_simulation_parameters( start=pd.Timestamp('2006-01-03', tz='UTC'), end=pd.Timestamp('2006-01-05', tz='UTC'), @@ -2166,13 +2184,8 @@ def order_stuff(context, data): capital_base=1000.0 ) - if change == 'intraday': - capital_changes = { - pd.Timestamp('2006-01-04 17:00', tz='UTC'): 500.0, - pd.Timestamp('2006-01-04 18:00', tz='UTC'): 500.0, - } - else: - capital_changes = {pd.Timestamp('2006-01-04', tz='UTC'): 1000.0} + capital_changes = {pd.Timestamp(val[0], tz='UTC'): { + 'type': change_type, 'value': val[1]} for val in values} algocode = """ from zipline.api import set_slippage, set_commission, slippage, commission, \ @@ -2214,7 +2227,7 @@ def order_stuff(context, data): 0.0, 1000.0, 0.0 ]) - if change == 'intraday': + if change_loc == 'intraday': # Fills at 491, +500 capital change comes at 638 (17:00) and # 698 (18:00), ends day at 879 day2_return = (1388.0 + 149.0 + 147.0)/1388.0 * \ @@ -2251,7 +2264,7 @@ def order_stuff(context, data): expected_daily['ending_cash'] - \ expected_daily['capital_used'] - if change == 'intraday': + if change_loc == 'intraday': # Capital changes come after day start expected_daily['starting_cash'] -= expected_capital_changes @@ -2296,8 +2309,29 @@ def order_stuff(context, data): expected_cumulative[stat] ) - @parameterized.expand([('interday',), ('intraday',)]) - def test_capital_changes_minute_mode_minute_emission(self, change): + if change_loc == 'interday': + self.assertEqual( + algo.capital_change_deltas, + {pd.Timestamp('2006-01-04', tz='UTC'): 1000.0} + ) + else: + self.assertEqual( + algo.capital_change_deltas, + {pd.Timestamp('2006-01-04 17:00', tz='UTC'): 500.0, + pd.Timestamp('2006-01-04 18:00', tz='UTC'): 500.0} + ) + + @parameterized.expand([ + ('interday_target', [('2006-01-04', 2388.0)]), + ('interday_delta', [('2006-01-04', 1000.0)]), + ('intraday_target', [('2006-01-04 17:00', 2186.0), + ('2006-01-04 18:00', 2806.0)]), + ('intraday_delta', [('2006-01-04 17:00', 500.0), + ('2006-01-04 18:00', 500.0)]), + ]) + def test_capital_changes_minute_mode_minute_emission(self, change, values): + change_loc, change_type = change.split('_') + sim_params = factory.create_simulation_parameters( start=pd.Timestamp('2006-01-03', tz='UTC'), end=pd.Timestamp('2006-01-05', tz='UTC'), @@ -2306,13 +2340,8 @@ def order_stuff(context, data): capital_base=1000.0 ) - if change == 'intraday': - capital_changes = { - pd.Timestamp('2006-01-04 17:00', tz='UTC'): 500.0, - pd.Timestamp('2006-01-04 18:00', tz='UTC'): 500.0, - } - else: - capital_changes = {pd.Timestamp('2006-01-04', tz='UTC'): 1000.0} + capital_changes = {pd.Timestamp(val[0], tz='UTC'): { + 'type': change_type, 'value': val[1]} for val in values} algocode = """ from zipline.api import set_slippage, set_commission, slippage, commission, \ @@ -2353,7 +2382,7 @@ def order_stuff(context, data): expected_minute = {} capital_changes_after_start = np.array([0.0] * 1170) - if change == 'intraday': + if change_loc == 'intraday': capital_changes_after_start[539:599] = 500.0 capital_changes_after_start[599:780] = 1000.0 @@ -2373,7 +2402,7 @@ def order_stuff(context, data): )) # +1000 capital changes comes before the day start if interday - day2adj = 0.0 if change == 'intraday' else 1000.0 + day2adj = 0.0 if change_loc == 'intraday' else 1000.0 expected_minute['starting_cash'] = np.concatenate(( [1000.0] * 390, @@ -2412,7 +2441,7 @@ def order_stuff(context, data): # the pnl, starting_value and starting_cash. If the change is intraday, # the returns after the change have to be calculated from two # subperiods - if change == 'intraday': + if change_loc == 'intraday': # The last packet (at 1/04 16:59) before the first capital change prev_subperiod_return = expected_minute['returns'][538] @@ -2510,6 +2539,18 @@ def order_stuff(context, data): expected_cumulative[stat] ) + if change_loc == 'interday': + self.assertEqual( + algo.capital_change_deltas, + {pd.Timestamp('2006-01-04', tz='UTC'): 1000.0} + ) + else: + self.assertEqual( + algo.capital_change_deltas, + {pd.Timestamp('2006-01-04 17:00', tz='UTC'): 500.0, + pd.Timestamp('2006-01-04 18:00', tz='UTC'): 500.0} + ) + class TestGetDatetime(WithLogger, WithSimParams,