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