Esempio n. 1
0
    def test_cost_basis_calc_close_pos(self):
        history_args = (
            1,
            [10, 9, 11, 8, 9, 12, 13, 14],
            [200, -100, -100, 100, -300, 100, 500, 400],
            onesec,
            self.sim_params
        )
        cost_bases = [10, 10, 0, 8, 9, 9, 13, 13.5]

        trades = factory.create_trade_history(*history_args)
        transactions = factory.create_txn_history(*history_args)

        pp = perf.PerformancePeriod(1000.0)

        for txn, cb in zip(transactions, cost_bases):
            pp.execute_transaction(txn)
            self.assertEqual(pp.positions[1].cost_basis, cb)

        for trade in trades:
            pp.update_last_sale(trade)

        pp.calculate_performance()

        self.assertEqual(pp.positions[1].cost_basis, cost_bases[-1])
Esempio n. 2
0
    def test_long_position(self):
        """
            verify that the performance period calculates properly for a
            single buy transaction
        """
        # post some trades in the market
        trades = factory.create_trade_history(1, [10, 10, 10, 11],
                                              [100, 100, 100, 100], onesec,
                                              self.sim_params)

        txn = create_txn(trades[1], 10.0, 100)
        pp = perf.PerformancePeriod(1000.0)

        pp.execute_transaction(txn)

        # This verifies that the last sale price is being correctly
        # set in the positions. If this is not the case then returns can
        # incorrectly show as sharply dipping if a transaction arrives
        # before a trade. This is caused by returns being based on holding
        # stocks with a last sale price of 0.
        self.assertEqual(pp.positions[1].last_sale_price, 10.0)

        for trade in trades:
            pp.update_last_sale(trade)

        pp.calculate_performance()

        self.assertEqual(
            pp.period_cash_flow, -1 * txn.price * txn.amount,
            "capital used should be equal to the opposite of the transaction \
            cost of sole txn in test")

        self.assertEqual(len(pp.positions), 1, "should be just one position")

        self.assertEqual(pp.positions[1].sid, txn.sid,
                         "position should be in security with id 1")

        self.assertEqual(
            pp.positions[1].amount, txn.amount,
            "should have a position of {sharecount} shares".format(
                sharecount=txn.amount))

        self.assertEqual(pp.positions[1].cost_basis, txn.price,
                         "should have a cost basis of 10")

        self.assertEqual(
            pp.positions[1].last_sale_price, trades[-1]['price'],
            "last sale should be same as last trade. \
            expected {exp} actual {act}".format(
                exp=trades[-1]['price'], act=pp.positions[1].last_sale_price))

        self.assertEqual(
            pp.ending_value, 1100,
            "ending value should be price of last trade times number of \
            shares in position")

        self.assertEqual(pp.pnl, 100, "gain of 1 on 100 shares should be 100")
Esempio n. 3
0
    def test_covering_short(self):
        """verify performance where short is bought and covered, and shares \
trade after cover"""

        trades = factory.create_trade_history(
            1, [10, 10, 10, 11, 9, 8, 7, 8, 9, 10],
            [100, 100, 100, 100, 100, 100, 100, 100, 100, 100], onesec,
            self.sim_params)

        short_txn = create_txn(
            trades[1],
            10.0,
            -100,
        )

        cover_txn = create_txn(trades[6], 7.0, 100)
        pp = perf.PerformancePeriod(1000.0)

        pp.execute_transaction(short_txn)
        pp.execute_transaction(cover_txn)

        for trade in trades:
            pp.update_last_sale(trade)

        pp.calculate_performance()

        short_txn_cost = short_txn.price * short_txn.amount
        cover_txn_cost = cover_txn.price * cover_txn.amount

        self.assertEqual(
            pp.period_cash_flow, -1 * short_txn_cost - cover_txn_cost,
            "capital used should be equal to the net transaction costs")

        self.assertEqual(len(pp.positions), 1, "should be just one position")

        self.assertEqual(
            pp.positions[1].sid, short_txn.sid,
            "position should be in security from the transaction")

        self.assertEqual(pp.positions[1].amount, 0,
                         "should have a position of -100 shares")

        self.assertEqual(pp.positions[1].cost_basis, 0,
                         "a covered position should have a cost basis of 0")

        self.assertEqual(pp.positions[1].last_sale_price, trades[-1].price,
                         "last sale should be price of last trade")

        self.assertEqual(
            pp.ending_value, 0,
            "ending value should be price of last trade times number of \
shares in position")

        self.assertEqual(pp.pnl, 300, "gain of 1 on 100 shares should be 300")
