def test_transform_data(self): """ Tests that the transform_data method gives the correct 10 by 10 matrix. """ data = self.close['spx'][3:103] flags = MatrixFlagLabels(data, window=30) test1 = flags._transform_data(row_num=32, window=30) test2 = flags._transform_data(row_num=100, window=90) test1_actual = pd.DataFrame( [[0, 1. / 3, 0, 0, 1. / 3, 1. / 3, 0, 0, 0, 0], [0, 2. / 3, 0, 0, 1. / 3, 0, 0, 0, 0, 0], [0, 0, 1. / 3, 2. / 3, 0, 0, 0, 0, 0, 0], [1. / 3, 0, 0, 0, 0, 1. / 3, 0, 0, 0, 0], [1. / 3, 0, 1. / 3, 1. / 3, 1. / 3, 0, 0, 0, 0, 0], [1. / 3, 0, 1. / 3, 0, 0, 0, 0, 0, 1. / 3, 0], [0, 0, 0, 0, 0, 0, 0, 1. / 3, 1. / 3, 1. / 3], [0, 0, 0, 0, 0, 0, 0, 1. / 3, 1. / 3, 1. / 3], [0, 0, 0, 0, 0, 0, 2. / 3, 0, 0, 1. / 3], [0, 0, 0, 0, 0, 1. / 3, 1. / 3, 1. / 3, 0, 0]]) test2_column_actual = pd.Series( [0, 0, 0, 0, 0, 0, 0, 1. / 3, 1. / 9, 5. / 9]) pd.testing.assert_frame_equal(test1, test1_actual) pd.testing.assert_series_equal(test2[1], test2_column_actual, check_names=False) # Check 1 column # Assert that all columns sum to 1. self.assertTrue( test2.sum(axis=0).values.all() == np.array([1.] * 10).all())
def test_threshold(self): """ Tests for when threshold is desired. """ data = self.close['spx'][425:500] idx = data[60:].index flags = MatrixFlagLabels(prices=data, window=60, template_name='leigh_bull') test5 = flags.apply_labeling_matrix(threshold=4) test6 = flags.apply_labeling_matrix(threshold=-1.5) test5_actual = pd.Series( [-1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], index=idx) test6_actual = pd.Series([1] * 15, index=idx) pd.testing.assert_series_equal(test5, test5_actual) pd.testing.assert_series_equal(test6, test6_actual)
def test_init(self): """ Tests that exceptions are raised correctly during initialization of the class if inputs are wrong. """ # Length of data less than 10. close = self.close['spx'] with self.assertRaises(Exception): MatrixFlagLabels(close[0:7], window=30) # Window less than 10. with self.assertRaises(Exception): MatrixFlagLabels(close[0:30], window=5) # Window greater than len(data). with self.assertRaises(Exception): MatrixFlagLabels(close[0:30], window=50) # Data is a DataFrame, not Series. with self.assertRaises(Exception): MatrixFlagLabels(self.close, window=60)
def test_apply_labeling(self): """ Test for the function the users would actually use, for creating full labels from matrix. """ data = self.close['spx'][0:100] flags = MatrixFlagLabels(prices=data, window=60, template_name='leigh_bull') test5 = flags.apply_labeling_matrix() # Verify that the output has 40 (100 - 60) rows. self.assertTrue(len(test5) == 40) # Check values. test5_subset = test5[10:20] test5_subset_actual = pd.Series([ -0.91666667, -1.25, -1.75, -2.16666667, -2.66666667, -2.66666667, -2.75, -2.5, -2.58333333, -2.66666667 ], index=test5_subset.index) pd.testing.assert_series_equal(test5_subset, test5_subset_actual)
def test_set_template(self): """ Tests for user setting a new template. Also verifies that exception is raised for invalid template formats. """ new_template = pd.DataFrame(np.random.randint(-3, 3, size=(10, 10))) flags = MatrixFlagLabels(self.close['spx'], window=100) flags.set_template(new_template) # Correct template bad_shape = pd.DataFrame(np.random.randint(-3, 3, size=(9, 10))) # Not 10 by 10 with self.assertRaises(Exception): flags.set_template(bad_shape) nan_template = new_template.copy() nan_template.iloc[2, 3] = np.nan # Has NaN with self.assertRaises(Exception): flags.set_template(nan_template)
def test_template_init(self): """ Checks that other templates are given correctly. """ close = self.close['spx'] leigh_bull = pd.DataFrame( [[.5, 0, -1, -1, -1, -1, -1, -1, -1, 0], [1, 0.5, 0, -0.5, -1, -1, -1, -1, -0.5, 0], [1, 1, 0.5, 0, -0.5, -0.5, -0.5, -0.5, 0, 0.5], [0.5, 1, 1, 0.5, 0, -0.5, -0.5, -0.5, 0, 1], [0, 0.5, 1, 1, 0.5, 0, 0, 0, 0.5, 1], [0, 0, 0.5, 1, 1, 0.5, 0, 0, 1, 1], [-0.5, 0, 0, 0.5, 1, 1, 0.5, 0.5, 1, 1], [-0.5, -1, 0, 0, 0.5, 1, 1, 1, 1, 0], [-1, -1, -1, -0.5, 0, 0.5, 1, 1, 0, -2], [-1, -1, -1, -1, -1, 0, 0.5, 0.5, -2, -2.5]]) leigh_bear = pd.DataFrame(np.flip(np.array(leigh_bull), axis=0)) cervelloroyo_bull = pd.DataFrame( [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, -1, -1, -1, -1, -1, -1], [0, 0, 0, -1, -2, -2, -2, -2, -2, -2], [0, 0, -1, -3, -3, -3, -3, -3, -3, -3], [0, -1, -3, -5, -5, -5, -5, -5, -5, -5], [0, -1, -5, -5, -5, -5, -5, -5, -5, -5], [0, -1, -5, -5, -5, -5, -5, -5, -5, -5], [5, -1, -5, -5, -5, -5, -5, -5, -5, -5]]) cervelloroyo_bear = pd.DataFrame( np.flip(np.array(cervelloroyo_bull), axis=0)) test7 = MatrixFlagLabels(close, 30, template_name='leigh_bear') test8 = MatrixFlagLabels(close, 30, template_name='cervelloroyo_bear') test9 = MatrixFlagLabels(close, 30, template_name='cervelloroyo_bull') pd.testing.assert_frame_equal(test7.template, leigh_bear) pd.testing.assert_frame_equal(test8.template, cervelloroyo_bear) pd.testing.assert_frame_equal(test9.template, cervelloroyo_bull) # Exception for invalid name. with self.assertRaises(Exception): MatrixFlagLabels(close[0:7], window=30, template_name='abcd') with self.assertRaises(Exception): test7._init_template('abcd')
def test_apply_template(self): """ Tests for the apply template to matrix. A matrix is used which satisfies the constraints of transform_data. Then, the template is changed, and the applied to the same matrix. """ matrix = pd.DataFrame( [[0, 1. / 3, 0, 0, 1. / 3, 1. / 3, 0, 0, 0, 0], [0, 2. / 3, 0, 0, 1. / 3, 0, 0, 0, 0, 0], [0, 0, 1. / 3, 2. / 3, 0, 0, 0, 0, 0, 0], [1. / 3, 0, 0, 0, 0, 1. / 3, 0, 0, 0, 0], [1. / 3, 0, 1. / 3, 1. / 3, 1. / 3, 0, 0, 0, 0, 0], [1. / 3, 0, 1. / 3, 0, 0, 0, 0, 0, 1. / 3, 0], [0, 0, 0, 0, 0, 0, 0, 1. / 3, 1. / 3, 1. / 3], [0, 0, 0, 0, 0, 0, 0, 1. / 3, 1. / 3, 1. / 3], [0, 0, 0, 0, 0, 0, 2. / 3, 0, 0, 1. / 3], [0, 0, 0, 0, 0, 1. / 3, 1. / 3, 1. / 3, 0, 0]]) flags = MatrixFlagLabels(self.close['spx'], window=100, template_name='leigh_bull') test3 = flags._apply_template_to_matrix(matrix, flags.template) self.assertAlmostEqual(test3, 2.6666666667) # Replace the template with another bull template proposed in Cervello-Royo's paper. new_template = pd.DataFrame([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, -1, -1, -1, -1, -1, -1], [0, 0, 0, -1, -2, -2, -2, -2, -2, -2], [0, 0, -1, -3, -3, -3, -3, -3, -3, -3], [0, -1, -3, -5, -5, -5, -5, -5, -5, -5], [0, -1, -5, -5, -5, -5, -5, -5, -5, -5], [0, -1, -5, -5, -5, -5, -5, -5, -5, -5], [5, -1, -5, -5, -5, -5, -5, -5, -5, -5]]) flags.set_template(new_template) test4 = flags._apply_template_to_matrix(matrix, flags.template) self.assertAlmostEqual(test4, -22.666666667)