def trades_with_txns(self, events, no_txn_dt): for event in events: # create a transaction for all but # first trade in each sid, to simulate None transaction if event.dt != no_txn_dt: order = Order( sid=event.sid, amount=-25, dt=event.dt ) order.source_id = 'MockOrderSource' yield order yield event txn = Transaction( sid=event.sid, amount=-25, dt=event.dt, price=10.0, commission=0.50, order_id=order.id ) txn.source_id = 'MockTransactionSource' yield txn else: yield event
def trades_with_txns(self, events, no_txn_dt): for event in events: # create a transaction for all but # first trade in each sid, to simulate None transaction if event.dt != no_txn_dt: order = Order(**{ 'sid': event.sid, 'amount': -25, 'dt': event.dt }) yield order yield event txn = Transaction( **{ 'sid': event.sid, 'amount': -25, 'dt': event.dt, 'price': 10.0, 'commission': 0.50, 'order_id': order.id }) yield txn else: yield event
def test_minute_tracker(self): """ Tests minute performance tracking.""" start_dt = trading.environment.exchange_dt_in_utc( datetime.datetime(2013, 3, 1, 9, 30)) end_dt = trading.environment.exchange_dt_in_utc( datetime.datetime(2013, 3, 1, 16, 0)) sim_params = SimulationParameters( period_start=start_dt, period_end=end_dt, emission_rate='minute' ) tracker = perf.PerformanceTracker(sim_params) foo_event_1 = factory.create_trade('foo', 10.0, 20, start_dt) bar_event_1 = factory.create_trade('bar', 100.0, 200, start_dt) txn = Transaction(sid=foo_event_1.sid, amount=-25, dt=foo_event_1.dt, price=10.0, commission=0.50) foo_event_1.TRANSACTION = txn foo_event_2 = factory.create_trade( 'foo', 11.0, 20, start_dt + datetime.timedelta(minutes=1)) bar_event_2 = factory.create_trade( 'bar', 11.0, 20, start_dt + datetime.timedelta(minutes=1)) events = [ foo_event_1, bar_event_1, foo_event_2, bar_event_2 ] import operator messages = {date: snapshot[0].perf_messages[0] for date, snapshot in tracker.transform( itertools.groupby( events, operator.attrgetter('dt')))} self.assertEquals(2, len(messages)) msg_1 = messages[foo_event_1.dt] msg_2 = messages[foo_event_2.dt] self.assertEquals(1, len(msg_1['intraday_perf']['transactions']), "The first message should contain one transaction.") # Check that transactions aren't emitted for previous events. self.assertEquals(0, len(msg_2['intraday_perf']['transactions']), "The second message should have no transactions.") # Ensure that period_close moves through time. # Also, ensure that the period_closes are the expected dts. self.assertEquals(foo_event_1.dt, msg_1['intraday_perf']['period_close']) self.assertEquals(foo_event_2.dt, msg_2['intraday_perf']['period_close'])
def create_close_position_transaction(self, event): if not self._position_amounts.get(event.sid): return None txn = Transaction( sid=event.sid, amount=(-1 * self._position_amounts[event.sid]), dt=event.dt, price=event.price, commission=0, order_id=0 ) return txn
def maybe_create_close_position_transaction(self, event): if not self._position_amounts.get(event.sid): return None if 'price' in event: price = event.price else: price = self._position_last_sale_prices[event.sid] txn = Transaction(sid=event.sid, amount=(-1 * self._position_amounts[event.sid]), dt=event.dt, price=price, commission=0, order_id=0) return txn
def event_with_txn(self, event, no_txn_dt): #create a transaction for all but #first trade in each sid, to simulate None transaction if event.dt != no_txn_dt: txn = Transaction(**{ 'sid': event.sid, 'amount': -25, 'dt': event.dt, 'price': 10.0, 'commission': 0.50 }) else: txn = None event['TRANSACTION'] = txn return event
def maybe_create_close_position_transaction(self, event): try: pos = self.positions[event.sid] amount = pos.amount if amount == 0: return None except KeyError: return None if 'price' in event: price = event.price else: price = pos.last_sale_price txn = Transaction(sid=event.sid, amount=(-1 * pos.amount), dt=event.dt, price=price, commission=0, order_id=0) return txn
def test_minute_tracker(self): """ Tests minute performance tracking.""" with trading.TradingEnvironment(): start_dt = trading.environment.exchange_dt_in_utc( datetime.datetime(2013, 3, 1, 9, 31)) end_dt = trading.environment.exchange_dt_in_utc( datetime.datetime(2013, 3, 1, 16, 0)) sim_params = SimulationParameters( period_start=start_dt, period_end=end_dt, emission_rate='minute' ) tracker = perf.PerformanceTracker(sim_params) foo_event_1 = factory.create_trade('foo', 10.0, 20, start_dt) order_event_1 = Order(sid=foo_event_1.sid, amount=-25, dt=foo_event_1.dt) bar_event_1 = factory.create_trade('bar', 100.0, 200, start_dt) txn_event_1 = Transaction(sid=foo_event_1.sid, amount=-25, dt=foo_event_1.dt, price=10.0, commission=0.50, order_id=order_event_1.id) benchmark_event_1 = Event({ 'dt': start_dt, 'returns': 0.01, 'type': DATASOURCE_TYPE.BENCHMARK }) foo_event_2 = factory.create_trade( 'foo', 11.0, 20, start_dt + datetime.timedelta(minutes=1)) bar_event_2 = factory.create_trade( 'bar', 11.0, 20, start_dt + datetime.timedelta(minutes=1)) benchmark_event_2 = Event({ 'dt': start_dt + datetime.timedelta(minutes=1), 'returns': 0.02, 'type': DATASOURCE_TYPE.BENCHMARK }) events = [ foo_event_1, order_event_1, benchmark_event_1, txn_event_1, bar_event_1, foo_event_2, benchmark_event_2, bar_event_2, ] grouped_events = itertools.groupby( events, operator.attrgetter('dt')) messages = {} for date, group in grouped_events: tracker.set_date(date) for event in group: tracker.process_event(event) tracker.handle_minute_close(date) msg = tracker.to_dict() messages[date] = msg self.assertEquals(2, len(messages)) msg_1 = messages[foo_event_1.dt] msg_2 = messages[foo_event_2.dt] self.assertEquals(1, len(msg_1['minute_perf']['transactions']), "The first message should contain one " "transaction.") # Check that transactions aren't emitted for previous events. self.assertEquals(0, len(msg_2['minute_perf']['transactions']), "The second message should have no " "transactions.") self.assertEquals(1, len(msg_1['minute_perf']['orders']), "The first message should contain one orders.") # Check that orders aren't emitted for previous events. self.assertEquals(0, len(msg_2['minute_perf']['orders']), "The second message should have no orders.") # Ensure that period_close moves through time. # Also, ensure that the period_closes are the expected dts. self.assertEquals(foo_event_1.dt, msg_1['minute_perf']['period_close']) self.assertEquals(foo_event_2.dt, msg_2['minute_perf']['period_close']) # Ensure that a Sharpe value for cumulative metrics is being # created. self.assertIsNotNone(msg_1['cumulative_risk_metrics']['sharpe']) self.assertIsNotNone(msg_2['cumulative_risk_metrics']['sharpe'])