Example #1
0
    def testBuyAndSellMultipleEvals(self):
        posTracker = returns.PositionTracker(INSTRUMENT, DefaultInstrumentTraits())
        posTracker.buy(2, 10)
        self.assertEqual(posTracker.getAvgPrice(), 10)
        self.assertEqual(posTracker.getPnL(), 0)
        self.assertEqual(posTracker.getPnL(price=9), -2)
        self.assertEqual(posTracker.getPnL(price=10), 0)
        self.assertEqual(posTracker.getPnL(price=11), 2)
        self.assertEqual(posTracker.getReturn(10), 0)

        self.assertEqual(posTracker.getPnL(price=11), 2)
        self.assertEqual(round(posTracker.getReturn(11), 2), 0.1)

        self.assertEqual(posTracker.getPnL(price=20), 20)
        self.assertEqual(posTracker.getReturn(20), 1)

        posTracker.sell(1, 11)
        self.assertEqual(posTracker.getAvgPrice(), 10)
        self.assertEqual(posTracker.getPnL(price=11), 2)
        self.assertEqual(posTracker.getReturn(11), 0.1)

        posTracker.sell(1, 10)
        self.assertEqual(posTracker.getAvgPrice(), 0)
        self.assertEqual(posTracker.getPnL(), 1)
        self.assertEqual(posTracker.getReturn(11), 0.05)
Example #2
0
 def testBuyAndSellWin(self):
     posTracker = returns.PositionTracker(INSTRUMENT, DefaultInstrumentTraits())
     posTracker.buy(1, 10)
     self.assertEqual(posTracker.getAvgPrice(), 10)
     posTracker.sell(1, 11)
     self.assertEqual(posTracker.getAvgPrice(), 0)
     self.assertEqual(posTracker.getPnL(), 1)
     self.assertTrue(posTracker.getReturn() == 0.1)
Example #3
0
 def testBuyAndSellBreakEvenWithCommision(self):
     posTracker = returns.PositionTracker(INSTRUMENT, DefaultInstrumentTraits())
     posTracker.buy(1, 10, 0.5)
     self.assertEqual(posTracker.getAvgPrice(), 10)
     posTracker.sell(1, 11, 0.5)
     self.assertEqual(posTracker.getPnL(includeCommissions=False), 1)
     self.assertEqual(posTracker.getPnL(), 0)
     self.assertEqual(posTracker.getReturn(includeCommissions=False), 0.1)
     self.assertEqual(posTracker.getReturn(), 0)
Example #4
0
 def testSellAndBuyWin(self):
     posTracker = returns.PositionTracker(INSTRUMENT, DefaultInstrumentTraits())
     posTracker.sell(1, 13)
     self.assertEqual(posTracker.getAvgPrice(), 13)
     self.assertEqual(posTracker.getPnL(), 0)
     self.assertEqual(posTracker.getPnL(price=10), 3)
     posTracker.buy(1, 10)
     self.assertEqual(posTracker.getAvgPrice(), 0)
     self.assertEqual(posTracker.getPnL(), 3)
     self.assertEqual(round(posTracker.getReturn(), 9), round(0.23076923076923, 9))
Example #5
0
 def testBuyAndSellInTwoTrades(self):
     posTracker = returns.PositionTracker(INSTRUMENT, DefaultInstrumentTraits())
     posTracker.buy(2, 10)
     self.assertEqual(posTracker.getAvgPrice(), 10)
     posTracker.sell(1, 11)
     self.assertEqual(posTracker.getAvgPrice(), 10)
     self.assertEqual(posTracker.getPnL(), 1)
     self.assertEqual(posTracker.getReturn(), 0.05)
     posTracker.sell(1, 12)
     self.assertEqual(posTracker.getPnL(), 3)
     self.assertEqual(posTracker.getReturn(), 3/20.0)
Example #6
0
    def testSeparateAndCombined(self):
        posA = returns.PositionTracker(INSTRUMENT, DefaultInstrumentTraits())
        posA.buy(11, 10)
        posA.sell(11, 30)
        self.assertEqual(posA.getPnL(), 20*11)
        self.assertEqual(posA.getReturn(), 2)

        posB = returns.PositionTracker(INSTRUMENT, DefaultInstrumentTraits())
        posB.sell(100, 1.1)
        posB.buy(100, 1)
        self.assertEqual(round(posB.getPnL(), 2), 100*0.1)
        self.assertEqual(round(posB.getReturn(), 2), 0.09)

        combinedPos = returns.PositionTracker(INSTRUMENT, DefaultInstrumentTraits())
        combinedPos.buy(11, 10)
        combinedPos.sell(11, 30)
        combinedPos.sell(100, 1.1)
        combinedPos.buy(100, 1)
        self.assertEqual(round(combinedPos.getReturn(), 6), 2.090909)
        # The return of the combined position is less than the two returns combined
        # because when the second position gets opened the amount of cash not invested is greater
        # than that of posB alone.
        self.assertLess(round(combinedPos.getReturn(), 6), ((1+posA.getReturn())*(1+posB.getReturn())-1))
