Example #1
0
 def setUp(self):
     self.price_events = Queue.Queue()
     self.order_events = Queue.Queue()
     stoprequest = threading.Event()
     self.ticker = MockPriceStream(self.price_events, stoprequest)
     #bid=3, ask=4
     self.ticker.newprice(3, 4)
     #        self.ticker.stream_to_queue()
     self.pf = Portfolio(self.ticker, self.order_events, "EUR", 1, 10000,
                         0.02)
     self.leverage_pf = Portfolio(self.ticker, self.order_events, "EUR", 20,
                                  10000, 0.02)
 def setUp(self):
     self.price_events = Queue.Queue()
     self.order_events = Queue.Queue()
     stoprequest = threading.Event()
     self.ticker = MockPriceStream(self.price_events, stoprequest)
     # bid=3, ask=4
     self.ticker.newprice(3, 4)
     #        self.ticker.stream_to_queue()
     self.pf = Portfolio(self.ticker, self.order_events, "EUR", 1, 10000, 0.02)
     self.leverage_pf = Portfolio(self.ticker, self.order_events, "EUR", 20, 10000, 0.02)
class Test_Portfolio(unittest.TestCase):
    """
    Unit tests for the class Portfolio
    """

    def setUp(self):
        self.price_events = Queue.Queue()
        self.order_events = Queue.Queue()
        stoprequest = threading.Event()
        self.ticker = MockPriceStream(self.price_events, stoprequest)
        # bid=3, ask=4
        self.ticker.newprice(3, 4)
        #        self.ticker.stream_to_queue()
        self.pf = Portfolio(self.ticker, self.order_events, "EUR", 1, 10000, 0.02)
        self.leverage_pf = Portfolio(self.ticker, self.order_events, "EUR", 20, 10000, 0.02)

    def test_correct_init(self):
        self.assertEqual(self.pf.balance, self.pf.equity)
        self.assertEqual(self.pf.trade_units, 200)

    def test_risk_position_size(self):
        self.assertEqual(self.pf.calc_risk_position_size(), 200)
        self.assertEqual(self.leverage_pf.calc_risk_position_size(), 10)

    def test_add_new_position(self):
        self.pf.add_new_position("LONG", "EUR_USD", 100, 500, 4, 3)
        self.assertEqual(self.pf.positions["EUR_USD"].side, "LONG")
        self.assertEqual(self.pf.positions["EUR_USD"].market, "EUR_USD")
        self.assertEqual(self.pf.positions["EUR_USD"].units, 100)
        self.assertEqual(self.pf.positions["EUR_USD"].exposure, 500)
        self.assertEqual(self.pf.positions["EUR_USD"].avg_price, 4)
        self.assertEqual(self.pf.positions["EUR_USD"].cur_price, 3)
        self.pf.add_new_position("SHORT", "EUR_CHF", 100, 500, 3, 4)
        self.assertEqual(self.pf.positions["EUR_CHF"].side, "SHORT")
        self.assertEqual(self.pf.positions["EUR_CHF"].market, "EUR_CHF")
        self.assertEqual(self.pf.positions["EUR_CHF"].units, 100)
        self.assertEqual(self.pf.positions["EUR_CHF"].exposure, 500)
        self.assertEqual(self.pf.positions["EUR_CHF"].avg_price, 3)
        self.assertEqual(self.pf.positions["EUR_CHF"].cur_price, 4)

    def test_add_position_units(self):
        self.pf.add_new_position("LONG", "EUR_USD", 100, 500, 4, 3)
        self.pf.add_position_units("EUR_USD", 300, 500, 8, 4)
        self.assertEqual(self.pf.positions["EUR_USD"].side, "LONG")
        self.assertEqual(self.pf.positions["EUR_USD"].market, "EUR_USD")
        self.assertEqual(self.pf.positions["EUR_USD"].units, 400)
        self.assertEqual(self.pf.positions["EUR_USD"].exposure, 1000)
        self.assertEqual(self.pf.positions["EUR_USD"].avg_price, 7)
        self.assertEqual(self.pf.positions["EUR_USD"].cur_price, 4)
        self.pf.add_new_position("SHORT", "EUR_CHF", 100, 500, 3, 4)
        self.pf.add_position_units("EUR_CHF", 300, 500, 4, 8)
        self.assertEqual(self.pf.positions["EUR_CHF"].side, "SHORT")
        self.assertEqual(self.pf.positions["EUR_CHF"].market, "EUR_CHF")
        self.assertEqual(self.pf.positions["EUR_CHF"].units, 400)
        self.assertEqual(self.pf.positions["EUR_CHF"].exposure, 1000)
        self.assertEqual(self.pf.positions["EUR_CHF"].avg_price, 3)
        self.assertEqual(self.pf.positions["EUR_CHF"].cur_price, 8)

    def test_remove_position_units(self):
        self.pf.add_new_position("LONG", "EUR_USD", 100, 500, 4, 3)
        self.pf.remove_position_units("EUR_USD", 50, 2)
        self.assertEqual(self.pf.positions["EUR_USD"].side, "LONG")
        self.assertEqual(self.pf.positions["EUR_USD"].units, 50)
        self.assertEqual(self.pf.positions["EUR_USD"].exposure, 450)
        self.assertEqual(self.pf.balance, 9950)

    def test_close_position(self):
        self.pf.add_new_position("LONG", "EUR_USD", 100, 500, 4, 3)
        self.pf.close_position("EUR_USD", 2)
        self.assertEqual(self.pf.balance, 9500)

    def test_execute_fill_event_new_position_long(self):
        buyevent = FillEvent("EUR_USD", 200, "LONG", 4)
        self.pf.execute_fill_event(buyevent)
        self.assertEqual(self.pf.positions["EUR_USD"].side, "LONG")
        self.assertEqual(self.pf.positions["EUR_USD"].market, "EUR_USD")
        self.assertEqual(self.pf.positions["EUR_USD"].units, 200)
        self.assertEqual(self.pf.positions["EUR_USD"].exposure, 200)
        self.assertEqual(self.pf.positions["EUR_USD"].avg_price, 4)
        self.assertEqual(self.pf.positions["EUR_USD"].cur_price, 3)

    def test_execute_fill_event_new_position_short(self):
        sellevent = FillEvent("EUR_USD", 100, "SHORT", 3)
        self.leverage_pf.execute_fill_event(sellevent)
        self.assertEqual(self.leverage_pf.positions["EUR_USD"].side, "SHORT")
        self.assertEqual(self.leverage_pf.positions["EUR_USD"].market, "EUR_USD")
        self.assertEqual(self.leverage_pf.positions["EUR_USD"].units, 100)
        self.assertEqual(self.leverage_pf.positions["EUR_USD"].exposure, 2000)
        self.assertEqual(self.leverage_pf.positions["EUR_USD"].avg_price, 3)

    #        self.assertEqual(self.pf.positions["EUR_CHF"].cur_price, 4)

    def test_execute_fill_event_add_to_position(self):
        buyevent = FillEvent("EUR_USD", 200, "LONG", 4)
        self.pf.execute_fill_event(buyevent)
        buyevent = FillEvent("EUR_USD", 200, "LONG", 4)
        self.pf.execute_fill_event(buyevent)
        self.assertEqual(self.pf.positions["EUR_USD"].side, "LONG")
        self.assertEqual(self.pf.positions["EUR_USD"].market, "EUR_USD")
        self.assertEqual(self.pf.positions["EUR_USD"].units, 400)
        self.assertEqual(self.pf.positions["EUR_USD"].exposure, 400)

    def test_execute_fill_event_remove_from_position(self):
        buyevent = FillEvent("EUR_USD", 200, "LONG", 4)
        self.pf.execute_fill_event(buyevent)
        self.pf.execute_fill_event(buyevent)
        sellevent = FillEvent("EUR_USD", 200, "SHORT", 2)
        self.pf.execute_fill_event(sellevent)
        self.assertEqual(self.pf.positions["EUR_USD"].side, "LONG")
        self.assertEqual(self.pf.positions["EUR_USD"].market, "EUR_USD")
        self.assertEqual(self.pf.positions["EUR_USD"].units, 200)
        self.assertEqual(self.pf.positions["EUR_USD"].exposure, 200)
        self.assertEqual(self.pf.balance, 9800)

    def test_execute_signal_remove_position(self):
        buyevent = FillEvent("EUR_USD", 200, "LONG", 4)
        self.pf.execute_fill_event(buyevent)
        sellevent = FillEvent("EUR_USD", 200, "SHORT", 4)
        self.pf.execute_fill_event(sellevent)
        self.assertNotIn("EUR_USD", self.pf.positions.keys())

    def test_execute_signal_invert_position(self):
        buyevent = FillEvent("EUR_USD", 200, "LONG", 4)
        self.pf.execute_fill_event(buyevent)
        sellevent = FillEvent("EUR_USD", 400, "SHORT", 2)
        self.pf.execute_fill_event(sellevent)
        self.assertEqual(self.pf.positions["EUR_USD"].side, "SHORT")
        self.assertEqual(self.pf.positions["EUR_USD"].market, "EUR_USD")
        self.assertEqual(self.pf.positions["EUR_USD"].units, 200)
        self.assertEqual(self.pf.positions["EUR_USD"].exposure, 200)
        self.assertEqual(self.pf.balance, 9800)
