Exemplo n.º 1
0
    def test_multi_orders(self):
        # Settings: (Use list to contain data)
        date_range = pd.date_range('2020-01-01', periods=3, freq='D')
        order_info = [('market', 'ticker1', 3.0, None),
                      ('target', 'ticker1', 2.0, 1.1),
                      ('target', 'ticker2', 2.0, 0.2),
                      ('limit_up', 'ticker1', 3.0, 2.0),
                      ('limit_up', 'ticker2', -4.0, 1.8),
                      ('limit_down', 'ticker2', 3.0, 4.2)]
        execute_price = [1.0, 1.1, None, 2.0, None, 4.2]

        # Backtest on the period:
        for i in range(len(date_range)):
            date = date_range[i]
            self.trading_system.create_order(bt.Order(*order_info[i * 2]))
            self.trading_system.create_order(bt.Order(*order_info[i * 2 + 1]))
            self.market.execute_orders(self.trading_system, date)

        # Expected final result:
        transaction = pd.DataFrame(
            dict(
                Date=pd.to_datetime(['2020-01-01'] * 4 + ['2020-01-03'] * 4),
                Ticker=['ticker1', 'Cash'] * 3 + ['ticker2', 'Cash'],
                Quantity=[3., -3., 2., -2.2, 3., -6., 3., -12.6],
            ))
        account = bt.Account(date_range[-1], {
            'ticker1': 8.,
            'ticker2': 3.,
            'Cash': -23.8,
        })
        order_book = [bt.Order(*order_info[2]), bt.Order(*order_info[4])]

        assert_frame_equal(self.trading_system.transaction, transaction)
        self.assertEqual(self.trading_system.account, account)
        self.assertEqual(self.trading_system.order_book, order_book)
Exemplo n.º 2
0
    def test_target_fail_order(self):
        order_book = []
        # Create target buy order:
        share, price = 3., 4.3
        order = bt.Order('target', 'ticker1', share, price)
        self.trading_system.create_order(order)
        order_book.append(order)
        # Execute at '2020-01-01' and fail:
        date = pd.to_datetime('2020-01-01')
        self.market.execute_orders(self.trading_system, date)
        transaction = pd.DataFrame(columns=['Date', 'Ticker', 'Quantity'])
        transaction = transaction.astype({'Ticker': str, 'Quantity': float})
        account = (date, dict())

        assert_frame_equal(self.trading_system.transaction, transaction)
        self.assertEqual(self.trading_system.account, account)
        self.assertEqual(self.trading_system.order_book, order_book)

        # Create target sell order:
        share, price = 2., 1.5
        order = bt.Order('target', 'ticker2', -share, price)
        self.trading_system.create_order(order)
        order_book.append(order)
        self.assertEqual(self.trading_system.order_book, order_book)
        # Execute at '2020-01-03' and fail:
        date = pd.to_datetime('2020-01-03')
        self.market.execute_orders(self.trading_system, date)
        account = (date, dict())

        assert_frame_equal(self.trading_system.transaction, transaction)
        self.assertEqual(self.trading_system.account, account)
        self.assertEqual(self.trading_system.order_book, order_book)
Exemplo n.º 3
0
 def test_limit_down_sell_intra_order(self):
     order_type, ticker, share, price = 'limit_down', 'ticker2', -2.0, 3.5
     date = pd.to_datetime('2020-01-02')
     execute_price = 3.5
     # Create limit up order:
     order = bt.Order(order_type, ticker, share, price)
     self.trading_system.create_order(order)
     order_book = [order]
     self.assertEqual(self.trading_system.order_book, order_book)
     # Execute at '2020-01-02' and succeed at open:
     self.market.execute_orders(self.trading_system, date)
     transaction = pd.DataFrame(
         dict(
             Date=[date] * 2,
             Ticker=[ticker, 'Cash'],
             Quantity=[share, -share * execute_price],
         ))
     account = bt.Account(date, {
         ticker: share,
         'Cash': -share * execute_price,
     })
     order_book = list()
     assert_frame_equal(self.trading_system.transaction, transaction)
     self.assertEqual(self.trading_system.account, account)
     self.assertEqual(self.trading_system.order_book, order_book)
Exemplo n.º 4
0
    def test_limit_down_sell_fail_order(self):
        # Setting for test:
        order_type, ticker, share, price = 'limit_down', 'ticker1', -2.0, 4.1
        date = pd.to_datetime('2020-01-02')
        execute_price = None
        # Create limit up buy order:
        order = bt.Order(order_type, ticker, share, price)
        self.trading_system.create_order(order)
        order_book = [order]
        self.assertEqual(self.trading_system.order_book, order_book)
        # Execute at '2020-01-02' and fail:
        self.market.execute_orders(self.trading_system, date)
        transaction = pd.DataFrame(columns=['Date', 'Ticker', 'Quantity'])
        transaction = transaction.astype({'Ticker': str, 'Quantity': float})
        account = (date, dict())

        assert_frame_equal(self.trading_system.transaction, transaction)
        self.assertEqual(self.trading_system.account, account)
        self.assertEqual(self.trading_system.order_book, order_book)
Exemplo n.º 5
0
    def test_target_buy_order(self):
        # Create target buy order:
        share, price = 1.0, 3.2
        order = bt.Order('target', 'ticker1', share, price)
        self.trading_system.create_order(order)
        order_book = [order]
        self.assertEqual(self.trading_system.order_book, order_book)

        # Execute at '2020-01-02' and succeed:
        date = pd.to_datetime('2020-01-02')
        self.market.execute_orders(self.trading_system, date)
        transaction = pd.DataFrame(
            dict(
                Date=[date, date],
                Ticker=['ticker1', 'Cash'],
                Quantity=[share, -share * price],
            ))
        account = bt.Account(date, {'ticker1': share, 'Cash': -share * price})
        order_book = list()
        assert_frame_equal(self.trading_system.transaction, transaction)
        self.assertEqual(self.trading_system.account, account)
        self.assertEqual(self.trading_system.order_book, order_book)
Exemplo n.º 6
0
 def test_market_sell_order(self):
     # Create market sell order:
     share, price = 2., 4.
     order = bt.Order('market', 'ticker2', -share, None)
     self.trading_system.create_order(order)
     order_book = [order]
     self.assertEqual(self.trading_system.order_book, order_book)
     # Execute a sell order at '2020-01-03'
     date = pd.to_datetime('2020-01-03')
     self.market.execute_orders(self.trading_system, date)
     transaction = pd.DataFrame(
         dict(
             Date=[date] * 2,
             Ticker=['ticker2', 'Cash'],
             Quantity=[-share, share * price],
         ))
     account = bt.Account(date, {
         'ticker2': -share,
         'Cash': share * price,
     })
     order_book = list()
     assert_frame_equal(self.trading_system.transaction, transaction)
     self.assertEqual(self.trading_system.account, account)
     self.assertEqual(self.trading_system.order_book, order_book)