示例#1
0
 def setUp(self):
     data_file = 'pe_data.csv'
     start_date = datetime(2011, 8, 1)
     end_date = datetime(2011, 11, 15)
     self.buys = [25., 21., 20.1, 19.8, 19.]
     self.validator = CapeValidator(data_file,
                                    start_date,
                                    self.buys,
                                    end_date=end_date)
示例#2
0
 def setUp(self):
     data_file = 'pe_data.csv'
     start_date = datetime(2011, 8, 1)
     end_date = datetime(2011, 11, 15)
     self.buys = [25., 21., 20.1, 19.8, 19.]
     self.validator = CapeValidator(
         data_file, start_date, self.buys, end_date=end_date)
示例#3
0
class TestCapeValidator(unittest.TestCase):
    def setUp(self):
        data_file = 'pe_data.csv'
        start_date = datetime(2011, 8, 1)
        end_date = datetime(2011, 11, 15)
        self.buys = [25., 21., 20.1, 19.8, 19.]
        self.validator = CapeValidator(data_file,
                                       start_date,
                                       self.buys,
                                       end_date=end_date)

    def test_init(self):
        expected_dates = [
            datetime(2011, 8, 1),
            datetime(2011, 9, 1),
            datetime(2011, 10, 3),
            datetime(2011, 11, 1)
        ]
        self.assertEqual([pe[0] for pe in self.validator.pe_array],
                         expected_dates)
        expected_pe = [22.6, 20.04, 19.69, 20.15]
        self.assertEqual([pe[1] for pe in self.validator.pe_array],
                         expected_pe)

        self.assertEqual(len(self.validator.investors), 5)
        for buy, investor in zip(self.buys, self.validator.investors):
            self.assertEqual(investor.buy_at, buy)
            self.assertEqual(investor.cash, 10000.)
            self.assertEqual(investor.income, 2000.)
            self.assertEqual(investor.sell_at, buy)
            self.assertEqual(investor.shares, 0.)

    def assertVectorAlmostEqual(self, v1, v2, places=3, **kwargs):
        index = 0
        for val1, val2 in zip(v1, v2):
            msg = 'Index {}'.format(index)
            self.assertAlmostEqual(val1,
                                   val2,
                                   places=places,
                                   msg=msg,
                                   **kwargs)
            index += 1

    def test_worth_calculation(self):
        self.validator.calculate_worth_vs_time()
        prices = {
            datetime(2011, 8, 1): 1286.94,
            datetime(2011, 9, 1): 1204.42,
            datetime(2011, 10, 3): 1099.23,
            datetime(2011, 11, 1): 1218.28
        }
        for key, val in prices.items():
            self.assertEqual(self.validator.index_cache[key], val)

        c0 = 12000.
        inc = 2000.

        # investor1 always buys
        expected_share = numpy.array([
            c0 / 1286.94, c0 / 1286.94 + inc / 1204.42,
            c0 / 1286.94 + inc / 1204.42 + inc / 1099.23,
            c0 / 1286.94 + inc / 1204.42 + inc / 1099.23 + inc / 1218.28
        ])
        expected_worth = numpy.array([
            c0, inc + 1204.42 * expected_share[0],
            inc + 1099.23 * expected_share[1],
            inc + 1218.28 * expected_share[2]
        ])
        self.assertVectorAlmostEqual(self.validator.shares_matrix[0],
                                     expected_share)
        self.assertVectorAlmostEqual(self.validator.cash_matrix[0],
                                     numpy.zeros(4))
        self.assertVectorAlmostEqual(self.validator.worth_matrix[0],
                                     expected_worth)

        # investor 2 goes hold, buy, buy, buy
        expected_share = numpy.array([
            0.,
            (c0 + inc) / 1204.42,
            (c0 + inc) / 1204.42 + inc / 1099.23,
            (c0 + inc) / 1204.42 + inc / 1099.23 + inc / 1218.28,
        ])
        expected_cash = numpy.array([c0, 0., 0., 0.])
        expected_worth = numpy.array([
            c0, inc + c0, inc + 1099.23 * expected_share[1],
            inc + 1218.28 * expected_share[2]
        ])
        self.assertVectorAlmostEqual(self.validator.shares_matrix[1],
                                     expected_share)
        self.assertVectorAlmostEqual(self.validator.cash_matrix[1],
                                     expected_cash)
        self.assertVectorAlmostEqual(self.validator.worth_matrix[1],
                                     expected_worth)

        # investor 3 goes hold, buy, buy, sell
        expected_share = numpy.array([
            0.,
            (c0 + inc) / 1204.42,
            (c0 + inc) / 1204.42 + inc / 1099.23,
            0.,
        ])
        expected_cash = numpy.array(
            [c0, 0., 0., inc + 1218.28 * expected_share[2]])
        expected_worth = numpy.array([
            c0, inc + c0, inc + 1099.23 * expected_share[1],
            inc + 1218.28 * expected_share[2]
        ])
        self.assertVectorAlmostEqual(self.validator.shares_matrix[2],
                                     expected_share)
        self.assertVectorAlmostEqual(self.validator.cash_matrix[2],
                                     expected_cash)
        self.assertVectorAlmostEqual(self.validator.worth_matrix[2],
                                     expected_worth)

        # investor 4 goes hold, hold, buy, sell
        expected_share = numpy.array([
            0.,
            0.,
            (c0 + 2 * inc) / 1099.23,
            0.,
        ])
        expected_cash = numpy.array(
            [c0, c0 + inc, 0., inc + 1218.28 * expected_share[2]])
        expected_worth = numpy.array(
            [c0, c0 + inc, c0 + 2 * inc, inc + 1218.28 * expected_share[2]])
        self.assertVectorAlmostEqual(self.validator.shares_matrix[3],
                                     expected_share)
        self.assertVectorAlmostEqual(self.validator.cash_matrix[3],
                                     expected_cash)
        self.assertVectorAlmostEqual(self.validator.worth_matrix[3],
                                     expected_worth)

        # investor 5 always holds
        expected_worth = c0 + 2000. * numpy.arange(0, 5, 1)
        self.assertVectorAlmostEqual(self.validator.shares_matrix[4],
                                     numpy.zeros(4))
        self.assertVectorAlmostEqual(self.validator.cash_matrix[4],
                                     expected_worth)
        self.assertVectorAlmostEqual(self.validator.worth_matrix[4],
                                     expected_worth)
