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