Esempio n. 4
0
    def test_long_position(self):
        """
            verify that the performance period calculates properly for a
            single buy transaction
        """
        #post some trades in the market
        trades = factory.create_trade_history(1, [10, 10, 10, 11],
                                              [100, 100, 100, 100],
                                              self.onesec,
                                              self.trading_environment)

        txn = factory.create_txn(1, 10.0, 100, self.dt + self.onesec)
        pp = perf.PerformancePeriod({}, 0.0, 1000.0)

        pp.execute_transaction(txn)
        for trade in trades:
            pp.update_last_sale(trade)

        pp.calculate_performance()

        self.assertEqual(
            pp.period_capital_used, -1 * txn.price * txn.amount,
            "capital used should be equal to the opposite of the transaction \
            cost of sole txn in test")

        self.assertEqual(len(pp.positions), 1, "should be just one position")

        self.assertEqual(pp.positions[1].sid, txn.sid,
                         "position should be in security with id 1")

        self.assertEqual(
            pp.positions[1].amount, txn.amount,
            "should have a position of {sharecount} shares".format(
                sharecount=txn.amount))

        self.assertEqual(pp.positions[1].cost_basis, txn.price,
                         "should have a cost basis of 10")

        self.assertEqual(
            pp.positions[1].last_sale_price, trades[-1]['price'],
            "last sale should be same as last trade. \
            expected {exp} actual {act}".format(
                exp=trades[-1]['price'], act=pp.positions[1].last_sale_price))

        self.assertEqual(
            pp.ending_value, 1100,
            "ending value should be price of last trade times number of \
            shares in position")

        self.assertEqual(pp.pnl, 100, "gain of 1 on 100 shares should be 100")
Esempio n. 5
0
    def test_cost_basis_calc(self):
        history_args = (
            1,
            [10, 11, 11, 12],
            [100, 100, 100, 100],
            onesec,
            self.sim_params
        )
        trades = factory.create_trade_history(*history_args)
        transactions = factory.create_txn_history(*history_args)

        pp = perf.PerformancePeriod(1000.0)

        average_cost = 0
        for i, txn in enumerate(transactions):
            pp.execute_transaction(txn)
            average_cost = (average_cost * i + txn.price) / (i + 1)
            self.assertEqual(pp.positions[1].cost_basis, average_cost)

        for trade in trades:
            pp.update_last_sale(trade)

        pp.calculate_performance()

        self.assertEqual(
            pp.positions[1].last_sale_price,
            trades[-1].price,
            "should have a last sale of 12, got {val}".format(
                val=pp.positions[1].last_sale_price)
        )

        self.assertEqual(
            pp.positions[1].cost_basis,
            11,
            "should have a cost basis of 11"
        )

        self.assertEqual(
            pp.pnl,
            400
        )

        down_tick = factory.create_trade(
            1,
            10.0,
            100,
            trades[-1].dt + onesec)

        sale_txn = create_txn(
            down_tick,
            10.0,
            -100)

        pp.rollover()

        pp.execute_transaction(sale_txn)
        pp.update_last_sale(down_tick)

        pp.calculate_performance()
        self.assertEqual(
            pp.positions[1].last_sale_price,
            10,
            "should have a last sale of 10, was {val}".format(
                val=pp.positions[1].last_sale_price)
        )

        self.assertEqual(
            pp.positions[1].cost_basis,
            11,
            "should have a cost basis of 11"
        )

        self.assertEqual(pp.pnl, -800, "this period goes from +400 to -400")

        pp3 = perf.PerformancePeriod(1000.0)

        average_cost = 0
        for i, txn in enumerate(transactions):
            pp3.execute_transaction(txn)
            average_cost = (average_cost * i + txn.price) / (i + 1)
            self.assertEqual(pp3.positions[1].cost_basis, average_cost)

        pp3.execute_transaction(sale_txn)

        trades.append(down_tick)
        for trade in trades:
            pp3.update_last_sale(trade)

        pp3.calculate_performance()
        self.assertEqual(
            pp3.positions[1].last_sale_price,
            10,
            "should have a last sale of 10"
        )

        self.assertEqual(
            pp3.positions[1].cost_basis,
            11,
            "should have a cost basis of 11"
        )

        self.assertEqual(
            pp3.pnl,
            -400,
            "should be -400 for all trades and transactions in period"
        )
