예제 #1
0
    def test_sell_order(self):
        """Test that the Backtest class respects selling order correctly."""

        def execute(self):
            eod = self.backtest.get_end_of_day("FOO")
            if self.day == 0:
                self.backtest.buy_shares("FOO", 1, eod.open_prices[self.day])
            elif self.day == 1:
                self.backtest.buy_shares("FOO", 2, eod.open_prices[self.day])
            elif self.day == 2:
                self.backtest.sell_shares(
                    "FOO", 1, eod.open_prices[self.day], self.backtest.portfolio.get_positions("FOO")[1]
                )
            elif self.day == 3:
                self.backtest.sell_shares("FOO", 1, eod.open_prices[self.day])

        start = date(2000, 1, 1)
        portfolio = Portfolio(100)
        strategy = get_mock_strategy_class(execute)
        Backtest(
            start,
            start + timedelta(3),
            strategy_class=strategy,
            end_of_day_class=self.end_of_day_class,
            portfolio=portfolio,
        )
        positions = portfolio.get_positions("FOO")
        assert_equal(len(positions), 1)
        assert_equal(positions[0].purchase_date, start + timedelta(1))
예제 #2
0
    def test_purchase_date(self):
        """Test that purchase dates are correctly handled with respect to Taxes."""
        end_of_day_class = get_mock_end_of_day_class([1, 3, 3, 3])

        def execute(self):
            if self.day == 1:
                self.backtest.sell_shares("FOO", 2, 3)

        strategy = get_mock_strategy_class(execute)
        portfolio = Portfolio(0)
        start = date(2000, 1, 1)
        portfolio.add_position(OpenPosition("FOO", start - timedelta(2), 1, 1))
        portfolio.add_position(OpenPosition("FOO", start - timedelta(1), 1, 1))

        class MockTaxes(Taxes):
            def sell_tax(self, symbol, shares, gain_per_share, purchase_date):
                if self.backtest.simulation_date - purchase_date <= timedelta(2):
                    return 1
                else:
                    return 0

        backtest = Backtest(
            start,
            start + timedelta(3),
            taxes_class=MockTaxes,
            strategy_class=strategy,
            end_of_day_class=end_of_day_class,
            portfolio=portfolio,
        )
        expected = [2, 5, 5, 5]
        assert_equal(backtest.values, expected)
예제 #3
0
 def test_symbol_deleted_when_last_position_removed(self):
     """Test that the remove_item method of Portfolio removes unused sybmols."""
     portfolio = Portfolio(100)
     start_date = date(2000, 1, 1)
     p1 = OpenPosition("FOO", start_date, 100, 100)
     portfolio.add_position(p1)
     portfolio.remove_position(p1)
     assert_false(p1.symbol in portfolio.symbols)
예제 #4
0
 def test_splits(self):
     """Test the Backtest class's split handling."""
     end_of_day_class = get_mock_end_of_day_class([1, 1, 1, 1], splits=[None, Split(2, 1), None, None])
     start = date(2000, 1, 1)
     portfolio = Portfolio(0)
     portfolio.add_position(OpenPosition("FOO", start - timedelta(1), 1, 1))
     backtest = Backtest(start, start + timedelta(3), end_of_day_class=end_of_day_class, portfolio=portfolio)
     expected_values = [1, 2, 2, 2]
     assert_equal(backtest.values, expected_values)
예제 #5
0
 def basic_test(self):
     """Test the Backtest class against a single EndOfDay object, with no dividends or splits."""
     end_of_day_class = get_mock_end_of_day_class([1, 2, 3, 4])
     start = date(2000, 1, 1)
     portfolio = Portfolio(0)
     portfolio.add_position(OpenPosition("FOO", start - timedelta(1), 1, 1))
     backtest = Backtest(start, start + timedelta(3), end_of_day_class=end_of_day_class, portfolio=portfolio)
     expected_dates = [start, start + timedelta(1), start + timedelta(2), start + timedelta(3)]
     expected_values = [1, 2, 3, 4]
     assert_equal(backtest.dates, expected_dates)
     assert_equal(backtest.values, expected_values)