示例#4
0
class TestCapeValidator(unittest.TestCase):
    def setUp(self):
        data_file = 'pe_data.csv'
        start_date = datetime(2011, 8, 1)
        end_date = datetime(2011, 11, 15)
        self.buys = [25., 21., 20.1, 19.8, 19.]
        self.validator = CapeValidator(
            data_file, start_date, self.buys, end_date=end_date)

    def test_init(self):
        expected_dates = [
            datetime(2011, 8, 1),
            datetime(2011, 9, 1),
            datetime(2011, 10, 3),
            datetime(2011, 11, 1)
        ]
        self.assertEqual([pe[0] for pe in self.validator.pe_array],
                         expected_dates)
        expected_pe = [22.6, 20.04, 19.69, 20.15]
        self.assertEqual([pe[1] for pe in self.validator.pe_array],
                         expected_pe)

        self.assertEqual(len(self.validator.investors), 5)
        for buy, investor in zip(self.buys, self.validator.investors):
            self.assertEqual(investor.buy_at, buy)
            self.assertEqual(investor.cash, 10000.)
            self.assertEqual(investor.income, 2000.)
            self.assertEqual(investor.sell_at, buy)
            self.assertEqual(investor.shares, 0.)

    def assertVectorAlmostEqual(self, v1, v2, places=3, **kwargs):
        index = 0
        for val1, val2 in zip(v1, v2):
            msg = 'Index {}'.format(index)
            self.assertAlmostEqual(val1, val2, places=places, msg=msg,
                                   **kwargs)
            index += 1

    def test_get_market_price(self):
        self.validator.index_cache = {}  # reset cache
        date1 = datetime(2014, 9, 18)
        price = self.validator._get_market_price(date1)
        self.assertAlmostEqual(price, 2011.36)
        self.assertIn(date1, self.validator.index_cache)
        self.assertEqual(self.validator.index_cache[date1], price)

        date2 = datetime(2014, 9, 20)  # saturday, saturday
        price = self.validator._get_market_price(date2)
        self.assertAlmostEqual(price, 2010.40)
        self.assertNotIn(date2, self.validator.index_cache)
        date2_1 = date2 - timedelta(1)
        self.assertIn(date2_1, self.validator.index_cache)
        self.assertEqual(self.validator.index_cache[date2_1], price)

        date3 = datetime(2014, 7, 6)  # sunday to a holiday
        price = self.validator._get_market_price(date3)
        self.assertAlmostEqual(price, 1985.44)
        self.assertNotIn(date3, self.validator.index_cache)
        date3_1 = date3 - timedelta(3)
        self.assertIn(date3_1, self.validator.index_cache)
        self.assertEqual(self.validator.index_cache[date3_1], price)

    def test_worth_calculation(self):
        self.validator.calculate_worth_vs_time()
        prices = {
            datetime(2011, 8, 1): 1286.94,
            datetime(2011, 9, 1): 1204.42,
            datetime(2011, 10, 3): 1099.23,
            datetime(2011, 11, 1): 1218.28
        }
        for key, val in prices.items():
            self.assertEqual(self.validator.index_cache[key], val)

        c0 = 12000.
        inc = 2000.

        # investor1 always buys
        expected_share = numpy.array([
            c0 / 1286.94,
            c0 / 1286.94 + inc / 1204.42,
            c0 / 1286.94 + inc / 1204.42 + inc / 1099.23,
            c0 / 1286.94 + inc / 1204.42 + inc / 1099.23 + inc / 1218.28
        ])
        expected_worth = numpy.array([
            c0,
            inc + 1204.42 * expected_share[0],
            inc + 1099.23 * expected_share[1],
            inc + 1218.28 * expected_share[2]
        ])
        self.assertVectorAlmostEqual(
            self.validator.shares_matrix[0], expected_share)
        self.assertVectorAlmostEqual(
            self.validator.cash_matrix[0], numpy.zeros(4))
        self.assertVectorAlmostEqual(
            self.validator.worth_matrix[0], expected_worth)

        # investor 2 goes hold, buy, buy, buy
        expected_share = numpy.array([
            0.,
            (c0 + inc) / 1204.42,
            (c0 + inc) / 1204.42 + inc / 1099.23,
            (c0 + inc) / 1204.42 + inc / 1099.23 + inc / 1218.28,
        ])
        expected_cash = numpy.array([c0, 0., 0., 0.])
        expected_worth = numpy.array([
            c0,
            inc + c0,
            inc + 1099.23 * expected_share[1],
            inc + 1218.28 * expected_share[2]
        ])
        self.assertVectorAlmostEqual(
            self.validator.shares_matrix[1], expected_share)
        self.assertVectorAlmostEqual(
            self.validator.cash_matrix[1], expected_cash)
        self.assertVectorAlmostEqual(
            self.validator.worth_matrix[1], expected_worth)

        # investor 3 goes hold, buy, buy, sell
        expected_share = numpy.array([
            0.,
            (c0 + inc) / 1204.42,
            (c0 + inc) / 1204.42 + inc / 1099.23,
            0.,
        ])
        expected_cash = numpy.array([
            c0, 0., 0., inc + 1218.28 * expected_share[2]])
        expected_worth = numpy.array([
            c0,
            inc + c0,
            inc + 1099.23 * expected_share[1],
            inc + 1218.28 * expected_share[2]
        ])
        self.assertVectorAlmostEqual(
            self.validator.shares_matrix[2], expected_share)
        self.assertVectorAlmostEqual(
            self.validator.cash_matrix[2], expected_cash)
        self.assertVectorAlmostEqual(
            self.validator.worth_matrix[2], expected_worth)

        # investor 4 goes hold, hold, buy, sell
        expected_share = numpy.array([
            0.,
            0.,
            (c0 + 2 * inc) / 1099.23,
            0.,
        ])
        expected_cash = numpy.array([
            c0, c0 + inc, 0., inc + 1218.28 * expected_share[2]])
        expected_worth = numpy.array([
            c0,
            c0 + inc,
            c0 + 2 * inc,
            inc + 1218.28 * expected_share[2]
        ])
        self.assertVectorAlmostEqual(
            self.validator.shares_matrix[3], expected_share)
        self.assertVectorAlmostEqual(
            self.validator.cash_matrix[3], expected_cash)
        self.assertVectorAlmostEqual(
            self.validator.worth_matrix[3], expected_worth)

        # investor 5 always holds
        expected_worth = c0 + 2000. * numpy.arange(0, 5, 1)
        self.assertVectorAlmostEqual(
            self.validator.shares_matrix[4], numpy.zeros(4))
        self.assertVectorAlmostEqual(
            self.validator.cash_matrix[4], expected_worth)
        self.assertVectorAlmostEqual(
            self.validator.worth_matrix[4], expected_worth)