def test_buy_and_sell_before_ex(self): # post some trades in the market events = factory.create_trade_history(1, [10, 10, 10, 10, 10, 10], [100, 100, 100, 100, 100, 100], oneday, self.sim_params) dividend = factory.create_dividend(1, 10.00, events[3].dt, events[4].dt, events[5].dt) buy_txn = create_txn(events[1], 10.0, 100) events.insert(1, buy_txn) sell_txn = create_txn(events[3], 10.0, -100) events.insert(3, sell_txn) events.insert(1, dividend) results = calculate_results(self, events) self.assertEqual(len(results), 6) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0, 0, 0, 0, 0, 0]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0, 0, 0, 0, 0, 0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [0, -1000, 1000, 0, 0, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual(cumulative_cash_flows, [0, -1000, 0, 0, 0, 0])
def test_no_position_receives_no_dividend(self): # post some trades in the market events = factory.create_trade_history( 1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params ) dividend = factory.create_dividend( 1, 10.00, events[0].dt, events[1].dt, events[2].dt ) results = calculate_results( self, events, dividend_events=[dividend], ) self.assertEqual(len(results), 5) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0.0, 0.0, 0.0, 0.0, 0.0]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0.0, 0.0, 0.0, 0.0, 0.0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [0, 0, 0, 0, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual(cumulative_cash_flows, [0, 0, 0, 0, 0])
def test_short_position_pays_dividend(self): # post some trades in the market events = factory.create_trade_history( 1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params ) dividend = factory.create_dividend( 1, 10.00, # declare at open of test events[0].dt, # ex_date same as trade 2 events[2].dt, events[3].dt, ) txn = create_txn(1, 10.0, -100, events[1].dt) events.insert(1, txn) events.insert(0, dividend) results = calculate_results(self, events) self.assertEqual(len(results), 5) cumulative_returns = [event["cumulative_perf"]["returns"] for event in results] self.assertEqual(cumulative_returns, [0.0, 0.0, 0.0, -0.1, -0.1]) daily_returns = [event["daily_perf"]["returns"] for event in results] self.assertEqual(daily_returns, [0.0, 0.0, 0.0, -0.1, 0.0]) cash_flows = [event["daily_perf"]["capital_used"] for event in results] self.assertEqual(cash_flows, [0, 1000, 0, -1000, 0]) cumulative_cash_flows = [event["cumulative_perf"]["capital_used"] for event in results] self.assertEqual(cumulative_cash_flows, [0, 1000, 1000, 0, 0])
def test_ending_before_pay_date(self): # post some trades in the market events = factory.create_trade_history(1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params) pay_date = self.sim_params.first_open # find pay date that is much later. for i in xrange(30): pay_date = factory.get_next_trading_dt(pay_date, oneday) dividend = factory.create_dividend(1, 10.00, events[0].dt, events[1].dt, pay_date) buy_txn = create_txn(events[1], 10.0, 100) events.insert(2, buy_txn) events.insert(1, dividend) results = calculate_results(self, events) self.assertEqual(len(results), 5) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0, 0, 0, 0.0, 0.0]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0, 0, 0, 0, 0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [0, -1000, 0, 0, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual(cumulative_cash_flows, [0, -1000, -1000, -1000, -1000])
def test_long_position_receives_dividend(self): # post some trades in the market events = factory.create_trade_history( 1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params ) dividend = factory.create_dividend( 1, 10.00, # declared date, when the algorithm finds out about # the dividend events[1].dt, # ex_date, when the algorithm is credited with the # dividend events[1].dt, # pay date, when the algorithm receives the dividend. events[2].dt, ) txn = create_txn(1, 10.0, 100, events[0].dt) events.insert(0, txn) events.insert(1, dividend) results = calculate_results(self, events) self.assertEqual(len(results), 5) cumulative_returns = [event["cumulative_perf"]["returns"] for event in results] self.assertEqual(cumulative_returns, [0.0, 0.0, 0.1, 0.1, 0.1]) daily_returns = [event["daily_perf"]["returns"] for event in results] self.assertEqual(daily_returns, [0.0, 0.0, 0.10, 0.0, 0.0]) cash_flows = [event["daily_perf"]["capital_used"] for event in results] self.assertEqual(cash_flows, [-1000, 0, 1000, 0, 0]) cumulative_cash_flows = [event["cumulative_perf"]["capital_used"] for event in results] self.assertEqual(cumulative_cash_flows, [-1000, -1000, 0, 0, 0]) cash_pos = [event["cumulative_perf"]["ending_cash"] for event in results] self.assertEqual(cash_pos, [9000, 9000, 10000, 10000, 10000])
def test_short_position_pays_dividend(self): # post some trades in the market events = factory.create_trade_history(1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params) dividend = factory.create_dividend( 1, 10.00, # declare at open of test events[0].dt, # ex_date same as trade 2 events[2].dt, events[3].dt) txn = create_txn(events[1], 10.0, -100) events.insert(1, txn) events.insert(0, dividend) results = calculate_results(self, events) self.assertEqual(len(results), 5) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0.0, 0.0, 0.0, -0.1, -0.1]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0.0, 0.0, 0.0, -0.1, 0.0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [0, 1000, 0, -1000, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual(cumulative_cash_flows, [0, 1000, 1000, 0, 0])
def test_no_position_receives_no_dividend(self): # post some trades in the market events = factory.create_trade_history( 1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params ) dividend = factory.create_dividend( 1, 10.00, events[0].dt, events[1].dt, events[2].dt ) events.insert(1, dividend) results = calculate_results(self, events) self.assertEqual(len(results), 5) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0.0, 0.0, 0.0, 0.0, 0.0]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0.0, 0.0, 0.0, 0.0, 0.0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [0, 0, 0, 0, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual(cumulative_cash_flows, [0, 0, 0, 0, 0])
def test_ending_before_pay_date(self): # post some trades in the market events = factory.create_trade_history( 1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params ) pay_date = self.sim_params.first_open # find pay date that is much later. for i in xrange(30): pay_date = factory.get_next_trading_dt(pay_date, oneday) dividend = factory.create_dividend(1, 10.00, events[0].dt, events[1].dt, pay_date) buy_txn = create_txn(1, 10.0, 100, events[1].dt) events.insert(2, buy_txn) events.insert(1, dividend) results = calculate_results(self, events) self.assertEqual(len(results), 5) cumulative_returns = [event["cumulative_perf"]["returns"] for event in results] self.assertEqual(cumulative_returns, [0, 0, 0, 0.0, 0.0]) daily_returns = [event["daily_perf"]["returns"] for event in results] self.assertEqual(daily_returns, [0, 0, 0, 0, 0]) cash_flows = [event["daily_perf"]["capital_used"] for event in results] self.assertEqual(cash_flows, [0, -1000, 0, 0, 0]) cumulative_cash_flows = [event["cumulative_perf"]["capital_used"] for event in results] self.assertEqual(cumulative_cash_flows, [0, -1000, -1000, -1000, -1000])
def test_no_position_receives_no_dividend(self): #post some trades in the market events = factory.create_trade_history(1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params) dividend = factory.create_dividend(1, 10.00, events[0].dt, events[1].dt, events[2].dt) events.insert(1, dividend) perf_tracker = perf.PerformanceTracker(self.sim_params) transformed_events = list( perf_tracker.transform(((event.dt, [event]) for event in events))) #flatten the list of events results = [] for te in transformed_events: for event in te[1]: for message in event.perf_messages: results.append(message) perf_messages, risk = perf_tracker.handle_simulation_end() results.append(perf_messages[0]) self.assertEqual(len(results), 5) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0.0, 0.0, 0.0, 0.0, 0.0]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0.0, 0.0, 0.0, 0.0, 0.0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [0, 0, 0, 0, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual(cumulative_cash_flows, [0, 0, 0, 0, 0])
def test_ending_before_pay_date(self): #post some trades in the market events = factory.create_trade_history( 1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params ) dividend = factory.create_dividend( 1, 10.00, events[0].dt, events[1].dt, events[-1].dt + 10 * oneday ) buy_txn = create_txn(1, 10.0, 100, events[1].dt) events.insert(2, buy_txn) events.insert(1, dividend) perf_tracker = perf.PerformanceTracker(self.sim_params) all_events = (msg[1] for msg in heapq.merge( ((event.dt, event) for event in events), ((event.dt, event) for event in self.benchmark_events))) transformed_events = list(perf_tracker.transform( itertools.groupby(all_events, attrgetter('dt')))) #flatten the list of events results = [] for te in transformed_events: for event in te[1]: for message in event.perf_messages: results.append(message) perf_messages, risk = perf_tracker.handle_simulation_end() results.append(perf_messages[0]) self.assertEqual(len(results), 5) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0, 0, 0, 0.0, 0.0]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0, 0, 0, 0, 0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [0, -1000, 0, 0, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual( cumulative_cash_flows, [0, -1000, -1000, -1000, -1000] )
def test_buy_and_sell_before_ex(self): #post some trades in the market events = factory.create_trade_history( 1, [10, 10, 10, 10, 10, 10], [100, 100, 100, 100, 100, 100], oneday, self.sim_params ) dividend = factory.create_dividend( 1, 10.00, events[3].dt, events[4].dt, events[5].dt ) buy_txn = create_txn(1, 10.0, 100, events[1].dt) events.insert(2, buy_txn) sell_txn = create_txn(1, 10.0, -100, events[3].dt) events.insert(4, sell_txn) events.insert(1, dividend) perf_tracker = perf.PerformanceTracker(self.sim_params) all_events = heapq.merge( ((event.dt, event) for event in events), ((event.dt, event) for event in self.benchmark_events)) transformed_events = list(perf_tracker.transform( (event[0], [event[1]]) for event in all_events)) #flatten the list of events results = [] for te in transformed_events: for event in te[1]: for message in event.perf_messages: results.append(message) perf_messages, risk = perf_tracker.handle_simulation_end() results.append(perf_messages[0]) self.assertEqual(len(results), 6) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0, 0, 0, 0, 0, 0]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0, 0, 0, 0, 0, 0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [0, -1000, 1000, 0, 0, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual(cumulative_cash_flows, [0, -1000, 0, 0, 0, 0])
def test_long_position_receives_dividend(self): #post some trades in the market events = factory.create_trade_history(1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params) dividend = factory.create_dividend( 1, 10.00, # declared date, when the algorithm finds out about # the dividend events[1].dt, # ex_date, when the algorithm is credited with the # dividend events[1].dt, # pay date, when the algorithm receives the dividend. events[2].dt) txn = factory.create_txn(1, 10.0, 100, events[0].dt) events[0].TRANSACTION = txn events.insert(1, dividend) perf_tracker = perf.PerformanceTracker(self.sim_params) transformed_events = list( perf_tracker.transform(((event.dt, [event]) for event in events))) #flatten the list of events results = [] for te in transformed_events: for event in te[1]: for message in event.perf_messages: results.append(message) perf_messages, risk = perf_tracker.handle_simulation_end() results.append(perf_messages[0]) self.assertEqual(results[0]['daily_perf']['period_open'], events[0].dt) self.assertEqual(results[-1]['daily_perf']['period_open'], events[-1].dt) self.assertEqual(len(results), 5) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0.0, 0.0, 0.1, 0.1, 0.1]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0.0, 0.0, 0.10, 0.0, 0.0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [-1000, 0, 1000, 0, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual(cumulative_cash_flows, [-1000, -1000, 0, 0, 0]) cash_pos = \ [event['cumulative_perf']['ending_cash'] for event in results] self.assertEqual(cash_pos, [9000, 9000, 10000, 10000, 10000])
def test_long_position_receives_dividend(self): #post some trades in the market events = factory.create_trade_history( 1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.trading_environment ) dividend = factory.create_dividend( 1, 10.00, events[0].dt, events[1].dt, events[2].dt ) events.insert(1, dividend) txn = factory.create_txn(1, 10.0, 100, self.dt+oneday) events[2].TRANSACTION = txn perf_tracker = perf.PerformanceTracker(self.trading_environment) transformed_events = list(perf_tracker.transform( ((event.dt, [event]) for event in events)) ) #flatten the list of events results = [] for te in transformed_events: for event in te[1]: for message in event.perf_messages: results.append(message) perf_messages, risk = perf_tracker.handle_simulation_end() results.append(perf_messages[0]) self.assertEqual(results[0]['daily_perf']['period_open'], events[0].dt) self.assertEqual( results[-1]['daily_perf']['period_open'], events[-1].dt ) self.assertEqual(len(results), 5) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0.0, 0.0, 0.1, 0.1, 0.1]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0.0, 0.0, 0.10, 0.0, 0.0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [0, -1000, 1000, 0, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual(cumulative_cash_flows, [0, -1000, 0, 0, 0])
def test_selling_before_dividend_payment_still_gets_paid(self): #post some trades in the market events = factory.create_trade_history( 1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params ) dividend = factory.create_dividend( 1, 10.00, events[0].dt, events[1].dt, events[3].dt ) buy_txn = factory.create_txn(1, 10.0, 100, events[0].dt) events[0].TRANSACTION = buy_txn sell_txn = factory.create_txn(1, 10.0, -100, events[2].dt) events[2].TRANSACTION = sell_txn events.insert(1, dividend) perf_tracker = perf.PerformanceTracker(self.sim_params) transformed_events = list(perf_tracker.transform( ((event.dt, [event]) for event in events)) ) #flatten the list of events results = [] for te in transformed_events: for event in te[1]: for message in event.perf_messages: results.append(message) perf_messages, risk = perf_tracker.handle_simulation_end() results.append(perf_messages[0]) self.assertEqual(len(results), 5) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0, 0, 0, 0.1, 0.1]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0, 0, 0, 0.1, 0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [-1000, 0, 1000, 1000, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual(cumulative_cash_flows, [-1000, -1000, 0, 1000, 1000])
def test_long_position_receives_dividend(self): with trading.TradingEnvironment(): # post some trades in the market events = factory.create_trade_history( 1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params ) dividend = factory.create_dividend( 1, 10.00, # declared date, when the algorithm finds out about # the dividend events[0].dt, # ex_date, the date before which the algorithm must hold stock # to receive the dividend events[1].dt, # pay date, when the algorithm receives the dividend. events[2].dt ) # Simulate a transaction being filled prior to the ex_date. txns = [create_txn(events[0], 10.0, 100)] results = calculate_results( self, events, dividend_events=[dividend], txns=txns, ) self.assertEqual(len(results), 5) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0.0, 0.0, 0.1, 0.1, 0.1]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0.0, 0.0, 0.10, 0.0, 0.0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [-1000, 0, 1000, 0, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual(cumulative_cash_flows, [-1000, -1000, 0, 0, 0]) cash_pos = \ [event['cumulative_perf']['ending_cash'] for event in results] self.assertEqual(cash_pos, [9000, 9000, 10000, 10000, 10000])
def raw_data_gen(self): with open(self.fname, 'r') as f: for line in f: toks = line.split(',') sid = toks[0] tDay = pytz.utc.localize(datetime.strptime(str(toks[1]), '%Y%m%d')) nAmt = float(toks[2].replace('\n','')) # Set ex_date to the data's datetime. # Move the declared date arbitrarily one day back from ex_date. # Move the payment date arbitrarily one day forward from ex_date. ex_date = tDay declared_date = ex_date - timedelta(days=1) pay_date = ex_date + timedelta(days=1) event = create_dividend(sid, nAmt, tDay, tDay, tDay) yield event
def test_long_position_receives_dividend(self): with trading.TradingEnvironment(): # post some trades in the market events = factory.create_trade_history(1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params) dividend = factory.create_dividend( 1, 10.00, # declared date, when the algorithm finds out about # the dividend events[0].dt, # ex_date, the date before which the algorithm must hold stock # to receive the dividend events[1].dt, # pay date, when the algorithm receives the dividend. events[2].dt) # Simulate a transaction being filled prior to the ex_date. txns = [create_txn(events[0], 10.0, 100)] results = calculate_results( self, events, dividend_events=[dividend], txns=txns, ) self.assertEqual(len(results), 5) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0.0, 0.0, 0.1, 0.1, 0.1]) daily_returns = [ event['daily_perf']['returns'] for event in results ] self.assertEqual(daily_returns, [0.0, 0.0, 0.10, 0.0, 0.0]) cash_flows = [ event['daily_perf']['capital_used'] for event in results ] self.assertEqual(cash_flows, [-1000, 0, 1000, 0, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual(cumulative_cash_flows, [-1000, -1000, 0, 0, 0]) cash_pos = \ [event['cumulative_perf']['ending_cash'] for event in results] self.assertEqual(cash_pos, [9000, 9000, 10000, 10000, 10000])
def test_long_position_receives_dividend(self): with trading.TradingEnvironment(): # post some trades in the market events = factory.create_trade_history( 1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params ) dividend = factory.create_dividend( 1, 10.00, # declared date, when the algorithm finds out about # the dividend events[1].dt, # ex_date, when the algorithm is credited with the # dividend events[1].dt, # pay date, when the algorithm receives the dividend. events[2].dt ) txn = create_txn(events[0], 10.0, 100) events.insert(0, txn) events.insert(1, dividend) results = calculate_results(self, events) self.assertEqual(len(results), 5) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0.0, 0.0, 0.1, 0.1, 0.1]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0.0, 0.0, 0.10, 0.0, 0.0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [-1000, 0, 1000, 0, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual(cumulative_cash_flows, [-1000, -1000, 0, 0, 0]) cash_pos = \ [event['cumulative_perf']['ending_cash'] for event in results] self.assertEqual(cash_pos, [9000, 9000, 10000, 10000, 10000])
def test_ending_before_pay_date(self): # post some trades in the market events = factory.create_trade_history( 1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params ) pay_date = self.sim_params.first_open # find pay date that is much later. for i in range(30): pay_date = factory.get_next_trading_dt(pay_date, oneday) dividend = factory.create_dividend( 1, 10.00, events[0].dt, events[0].dt, pay_date ) txns = [create_txn(events[1], 10.0, 100)] results = calculate_results( self, events, dividend_events=[dividend], txns=txns, ) self.assertEqual(len(results), 5) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0, 0, 0, 0.0, 0.0]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0, 0, 0, 0, 0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [0, -1000, 0, 0, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual( cumulative_cash_flows, [0, -1000, -1000, -1000, -1000] )
def test_short_position_pays_dividend(self): # post some trades in the market events = factory.create_trade_history( 1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params ) dividend = factory.create_dividend( 1, 10.00, # declare at open of test events[0].dt, # ex_date same as trade 2 events[2].dt, events[3].dt ) txns = [create_txn(events[1], 10.0, -100)] results = calculate_results( self, events, dividend_events=[dividend], txns=txns, ) self.assertEqual(len(results), 5) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0.0, 0.0, 0.0, -0.1, -0.1]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0.0, 0.0, 0.0, -0.1, 0.0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [0, 1000, 0, -1000, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual(cumulative_cash_flows, [0, 1000, 1000, 0, 0])
def test_buy_and_sell_before_ex(self): # post some trades in the market events = factory.create_trade_history( 1, [10, 10, 10, 10, 10, 10], [100, 100, 100, 100, 100, 100], oneday, self.sim_params ) dividend = factory.create_dividend( 1, 10.00, events[3].dt, events[4].dt, events[5].dt ) buy_txn = create_txn(events[1], 10.0, 100) sell_txn = create_txn(events[2], 10.0, -100) txns = [buy_txn, sell_txn] results = calculate_results( self, events, dividend_events=[dividend], txns=txns, ) self.assertEqual(len(results), 6) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0, 0, 0, 0, 0, 0]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0, 0, 0, 0, 0, 0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [0, -1000, 1000, 0, 0, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual(cumulative_cash_flows, [0, -1000, 0, 0, 0, 0])
def test_long_position_purchased_on_ex_date_receives_no_dividend(self): # post some trades in the market events = factory.create_trade_history( 1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params ) dividend = factory.create_dividend( 1, 10.00, events[0].dt, # Declared date events[1].dt, # Exclusion date events[2].dt # Pay date ) # Simulate a transaction being filled on the ex_date. txns = [create_txn(events[1], 10.0, 100)] results = calculate_results( self, events, dividend_events=[dividend], txns=txns, ) self.assertEqual(len(results), 5) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0, 0, 0, 0, 0]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0, 0, 0, 0, 0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [0, -1000, 0, 0, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual(cumulative_cash_flows, [0, -1000, -1000, -1000, -1000])
def test_selling_before_dividend_payment_still_gets_paid(self): # post some trades in the market events = factory.create_trade_history( 1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params ) dividend = factory.create_dividend( 1, 10.00, events[0].dt, # Declared date events[1].dt, # Exclusion date events[3].dt # Pay date ) buy_txn = create_txn(events[0], 10.0, 100) sell_txn = create_txn(events[2], 10.0, -100) txns = [buy_txn, sell_txn] results = calculate_results( self, events, dividend_events=[dividend], txns=txns, ) self.assertEqual(len(results), 5) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0, 0, 0, 0.1, 0.1]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0, 0, 0, 0.1, 0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [-1000, 0, 1000, 1000, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual(cumulative_cash_flows, [-1000, -1000, 0, 1000, 1000])
def test_post_ex_long_position_receives_no_dividend(self): # post some trades in the market events = factory.create_trade_history( 1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params ) dividend = factory.create_dividend(1, 10.00, events[0].dt, events[1].dt, events[2].dt) events.insert(1, dividend) txn = create_txn(1, 10.0, 100, events[3].dt) events.insert(4, txn) results = calculate_results(self, events) self.assertEqual(len(results), 5) cumulative_returns = [event["cumulative_perf"]["returns"] for event in results] self.assertEqual(cumulative_returns, [0, 0, 0, 0, 0]) daily_returns = [event["daily_perf"]["returns"] for event in results] self.assertEqual(daily_returns, [0, 0, 0, 0, 0]) cash_flows = [event["daily_perf"]["capital_used"] for event in results] self.assertEqual(cash_flows, [0, 0, -1000, 0, 0]) cumulative_cash_flows = [event["cumulative_perf"]["capital_used"] for event in results] self.assertEqual(cumulative_cash_flows, [0, 0, -1000, -1000, -1000])
def test_buy_and_sell_before_ex(self): # post some trades in the market events = factory.create_trade_history( 1, [10, 10, 10, 10, 10, 10], [100, 100, 100, 100, 100, 100], oneday, self.sim_params ) dividend = factory.create_dividend(1, 10.00, events[3].dt, events[4].dt, events[5].dt) buy_txn = create_txn(1, 10.0, 100, events[1].dt) events.insert(1, buy_txn) sell_txn = create_txn(1, 10.0, -100, events[3].dt) events.insert(3, sell_txn) events.insert(1, dividend) results = calculate_results(self, events) self.assertEqual(len(results), 6) cumulative_returns = [event["cumulative_perf"]["returns"] for event in results] self.assertEqual(cumulative_returns, [0, 0, 0, 0, 0, 0]) daily_returns = [event["daily_perf"]["returns"] for event in results] self.assertEqual(daily_returns, [0, 0, 0, 0, 0, 0]) cash_flows = [event["daily_perf"]["capital_used"] for event in results] self.assertEqual(cash_flows, [0, -1000, 1000, 0, 0, 0]) cumulative_cash_flows = [event["cumulative_perf"]["capital_used"] for event in results] self.assertEqual(cumulative_cash_flows, [0, -1000, 0, 0, 0, 0])
def test_long_position_purchased_on_ex_date_receives_no_dividend(self): # post some trades in the market events = factory.create_trade_history(1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params) dividend = factory.create_dividend( 1, 10.00, events[0].dt, # Declared date events[1].dt, # Exclusion date events[2].dt # Pay date ) # Simulate a transaction being filled on the ex_date. txns = [create_txn(events[1], 10.0, 100)] results = calculate_results( self, events, dividend_events=[dividend], txns=txns, ) self.assertEqual(len(results), 5) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0, 0, 0, 0, 0]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0, 0, 0, 0, 0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [0, -1000, 0, 0, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual(cumulative_cash_flows, [0, -1000, -1000, -1000, -1000])
def test_selling_before_dividend_payment_still_gets_paid(self): # post some trades in the market events = factory.create_trade_history(1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params) dividend = factory.create_dividend( 1, 10.00, events[0].dt, # Declared date events[1].dt, # Exclusion date events[3].dt # Pay date ) buy_txn = create_txn(events[0], 10.0, 100) sell_txn = create_txn(events[2], 10.0, -100) txns = [buy_txn, sell_txn] results = calculate_results( self, events, dividend_events=[dividend], txns=txns, ) self.assertEqual(len(results), 5) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0, 0, 0, 0.1, 0.1]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0, 0, 0, 0.1, 0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [-1000, 0, 1000, 1000, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual(cumulative_cash_flows, [-1000, -1000, 0, 1000, 1000])
def test_selling_before_dividend_payment_still_gets_paid(self): # post some trades in the market events = factory.create_trade_history( 1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params ) dividend = factory.create_dividend( 1, 10.00, events[0].dt, events[1].dt, events[3].dt ) buy_txn = create_txn(events[0], 10.0, 100) events.insert(1, buy_txn) sell_txn = create_txn(events[3], 10.0, -100) events.insert(4, sell_txn) events.insert(0, dividend) results = calculate_results(self, events) self.assertEqual(len(results), 5) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0, 0, 0, 0.1, 0.1]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0, 0, 0, 0.1, 0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [-1000, 0, 1000, 1000, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual(cumulative_cash_flows, [-1000, -1000, 0, 1000, 1000])
def test_long_position_receives_dividend(self): #post some trades in the market events = factory.create_trade_history( 1, [10, 10, 10, 10, 10], [100, 100, 100, 100, 100], oneday, self.sim_params ) dividend = factory.create_dividend( 1, 10.00, # declared date, when the algorithm finds out about # the dividend events[1].dt, # ex_date, when the algorithm is credited with the # dividend events[1].dt, # pay date, when the algorithm receives the dividend. events[2].dt ) txn = factory.create_txn(1, 10.0, 100, events[0].dt) events[0].TRANSACTION = txn events.insert(1, dividend) perf_tracker = perf.PerformanceTracker(self.sim_params) transformed_events = list(perf_tracker.transform( ((event.dt, [event]) for event in events)) ) #flatten the list of events results = [] for te in transformed_events: for event in te[1]: for message in event.perf_messages: results.append(message) perf_messages, risk = perf_tracker.handle_simulation_end() results.append(perf_messages[0]) self.assertEqual(results[0]['daily_perf']['period_open'], events[0].dt) self.assertEqual( results[-1]['daily_perf']['period_open'], events[-1].dt ) self.assertEqual(len(results), 5) cumulative_returns = \ [event['cumulative_perf']['returns'] for event in results] self.assertEqual(cumulative_returns, [0.0, 0.0, 0.1, 0.1, 0.1]) daily_returns = [event['daily_perf']['returns'] for event in results] self.assertEqual(daily_returns, [0.0, 0.0, 0.10, 0.0, 0.0]) cash_flows = [event['daily_perf']['capital_used'] for event in results] self.assertEqual(cash_flows, [-1000, 0, 1000, 0, 0]) cumulative_cash_flows = \ [event['cumulative_perf']['capital_used'] for event in results] self.assertEqual(cumulative_cash_flows, [-1000, -1000, 0, 0, 0]) cash_pos = \ [event['cumulative_perf']['ending_cash'] for event in results] self.assertEqual(cash_pos, [9000, 9000, 10000, 10000, 10000])