Example #7
0
 def testBuyAndSellBreakEvenWithCommission(self):
     posTracker = returns.PositionTracker(INSTRUMENT, DefaultInstrumentTraits())
     posTracker.buy(1, 10, 0.01)
     self.assertEqual(posTracker.getPosition(), 1)
     self.assertEqual(posTracker.getAvgPrice(), 10)
     posTracker.sell(1, 10.02, 0.01)
     self.assertEqual(posTracker.getPosition(), 0)
     self.assertEqual(posTracker.getAvgPrice(), 0)
     # We need to round to avoid floating point errors.
     # 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.assertEqual(posTracker.getPosition(), 0)
     self.assertEqual(round(posTracker.getPnL(), 2), 0)
     self.assertEqual(round(posTracker.getReturn(), 2), 0)
Example #8
0
    def testSellAndBuyMultipleEvals(self):
        posTracker = returns.PositionTracker(INSTRUMENT, DefaultInstrumentTraits())
        posTracker.sell(2, 11)
        self.assertEqual(posTracker.getAvgPrice(), 11)
        self.assertEqual(posTracker.getPnL(price=10), 2)
        self.assertEqual(posTracker.getPnL(price=11), 0)
        self.assertEqual(posTracker.getPnL(price=12), -2)
        self.assertEqual(posTracker.getReturn(11), 0)

        posTracker.buy(1, 10)
        self.assertEqual(posTracker.getAvgPrice(), 11)
        self.assertEqual(posTracker.getPnL(price=11), 1)
        self.assertEqual(round(posTracker.getReturn(11), 9), round(0.045454545, 9))

        posTracker.buy(1, 10)
        self.assertEqual(posTracker.getAvgPrice(), 0)
        self.assertEqual(posTracker.getPnL(), 2)
        self.assertEqual(posTracker.getPnL(price=100), 2)
        self.assertEqual(round(posTracker.getReturn(), 9), round(0.090909091, 9))
Example #9
0
    def testSellBuySell(self):
        posTracker = returns.PositionTracker(INSTRUMENT, DefaultInstrumentTraits())
        posTracker.sell(1, 10)
        self.assertEqual(posTracker.getAvgPrice(), 10)
        self.assertEqual(posTracker.getPnL(), 0)
        self.assertEqual(posTracker.getReturn(), 0)
        self.assertEqual(posTracker.getPnL(price=13), -3)
        self.assertEqual(posTracker.getReturn(13), -0.3)

        # Closing the short position and going long 1 @ $13.
        # The cost basis for the new position is $13.
        posTracker.buy(2, 13)
        self.assertEqual(posTracker.getAvgPrice(), 13)
        self.assertEqual(posTracker.getPnL(), -3)
        self.assertEqual(round(posTracker.getReturn(), 9), round(-0.23076923076923, 9))

        posTracker.sell(1, 10)
        self.assertEqual(posTracker.getAvgPrice(), 0)
        self.assertEqual(posTracker.getPnL(), -6)
        self.assertEqual(round(posTracker.getReturn(), 9), round(-0.46153846153846, 9))
Example #10
0
    def testBuySellBuy(self):
        posTracker = returns.PositionTracker(INSTRUMENT, DefaultInstrumentTraits())
        posTracker.buy(1, 10)
        self.assertEqual(posTracker.getAvgPrice(), 10)
        self.assertEqual(posTracker.getPnL(price=9), -1)
        self.assertEqual(posTracker.getPnL(), 0)
        self.assertEqual(posTracker.getPnL(price=10), 0)
        self.assertEqual(posTracker.getPnL(price=11), 1)
        self.assertEqual(posTracker.getReturn(), 0)
        self.assertEqual(posTracker.getReturn(13), 0.3)

        # Closing the long position and short selling 1 @ $13.
        # The cost basis for the new position is $13.
        posTracker.sell(2, 13)
        self.assertEqual(posTracker.getAvgPrice(), 13)
        self.assertEqual(posTracker.getPnL(), 3)
        self.assertEqual(round(posTracker.getReturn(), 8), 0.23076923)

        posTracker.buy(1, 10)
        self.assertEqual(posTracker.getAvgPrice(), 0)
        self.assertEqual(posTracker.getPnL(), 6)
        self.assertEqual(round(posTracker.getReturn(), 9), round(0.46153846153846, 9))
Example #11
0
    def testProfitReturnsAndCost(self):
        posTracker = returns.PositionTracker(INSTRUMENT, DefaultInstrumentTraits())
        posTracker.buy(10, 1)
        self.assertEqual(posTracker.getPnL(), 0)
        self.assertEqual(posTracker.getAvgPrice(), 1)
        self.assertEqual(posTracker.getCommissions(), 0)
        self.assertEqual(posTracker.getPosition(), 10)

        posTracker.buy(20, 1, 10)
        self.assertEqual(posTracker.getPnL(), -10)
        self.assertEqual(posTracker.getAvgPrice(), 1)
        self.assertEqual(posTracker.getCommissions(), 10)
        self.assertEqual(posTracker.getPosition(), 30)

        posTracker.sell(30, 1)
        self.assertEqual(posTracker.getAvgPrice(), 0)
        self.assertEqual(posTracker.getPnL(), -10)
        self.assertEqual(posTracker.getPosition(), 0)
        self.assertEqual(posTracker.getCommissions(), 10)
        self.assertEqual(posTracker.getReturn(), -10/30.0)

        posTracker.buy(10, 1)
        self.assertEqual(posTracker.getPnL(), -10)
        self.assertEqual(posTracker.getAvgPrice(), 1)