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)
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)
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)
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)