Beispiel #1
0
    def testLongShortEqualAmount(self):
        position_trackerXYZ = returns.PositionTracker()
        position_trackerXYZ.buy(11, 10)
        position_trackerXYZ.sell(11, 30)
        self.assertTrue(position_trackerXYZ.get_cost() == 11 * 10)
        self.assertTrue(
            position_trackerXYZ.get_net_profit(
                PosTrackerTestCase.invalid_price) == 20 * 11)
        self.assertTrue(
            position_trackerXYZ.get_return(PosTrackerTestCase.invalid_price) ==
            2)

        position_trackerABC = returns.PositionTracker()
        position_trackerABC.sell(100, 1.1)
        position_trackerABC.buy(100, 1)
        self.assertTrue(position_trackerABC.get_cost() == 100 * 1.1)
        self.assertTrue(
            round(
                position_trackerABC.get_net_profit(
                    PosTrackerTestCase.invalid_price), 2) == 100 * 0.1)
        self.assertEqual(
            round(
                position_trackerABC.get_return(
                    PosTrackerTestCase.invalid_price), 2), 0.09)

        combinedCost = position_trackerXYZ.get_cost(
        ) + position_trackerABC.get_cost()
        combinedPL = position_trackerXYZ.get_net_profit(
            PosTrackerTestCase.invalid_price
        ) + position_trackerABC.get_net_profit(
            PosTrackerTestCase.invalid_price)
        combinedReturn = combinedPL / float(combinedCost)
        self.assertTrue(round(combinedReturn, 9) == 1.045454545)
Beispiel #2
0
    def __on_order_update(self, broker_, order):
        # Only interested in filled orders.
        if not order.is_filled():
            return

        # Get or create the tracker for this symbol.
        try:
            position_tracker = self.__position_trackers[order.get_symbol()]
        except KeyError:
            position_tracker = returns.PositionTracker()
            self.__position_trackers[order.get_symbol()] = position_tracker

        # Update the tracker for this order.
        price = order.get_execution_info().get_price()
        commission = order.get_execution_info().get_commission()
        action = order.get_action()
        if action in [
                broker.Order.Action.BUY, broker.Order.Action.BUY_TO_COVER
        ]:
            quantity = order.get_execution_info().get_quantity()
        elif action in [
                broker.Order.Action.SELL, broker.Order.Action.SELL_SHORT
        ]:
            quantity = order.get_execution_info().get_quantity() * -1
        else:  # Unknown action
            assert (False)

        self.__update_position_tracker(position_tracker, price, commission,
                                       quantity)
Beispiel #3
0
    def testBuyUpdateAndSell(self):
        position_tracker = returns.PositionTracker()
        position_tracker.buy(1, 10)
        self.assertTrue(position_tracker.get_cost() == 10)
        self.assertTrue(position_tracker.get_net_profit(15) == 5)
        self.assertTrue(position_tracker.get_return(15) == 0.5)

        position_tracker.update(15)
        self.assertTrue(position_tracker.get_cost() == 15)
        position_tracker.sell(1, 20)
        self.assertTrue(position_tracker.get_cost() == 15)
        self.assertTrue(
            position_tracker.get_net_profit(PosTrackerTestCase.invalid_price)
            == 5)
        self.assertTrue(
            round(
                position_tracker.get_return(PosTrackerTestCase.invalid_price),
                2) == 0.33)

        position_tracker.update(100)
        self.assertTrue(position_tracker.get_cost() == 0)
        self.assertTrue(
            position_tracker.get_net_profit(PosTrackerTestCase.invalid_price)
            == 0)
        self.assertTrue(
            position_tracker.get_return(PosTrackerTestCase.invalid_price) == 0)
Beispiel #4
0
 def testBuyAndSellBreakEven(self):
     position_tracker = returns.PositionTracker()
     position_tracker.buy(1, 10)
     position_tracker.sell(1, 10)
     self.assertTrue(position_tracker.get_cost() == 10)
     self.assertTrue(
         position_tracker.get_net_profit(PosTrackerTestCase.invalid_price)
         == 0)
     self.assertTrue(
         position_tracker.get_return(PosTrackerTestCase.invalid_price) == 0)
Beispiel #5
0
 def testSellAndBuyWin(self):
     position_tracker = returns.PositionTracker()
     position_tracker.sell(1, 11)
     position_tracker.buy(1, 10)
     self.assertTrue(position_tracker.get_cost() == 11)
     self.assertTrue(
         position_tracker.get_net_profit(PosTrackerTestCase.invalid_price)
         == 1)
     self.assertTrue(
         round(
             position_tracker.get_return(PosTrackerTestCase.invalid_price),
             4) == round(0.090909091, 4))