Example #4
0
class Test_Portfolio(unittest.TestCase):
    """
    Unit tests for the class Portfolio
    """
    def setUp(self):
        self.price_events = Queue.Queue()
        self.order_events = Queue.Queue()
        stoprequest = threading.Event()
        self.ticker = MockPriceStream(self.price_events, stoprequest)
        #bid=3, ask=4
        self.ticker.newprice(3, 4)
        #        self.ticker.stream_to_queue()
        self.pf = Portfolio(self.ticker, self.order_events, "EUR", 1, 10000,
                            0.02)
        self.leverage_pf = Portfolio(self.ticker, self.order_events, "EUR", 20,
                                     10000, 0.02)

    def test_correct_init(self):
        self.assertEqual(self.pf.balance, self.pf.equity)
        self.assertEqual(self.pf.trade_units, 200)

    def test_risk_position_size(self):
        self.assertEqual(self.pf.calc_risk_position_size(), 200)
        self.assertEqual(self.leverage_pf.calc_risk_position_size(), 10)

    def test_add_new_position(self):
        self.pf.add_new_position('LONG', "EUR_USD", 100, 500, 4, 3)
        self.assertEqual(self.pf.positions["EUR_USD"].side, 'LONG')
        self.assertEqual(self.pf.positions["EUR_USD"].market, 'EUR_USD')
        self.assertEqual(self.pf.positions["EUR_USD"].units, 100)
        self.assertEqual(self.pf.positions["EUR_USD"].exposure, 500)
        self.assertEqual(self.pf.positions["EUR_USD"].avg_price, 4)
        self.assertEqual(self.pf.positions["EUR_USD"].cur_price, 3)
        self.pf.add_new_position('SHORT', "EUR_CHF", 100, 500, 3, 4)
        self.assertEqual(self.pf.positions["EUR_CHF"].side, 'SHORT')
        self.assertEqual(self.pf.positions["EUR_CHF"].market, 'EUR_CHF')
        self.assertEqual(self.pf.positions["EUR_CHF"].units, 100)
        self.assertEqual(self.pf.positions["EUR_CHF"].exposure, 500)
        self.assertEqual(self.pf.positions["EUR_CHF"].avg_price, 3)
        self.assertEqual(self.pf.positions["EUR_CHF"].cur_price, 4)

    def test_add_position_units(self):
        self.pf.add_new_position('LONG', "EUR_USD", 100, 500, 4, 3)
        self.pf.add_position_units("EUR_USD", 300, 500, 8, 4)
        self.assertEqual(self.pf.positions["EUR_USD"].side, 'LONG')
        self.assertEqual(self.pf.positions["EUR_USD"].market, 'EUR_USD')
        self.assertEqual(self.pf.positions["EUR_USD"].units, 400)
        self.assertEqual(self.pf.positions["EUR_USD"].exposure, 1000)
        self.assertEqual(self.pf.positions["EUR_USD"].avg_price, 7)
        self.assertEqual(self.pf.positions["EUR_USD"].cur_price, 4)
        self.pf.add_new_position('SHORT', "EUR_CHF", 100, 500, 3, 4)
        self.pf.add_position_units("EUR_CHF", 300, 500, 4, 8)
        self.assertEqual(self.pf.positions["EUR_CHF"].side, 'SHORT')
        self.assertEqual(self.pf.positions["EUR_CHF"].market, 'EUR_CHF')
        self.assertEqual(self.pf.positions["EUR_CHF"].units, 400)
        self.assertEqual(self.pf.positions["EUR_CHF"].exposure, 1000)
        self.assertEqual(self.pf.positions["EUR_CHF"].avg_price, 3)
        self.assertEqual(self.pf.positions["EUR_CHF"].cur_price, 8)

    def test_remove_position_units(self):
        self.pf.add_new_position('LONG', "EUR_USD", 100, 500, 4, 3)
        self.pf.remove_position_units("EUR_USD", 50, 2)
        self.assertEqual(self.pf.positions["EUR_USD"].side, 'LONG')
        self.assertEqual(self.pf.positions["EUR_USD"].units, 50)
        self.assertEqual(self.pf.positions["EUR_USD"].exposure, 450)
        self.assertEqual(self.pf.balance, 9950)

    def test_close_position(self):
        self.pf.add_new_position('LONG', "EUR_USD", 100, 500, 4, 3)
        self.pf.close_position("EUR_USD", 2)
        self.assertEqual(self.pf.balance, 9500)

    def test_execute_fill_event_new_position_long(self):
        buyevent = FillEvent("EUR_USD", 200, 'LONG', 4)
        self.pf.execute_fill_event(buyevent)
        self.assertEqual(self.pf.positions["EUR_USD"].side, 'LONG')
        self.assertEqual(self.pf.positions["EUR_USD"].market, 'EUR_USD')
        self.assertEqual(self.pf.positions["EUR_USD"].units, 200)
        self.assertEqual(self.pf.positions["EUR_USD"].exposure, 200)
        self.assertEqual(self.pf.positions["EUR_USD"].avg_price, 4)
        self.assertEqual(self.pf.positions["EUR_USD"].cur_price, 3)

    def test_execute_fill_event_new_position_short(self):
        sellevent = FillEvent("EUR_USD", 100, 'SHORT', 3)
        self.leverage_pf.execute_fill_event(sellevent)
        self.assertEqual(self.leverage_pf.positions["EUR_USD"].side, 'SHORT')
        self.assertEqual(self.leverage_pf.positions["EUR_USD"].market,
                         'EUR_USD')
        self.assertEqual(self.leverage_pf.positions["EUR_USD"].units, 100)
        self.assertEqual(self.leverage_pf.positions["EUR_USD"].exposure, 2000)
        self.assertEqual(self.leverage_pf.positions["EUR_USD"].avg_price, 3)