Esempio n. 6
0
    def test_short_position(self):
        """verify that the performance period calculates properly for a \
single short-sale transaction"""
        trades = factory.create_trade_history(
            1,
            [10, 10, 10, 11, 10, 9],
            [100, 100, 100, 100, 100, 100],
            onesec,
            self.sim_params
        )

        trades_1 = trades[:-2]

        txn = create_txn(trades[1], 10.0, -100)
        pp = perf.PerformancePeriod(1000.0)

        pp.execute_transaction(txn)
        for trade in trades_1:
            pp.update_last_sale(trade)

        pp.calculate_performance()

        self.assertEqual(
            pp.period_cash_flow,
            -1 * txn.price * txn.amount,
            "capital used should be equal to the opposite of the transaction\
             cost of sole txn in test"
        )

        self.assertEqual(
            len(pp.positions),
            1,
            "should be just one position")

        self.assertEqual(
            pp.positions[1].sid,
            txn.sid,
            "position should be in security from the transaction"
        )

        self.assertEqual(
            pp.positions[1].amount,
            -100,
            "should have a position of -100 shares"
        )

        self.assertEqual(
            pp.positions[1].cost_basis,
            txn.price,
            "should have a cost basis of 10"
        )

        self.assertEqual(
            pp.positions[1].last_sale_price,
            trades_1[-1]['price'],
            "last sale should be price of last trade"
        )

        self.assertEqual(
            pp.ending_value,
            -1100,
            "ending value should be price of last trade times number of \
            shares in position"
        )

        self.assertEqual(pp.pnl, -100, "gain of 1 on 100 shares should be 100")

        # simulate additional trades, and ensure that the position value
        # reflects the new price
        trades_2 = trades[-2:]

        # simulate a rollover to a new period
        pp.rollover()

        for trade in trades_2:
            pp.update_last_sale(trade)

        pp.calculate_performance()

        self.assertEqual(
            pp.period_cash_flow,
            0,
            "capital used should be zero, there were no transactions in \
            performance period"
        )

        self.assertEqual(
            len(pp.positions),
            1,
            "should be just one position"
        )

        self.assertEqual(
            pp.positions[1].sid,
            txn.sid,
            "position should be in security from the transaction"
        )

        self.assertEqual(
            pp.positions[1].amount,
            -100,
            "should have a position of -100 shares"
        )

        self.assertEqual(
            pp.positions[1].cost_basis,
            txn.price,
            "should have a cost basis of 10"
        )

        self.assertEqual(
            pp.positions[1].last_sale_price,
            trades_2[-1].price,
            "last sale should be price of last trade"
        )

        self.assertEqual(
            pp.ending_value,
            -900,
            "ending value should be price of last trade times number of \
            shares in position")

        self.assertEqual(
            pp.pnl,
            200,
            "drop of 2 on -100 shares should be 200"
        )

        # now run a performance period encompassing the entire trade sample.
        ppTotal = perf.PerformancePeriod(1000.0)

        for trade in trades_1:
            ppTotal.update_last_sale(trade)

        ppTotal.execute_transaction(txn)

        for trade in trades_2:
            ppTotal.update_last_sale(trade)

        ppTotal.calculate_performance()

        self.assertEqual(
            ppTotal.period_cash_flow,
            -1 * txn.price * txn.amount,
            "capital used should be equal to the opposite of the transaction \
cost of sole txn in test"
        )

        self.assertEqual(
            len(ppTotal.positions),
            1,
            "should be just one position"
        )
        self.assertEqual(
            ppTotal.positions[1].sid,
            txn.sid,
            "position should be in security from the transaction"
        )

        self.assertEqual(
            ppTotal.positions[1].amount,
            -100,
            "should have a position of -100 shares"
        )

        self.assertEqual(
            ppTotal.positions[1].cost_basis,
            txn.price,
            "should have a cost basis of 10"
        )

        self.assertEqual(
            ppTotal.positions[1].last_sale_price,
            trades_2[-1].price,
            "last sale should be price of last trade"
        )

        self.assertEqual(
            ppTotal.ending_value,
            -900,
            "ending value should be price of last trade times number of \
            shares in position")

        self.assertEqual(
            ppTotal.pnl,
            100,
            "drop of 1 on -100 shares should be 100"
        )