Beispiel #6
0
    def testBuyAndUpdate(self):
        position_tracker = returns.PositionTracker()
        position_tracker.buy(1, 10)
        self.assertTrue(position_tracker.get_cost() == 10)
        self.assertTrue(position_tracker.get_net_profit(20) == 10)
        self.assertTrue(position_tracker.get_return(20) == 1)

        position_tracker.update(15)
        self.assertTrue(position_tracker.get_cost() == 15)
        self.assertTrue(position_tracker.get_net_profit(15) == 0)
        self.assertTrue(position_tracker.get_return(15) == 0)

        self.assertTrue(position_tracker.get_net_profit(20) == 5)
        self.assertTrue(round(position_tracker.get_return(20), 2) == 0.33)
Beispiel #7
0
    def testBuySellBuy(self):
        position_tracker = returns.PositionTracker()
        position_tracker.buy(1, 10)
        self.assertTrue(position_tracker.get_cost() == 10)

        position_tracker.sell(2, 13)  # Short selling 1 @ $13
        self.assertTrue(position_tracker.get_cost() == 10 + 13)

        position_tracker.buy(1, 10)
        self.assertTrue(position_tracker.get_cost() == 10 + 13)
        self.assertTrue(
            position_tracker.get_net_profit(PosTrackerTestCase.invalid_price)
            == 6)
        self.assertTrue(
            round(
                position_tracker.get_return(PosTrackerTestCase.invalid_price),
                4) == round(0.260869565, 4))
Beispiel #8
0
    def testBuyAndSellBreakEvenWithCommision(self):
        position_tracker = returns.PositionTracker()
        position_tracker.buy(1, 10, 0.5)
        position_tracker.sell(1, 11, 0.5)
        self.assertTrue(position_tracker.get_cost() == 10)
        self.assertTrue(
            position_tracker.get_net_profit(PosTrackerTestCase.invalid_price,
                                            False) == 1)
        self.assertTrue(
            position_tracker.get_return(PosTrackerTestCase.invalid_price,
                                        False) == 0.1)

        self.assertTrue(
            position_tracker.get_net_profit(PosTrackerTestCase.invalid_price,
                                            True) == 0)
        self.assertTrue(
            position_tracker.get_return(PosTrackerTestCase.invalid_price, True)
            == 0)
Beispiel #9
0
 def testBuyAndSellBreakEvenWithCommission(self):
     position_tracker = returns.PositionTracker()
     position_tracker.buy(1, 10, 0.01)
     position_tracker.sell(1, 10.02, 0.01)
     self.assertTrue(position_tracker.get_cost() == 10)
     # We need to round here or else the testcase fails since the value returned is not exactly 0.<
     # The same issue can be reproduced with this piece of code:
     # a = 10.02 - 10
     # b = 0.02
     # print a - b
     # print a - b == 0
     self.assertTrue(
         round(
             position_tracker.get_net_profit(
                 PosTrackerTestCase.invalid_price), 2) == 0.0)
     self.assertTrue(
         round(
             position_tracker.get_return(PosTrackerTestCase.invalid_price),
             2) == 0.0)
Beispiel #10
0
    def testSellAndBuyMultipleEvals(self):
        position_tracker = returns.PositionTracker()
        position_tracker.sell(2, 11)
        self.assertTrue(position_tracker.get_cost() == 22)
        self.assertTrue(position_tracker.get_net_profit(11) == 0)
        self.assertTrue(position_tracker.get_return(11) == 0)

        position_tracker.buy(1, 10)
        self.assertTrue(position_tracker.get_cost() == 22)
        self.assertTrue(position_tracker.get_net_profit(11) == 1)
        self.assertTrue(
            round(position_tracker.get_return(11), 4) == round(0.045454545, 4))

        position_tracker.buy(1, 10)
        self.assertTrue(position_tracker.get_cost() == 22)
        self.assertTrue(
            position_tracker.get_net_profit(PosTrackerTestCase.invalid_price)
            == 2)
        self.assertTrue(
            round(
                position_tracker.get_return(PosTrackerTestCase.invalid_price),
                4) == round(0.090909091, 4))
Beispiel #11
0
    def testBuyAndSellMultipleEvals(self):
        position_tracker = returns.PositionTracker()
        position_tracker.buy(2, 10)
        self.assertTrue(position_tracker.get_cost() == 20)
        self.assertTrue(position_tracker.get_net_profit(10) == 0)
        self.assertTrue(position_tracker.get_return(10) == 0)

        self.assertTrue(position_tracker.get_net_profit(11) == 2)
        self.assertTrue(position_tracker.get_return(11) == 0.1)

        self.assertTrue(position_tracker.get_net_profit(20) == 20)
        self.assertTrue(position_tracker.get_return(20) == 1)

        position_tracker.sell(1, 11)
        self.assertTrue(position_tracker.get_cost() == 20)
        self.assertTrue(position_tracker.get_net_profit(11) == 2)
        self.assertTrue(position_tracker.get_return(11) == 0.1)

        position_tracker.sell(1, 10)
        self.assertTrue(position_tracker.get_cost() == 20)
        self.assertTrue(
            position_tracker.get_net_profit(PosTrackerTestCase.invalid_price)
            == 1)
        self.assertTrue(position_tracker.get_return(11) == 0.05)