#        self.assertEqual(self.pf.positions["EUR_CHF"].cur_price, 4)

    def test_execute_fill_event_add_to_position(self):
        buyevent = FillEvent("EUR_USD", 200, 'LONG', 4)
        self.pf.execute_fill_event(buyevent)
        buyevent = FillEvent("EUR_USD", 200, 'LONG', 4)
        self.pf.execute_fill_event(buyevent)
        self.assertEqual(self.pf.positions["EUR_USD"].side, 'LONG')
        self.assertEqual(self.pf.positions["EUR_USD"].market, 'EUR_USD')
        self.assertEqual(self.pf.positions["EUR_USD"].units, 400)
        self.assertEqual(self.pf.positions["EUR_USD"].exposure, 400)

    def test_execute_fill_event_remove_from_position(self):
        buyevent = FillEvent("EUR_USD", 200, 'LONG', 4)
        self.pf.execute_fill_event(buyevent)
        self.pf.execute_fill_event(buyevent)
        sellevent = FillEvent("EUR_USD", 200, 'SHORT', 2)
        self.pf.execute_fill_event(sellevent)
        self.assertEqual(self.pf.positions["EUR_USD"].side, 'LONG')
        self.assertEqual(self.pf.positions["EUR_USD"].market, 'EUR_USD')
        self.assertEqual(self.pf.positions["EUR_USD"].units, 200)
        self.assertEqual(self.pf.positions["EUR_USD"].exposure, 200)
        self.assertEqual(self.pf.balance, 9800)

    def test_execute_signal_remove_position(self):
        buyevent = FillEvent("EUR_USD", 200, 'LONG', 4)
        self.pf.execute_fill_event(buyevent)
        sellevent = FillEvent("EUR_USD", 200, 'SHORT', 4)
        self.pf.execute_fill_event(sellevent)
        self.assertNotIn('EUR_USD', self.pf.positions.keys())

    def test_execute_signal_invert_position(self):
        buyevent = FillEvent("EUR_USD", 200, 'LONG', 4)
        self.pf.execute_fill_event(buyevent)
        sellevent = FillEvent("EUR_USD", 400, 'SHORT', 2)
        self.pf.execute_fill_event(sellevent)
        self.assertEqual(self.pf.positions["EUR_USD"].side, 'SHORT')
        self.assertEqual(self.pf.positions["EUR_USD"].market, 'EUR_USD')
        self.assertEqual(self.pf.positions["EUR_USD"].units, 200)
        self.assertEqual(self.pf.positions["EUR_USD"].exposure, 200)
        self.assertEqual(self.pf.balance, 9800)