예제 #6
0
    def test_dividends(self):
        """Test that dividend taxes are handled correctly"""
        end_of_day_class = get_mock_end_of_day_class([1, 1, 1, 1], dividends=[None, 2, None, None])
        portfolio = Portfolio(0)
        start = date(2000, 1, 1)
        portfolio.add_position(OpenPosition("Foo", start - timedelta(1), 1, 1))

        class MockTaxes(Taxes):
            def dividend_tax(self, symbol, amount, purchase_date):
                return 1

        backtest = Backtest(
            start, start + timedelta(3), taxes_class=MockTaxes, end_of_day_class=end_of_day_class, portfolio=portfolio
        )
        expected = [1, 2, 2, 2]
        assert_equal(backtest.values, expected)
예제 #7
0
 def test_modify_item(self):
     """Test modifying an OpenPosition within a Portfolio."""
     self.portfolio = Portfolio(100)
     self.start_date = date(2000, 1, 1)
     self.p1 = OpenPosition("FOO", self.start_date, 100, 100)
     self.p2 = OpenPosition("FOO", self.start_date + timedelta(1), 200, 150)
     self.p3 = OpenPosition("FOO", self.start_date + timedelta(2), 300, 200)
     self.portfolio.add_position(self.p1)
     self.portfolio.add_position(self.p2)
     self.portfolio.add_position(self.p3)
     positions = self.portfolio.get_positions("FOO")
     assert_equal(positions, [self.p1, self.p2, self.p3])
     positions[0].cost_basis = 50
     positions[0].remaining_shares = 200
     assert_equal(self.p1, positions[0])
     positions = self.portfolio.get_positions("FOO")
     assert_equal(positions, [self.p1, self.p2, self.p3])
     self.portfolio.add_position(OpenPosition("BAR", self.start_date, 100, 100))
     positions = self.portfolio.get_positions("FOO")
     assert_equal(positions, [self.p1, self.p2, self.p3])
예제 #8
0
class TestPortfolio(object):
    """Tests the Portfolio class."""

    @test(groups=["initializers"])
    def test_modify_item(self):
        """Test modifying an OpenPosition within a Portfolio."""
        self.portfolio = Portfolio(100)
        self.start_date = date(2000, 1, 1)
        self.p1 = OpenPosition("FOO", self.start_date, 100, 100)
        self.p2 = OpenPosition("FOO", self.start_date + timedelta(1), 200, 150)
        self.p3 = OpenPosition("FOO", self.start_date + timedelta(2), 300, 200)
        self.portfolio.add_position(self.p1)
        self.portfolio.add_position(self.p2)
        self.portfolio.add_position(self.p3)
        positions = self.portfolio.get_positions("FOO")
        assert_equal(positions, [self.p1, self.p2, self.p3])
        positions[0].cost_basis = 50
        positions[0].remaining_shares = 200
        assert_equal(self.p1, positions[0])
        positions = self.portfolio.get_positions("FOO")
        assert_equal(positions, [self.p1, self.p2, self.p3])
        self.portfolio.add_position(OpenPosition("BAR", self.start_date, 100, 100))
        positions = self.portfolio.get_positions("FOO")
        assert_equal(positions, [self.p1, self.p2, self.p3])

    @test(depends_on_groups=["initializers"])
    def test_remove_item(self):
        """Test the remove_item method of Portfolio."""
        self.portfolio.remove_position(self.p2)
        assert_equal(self.portfolio.get_positions("FOO"), [self.p1, self.p3])
        p4 = OpenPosition("FOO", self.start_date + timedelta(2), 300, 200)
        self.portfolio.add_position(p4)
        self.portfolio.remove_position(self.p3)
        assert_equal(self.portfolio.get_positions("FOO"), [self.p1, p4])
        assert_not_equal(self.portfolio.get_positions("FOO"), [self.p1, self.p3])

    @test
    def test_symbol_deleted_when_last_position_removed(self):
        """Test that the remove_item method of Portfolio removes unused sybmols."""
        portfolio = Portfolio(100)
        start_date = date(2000, 1, 1)
        p1 = OpenPosition("FOO", start_date, 100, 100)
        portfolio.add_position(p1)
        portfolio.remove_position(p1)
        assert_false(p1.symbol in portfolio.symbols)