From 575e45ab4e3fffeb1a0d145c31abfeda093c6ebd Mon Sep 17 00:00:00 2001 From: Eddie Hebert Date: Thu, 18 Jul 2013 18:09:49 -0400 Subject: [PATCH] TST: Read more risk expected values from the answer spreadsheet. Convert test_risk from hardcoded values to reading algorithm returns, volatility, and sharpe answers from the spreadsheet. --- tests/risk/answer_key.py | 26 +++++++- tests/risk/test_risk.py | 135 ++++++++++++++++----------------------- 2 files changed, 79 insertions(+), 82 deletions(-) diff --git a/tests/risk/answer_key.py b/tests/risk/answer_key.py index 448b7f29..d5fb671e 100644 --- a/tests/risk/answer_key.py +++ b/tests/risk/answer_key.py @@ -24,7 +24,10 @@ import requests def col_letter_to_index(col_letter): # Only supports single letter, # but answer key doesn't need multi-letter, yet. - return ord(col_letter) - 65 + index = 0 + for i, char in enumerate(col_letter): + index += ((ord(char) - 65) + (26 * i)) + return index DIR = os.path.dirname(os.path.realpath(__file__)) @@ -150,6 +153,27 @@ class AnswerKey(object): 'year': DataIndex('s_p', 'W', 19, 19), } + ALGORITHM_PERIOD_RETURNS = { + 'Monthly': DataIndex('Sim', 'V', 23, 34), + '3-Month': DataIndex('Sim', 'W', 25, 34), + '6-month': DataIndex('Sim', 'X', 28, 34), + 'year': DataIndex('Sim', 'Y', 34, 34), + } + + ALGORITHM_PERIOD_VOLATILITY = { + 'Monthly': DataIndex('Sim', 'Z', 23, 34), + '3-Month': DataIndex('Sim', 'AA', 25, 34), + '6-month': DataIndex('Sim', 'AB', 28, 34), + 'year': DataIndex('Sim', 'AC', 34, 34), + } + + ALGORITHM_PERIOD_SHARPE = { + 'Monthly': DataIndex('Sim', 'AD', 23, 34), + '3-Month': DataIndex('Sim', 'AE', 25, 34), + '6-month': DataIndex('Sim', 'AF', 28, 34), + 'year': DataIndex('Sim', 'AG', 34, 34), + } + def __init__(self): self.workbook = xlrd.open_workbook(ANSWER_KEY_PATH) diff --git a/tests/risk/test_risk.py b/tests/risk/test_risk.py index 8d816259..854469a4 100644 --- a/tests/risk/test_risk.py +++ b/tests/risk/test_risk.py @@ -161,107 +161,74 @@ class TestRisk(unittest.TestCase): answer_key_year_periods) def test_algorithm_returns_06(self): - self.assertEqual([round(x.algorithm_period_returns, 3) + answer_key_month_periods = ANSWER_KEY.get_values( + AnswerKey.ALGORITHM_PERIOD_RETURNS['Monthly'], + decimal=3) + self.assertEqual([np.round(x.algorithm_period_returns, 3) for x in self.metrics_06.month_periods], - [0.101, - -0.062, - -0.041, - 0.092, - 0.135, - -0.25, - 0.076, - -0.003, - -0.024, - 0.072, - 0.063, - -0.071]) + answer_key_month_periods) - self.assertEqual([round(x.algorithm_period_returns, 3) + answer_key_three_month_periods = ANSWER_KEY.get_values( + AnswerKey.ALGORITHM_PERIOD_RETURNS['3-Month'], + decimal=3) + self.assertEqual([np.round(x.algorithm_period_returns, 3) for x in self.metrics_06.three_month_periods], - [-0.009, - -0.017, - 0.188, - -0.071, - -0.085, - -0.196, - 0.047, - 0.043, - 0.112, - 0.058]) + answer_key_three_month_periods) - self.assertEqual([round(x.algorithm_period_returns, 3) + answer_key_six_month_periods = ANSWER_KEY.get_values( + AnswerKey.ALGORITHM_PERIOD_RETURNS['6-month'], + decimal=3) + self.assertEqual([np.round(x.algorithm_period_returns, 3) for x in self.metrics_06.six_month_periods], - [-0.08, - -0.101, - -0.044, - -0.027, - -0.045, - -0.106, - 0.108]) + answer_key_six_month_periods) - self.assertEqual([round(x.algorithm_period_returns, 3) + answer_key_year_periods = ANSWER_KEY.get_values( + AnswerKey.ALGORITHM_PERIOD_RETURNS['year'], + decimal=3) + self.assertEqual([np.round(x.algorithm_period_returns, 3) for x in self.metrics_06.year_periods], - [0.02]) + answer_key_year_periods) def test_algorithm_volatility_06(self): - self.assertEqual([round(x.algorithm_volatility, 3) + answer_key_month_periods = ANSWER_KEY.get_values( + AnswerKey.ALGORITHM_PERIOD_VOLATILITY['Monthly'], + decimal=3) + self.assertEqual([np.round(x.algorithm_volatility, 3) for x in self.metrics_06.month_periods], - [0.137, - 0.12, - 0.13, - 0.142, - 0.128, - 0.14, - 0.141, - 0.118, - 0.143, - 0.144, - 0.117, - 0.135]) + answer_key_month_periods) - self.assertEqual([round(x.algorithm_volatility, 3) + answer_key_three_month_periods = ANSWER_KEY.get_values( + AnswerKey.ALGORITHM_PERIOD_VOLATILITY['3-Month'], + decimal=3) + self.assertEqual([np.round(x.algorithm_volatility, 3) for x in self.metrics_06.three_month_periods], - [0.222, - 0.224, - 0.229, - 0.243, - 0.243, - 0.235, - 0.23, - 0.231, - 0.231, - 0.227]) + answer_key_three_month_periods) - self.assertEqual([round(x.algorithm_volatility, 3) + answer_key_six_month_periods = ANSWER_KEY.get_values( + AnswerKey.ALGORITHM_PERIOD_VOLATILITY['6-month'], + decimal=3) + self.assertEqual([np.round(x.algorithm_volatility, 3) for x in self.metrics_06.six_month_periods], - [0.328, - 0.329, - 0.329, - 0.333, - 0.334, - 0.329, - 0.321]) + answer_key_six_month_periods) - self.assertEqual([round(x.algorithm_volatility, 3) + answer_key_year_periods = ANSWER_KEY.get_values( + AnswerKey.ALGORITHM_PERIOD_VOLATILITY['year'], + decimal=3) + self.assertEqual([np.round(x.algorithm_volatility, 3) for x in self.metrics_06.year_periods], - [0.458]) + answer_key_year_periods) def test_algorithm_sharpe_06(self): - self.assertEqual([round(x.sharpe, 3) + answer_key_month_periods = ANSWER_KEY.get_values( + AnswerKey.ALGORITHM_PERIOD_SHARPE['Monthly'], + decimal=3) + self.assertEqual([np.round(x.sharpe, 3) for x in self.metrics_06.month_periods], - [0.711, - -0.541, - -0.348, - 0.625, - 1.017, - -1.809, - 0.508, - -0.062, - -0.193, - 0.467, - 0.502, - -0.557]) + answer_key_month_periods) + answer_key_month_periods = ANSWER_KEY.get_values( + AnswerKey.ALGORITHM_PERIOD_SHARPE['Monthly'], + decimal=3) self.assertEqual([round(x.sharpe, 3) for x in self.metrics_06.three_month_periods], [-0.094, @@ -275,6 +242,9 @@ class TestRisk(unittest.TestCase): 0.432, 0.2]) + answer_key_month_periods = ANSWER_KEY.get_values( + AnswerKey.ALGORITHM_PERIOD_SHARPE['Monthly'], + decimal=3) self.assertEqual([round(x.sharpe, 3) for x in self.metrics_06.six_month_periods], [-0.322, @@ -285,6 +255,9 @@ class TestRisk(unittest.TestCase): -0.398, 0.257]) + answer_key_month_periods = ANSWER_KEY.get_values( + AnswerKey.ALGORITHM_PERIOD_SHARPE['Monthly'], + decimal=3) self.assertEqual([round(x.sharpe, 3) for x in self.metrics_06.year_periods], [-0.066])