Esempio n. 1
0
    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
Esempio n. 2
0
    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
Esempio n. 3
0
    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
Esempio n. 4
0
    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'])
Esempio n. 5
0
 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
Esempio n. 6
0
 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
Esempio n. 7
0
    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
Esempio n. 8
0
 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
Esempio n. 9
0
    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'])