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