Esempio n. 7
0
    def test_cost_basis_calc(self):
        trades = factory.create_trade_history(1, [10, 11, 11, 12],
                                              [100, 100, 100, 100], onesec,
                                              self.sim_params)

        transactions = factory.create_txn_history(1, [10, 11, 11, 12],
                                                  [100, 100, 100, 100], onesec,
                                                  self.sim_params)

        pp = perf.PerformancePeriod(1000.0)

        for txn in transactions:
            pp.execute_transaction(txn)

        for trade in trades:
            pp.update_last_sale(trade)

        pp.calculate_performance()

        self.assertEqual(
            pp.positions[1].last_sale_price, trades[-1].price,
            "should have a last sale of 12, got {val}".format(
                val=pp.positions[1].last_sale_price))

        self.assertEqual(pp.positions[1].cost_basis, 11,
                         "should have a cost basis of 11")

        self.assertEqual(pp.pnl, 400)

        down_tick = factory.create_trade(1, 10.0, 100, trades[-1].dt + onesec)

        saleTxn = create_txn(down_tick, 10.0, -100)

        pp.rollover()

        pp.execute_transaction(saleTxn)
        pp.update_last_sale(down_tick)

        pp.calculate_performance()
        self.assertEqual(
            pp.positions[1].last_sale_price, 10,
            "should have a last sale of 10, was {val}".format(
                val=pp.positions[1].last_sale_price))

        self.assertEqual(round(pp.positions[1].cost_basis, 2), 11.33,
                         "should have a cost basis of 11.33")

        # print "second period pnl is {pnl}".format(pnl=pp2.pnl)
        self.assertEqual(pp.pnl, -800, "this period goes from +400 to -400")

        pp3 = perf.PerformancePeriod(1000.0)

        transactions.append(saleTxn)
        for txn in transactions:
            pp3.execute_transaction(txn)

        trades.append(down_tick)
        for trade in trades:
            pp3.update_last_sale(trade)

        pp3.calculate_performance()
        self.assertEqual(pp3.positions[1].last_sale_price, 10,
                         "should have a last sale of 10")

        self.assertEqual(round(pp3.positions[1].cost_basis, 2), 11.33,
                         "should have a cost basis of 11.33")

        self.assertEqual(
            pp3.pnl, -400,
            "should be -400 for all trades and transactions in period")
Esempio n. 8
0
    def test_cost_basis_calc(self):
        trades = factory.create_trade_history(1, [10, 11, 11, 12],
                                              [100, 100, 100, 100],
                                              self.onesec,
                                              self.trading_environment)

        transactions = factory.create_txn_history(1, [10, 11, 11, 12],
                                                  [100, 100, 100, 100],
                                                  self.onesec,
                                                  self.trading_environment)

        pp = perf.PerformancePeriod({}, 0.0, 1000.0)

        for txn in transactions:
            pp.execute_transaction(txn)

        for trade in trades:
            pp.update_last_sale(trade)

        pp.calculate_performance()

        self.assertEqual(
            pp.positions[1].last_sale_price, trades[-1].price,
            "should have a last sale of 12, got {val}".format(
                val=pp.positions[1].last_sale_price))

        self.assertEqual(pp.positions[1].cost_basis, 11,
                         "should have a cost basis of 11")

        self.assertEqual(pp.pnl, 400)

        saleTxn = factory.create_txn(1, 10.0, -100, self.dt + self.onesec * 4)

        down_tick = factory.create_trade(1, 10.0, 100,
                                         trades[-1].dt + self.onesec)

        pp2 = perf.PerformancePeriod(copy.deepcopy(pp.positions),
                                     pp.ending_value, pp.ending_cash)

        pp2.execute_transaction(saleTxn)
        pp2.update_last_sale(down_tick)

        pp2.calculate_performance()
        self.assertEqual(
            pp2.positions[1].last_sale_price, 10,
            "should have a last sale of 10, was {val}".format(
                val=pp2.positions[1].last_sale_price))

        self.assertEqual(round(pp2.positions[1].cost_basis, 2), 11.33,
                         "should have a cost basis of 11.33")

        #print "second period pnl is {pnl}".format(pnl=pp2.pnl)
        self.assertEqual(pp2.pnl, -800, "this period goes from +400 to -400")

        pp3 = perf.PerformancePeriod({}, 0.0, 1000.0)

        transactions.append(saleTxn)
        for txn in transactions:
            pp3.execute_transaction(txn)

        trades.append(down_tick)
        for trade in trades:
            pp3.update_last_sale(trade)

        pp3.calculate_performance()
        self.assertEqual(pp3.positions[1].last_sale_price, 10,
                         "should have a last sale of 10")

        self.assertEqual(round(pp3.positions[1].cost_basis, 2), 11.33,
                         "should have a cost basis of 11.33")

        self.assertEqual(
            pp3.pnl, -400,
            "should be -400 for all trades and transactions in period")