def test_price_to_return(self): start_date = pd.datetime(2018, 1, 1) end_date = pd.datetime(2018, 1, 12) dates = pd.date_range(start_date, end_date, freq='B') test_dict = { 'test_1': [100, 102, 104, 106, 102, 98, 100, 103, 107, 110], 'test_2': [21, 22, 25, 27, 21, 24, 24, 23, 22, 21] } test_df = pd.DataFrame(test_dict, index=dates) result = TSeriesHelper.price_to_return(test_df) expected_dates = list(dates)[1:] expected_dict = { 'test_1': [ 0.0200, 0.019608, 0.019231, -0.037736, -0.0392157, 0.020408, 0.0300, 0.038835, 0.028037 ], 'test_2': [ 0.047619, 0.136364, 0.0800, -0.222222, 0.142857, 0, -0.041667, -0.0434782, -0.045454 ] } expected_df = pd.DataFrame( expected_dict, index=expected_dates, ) pd.testing.assert_frame_equal(result, expected_df, check_less_precise=4)
def test_get_sortino_ratio_scaled(self): market_prices = self.price_data[['nky', 'spx']] risk_free_prices = self.price_data['rf'] result = TSeriesHelper.get_sortino_ratio_scaled( market_prices, risk_free_prices) self.assertAlmostEqual(result['nky'], -0.05536, places=5) self.assertAlmostEqual(result['spx'], 0.13248, places=5)
def test_get_sharpe_ratio_unscaled(self): market_prices = self.price_data[['nky', 'spx']] risk_free_prices = self.price_data['rf'] result = TSeriesHelper.get_sharpe_ratio_unscaled( market_prices, risk_free_prices) self.assertAlmostEqual(result['nky'], -0.01144, places=5) self.assertAlmostEqual(result['spx'], 0.029213, places=5)
def test_get_annualised_excess_return(self): market_prices = self.price_data[['nky', 'spx']] risk_free_prices = self.price_data['rf'] result = TSeriesHelper.get_annualised_excess_return( market_prices, risk_free_prices) self.assertAlmostEqual(result['nky'], -0.00596, places=5) self.assertAlmostEqual(result['spx'], 0.00485, places=5)
def test_get_ann_const_from_time_diff(self): diff_1 = 1.1 diff_2 = 6.9 diff_3 = 28 diff_4 = 361 diff_5 = 10 self.assertEqual(tp.BD_PER_ANUM, TSeriesHelper._get_frequency_for_time_diff(diff_1)) self.assertEqual(tp.W_PER_ANUM, TSeriesHelper._get_frequency_for_time_diff(diff_2)) self.assertEqual(tp.M_PER_ANUM, TSeriesHelper._get_frequency_for_time_diff(diff_3)) self.assertEqual(tp.Y_PER_ANUM, TSeriesHelper._get_frequency_for_time_diff(diff_4)) with (self.assertRaises(ValueError)): self.assertEqual( tp.BD_PER_ANUM, TSeriesHelper._get_frequency_for_time_diff(diff_5))
def test_get_downside_deviation(self): market_prices = self.price_data[['nky', 'spx']] market_returns = (market_prices / market_prices.shift(1)).dropna() risk_free_prices = self.price_data['rf'] risk_free_returns = (risk_free_prices / risk_free_prices.shift(1)).dropna() result = TSeriesHelper._get_downside_deviation(market_returns, risk_free_returns) self.assertAlmostEqual(result['nky'], 0.01605, places=5) self.assertAlmostEqual(result['spx'], 0.02941, places=5)
def test_return_to_price(self): start_date = pd.datetime(2017, 2, 1) end_date = pd.datetime(2017, 2, 5) dates = pd.date_range(start_date, end_date, freq='D') test_dict = { 'test_1': [0.01, 0.02, 0.02, 0.01, 0.03], 'test_2': [-0.01, -0.04, -0.02, 0.05, 0.05] } test_df = pd.DataFrame(test_dict, index=dates) result = TSeriesHelper.return_to_price(test_df) expected_dict = { 'test_1': [101, 103.02, 105.0804, 106.1312, 109.3151], 'test_2': [99, 95.04, 93.1392, 97.7962, 102.6860] } expected_df = pd.DataFrame(expected_dict, index=dates) pd.testing.assert_frame_equal(result, expected_df)
def test_calculate_annualised_return(self): returns = TSeriesHelper.get_annualised_returns(self.price_data) self.assertAlmostEqual(returns['nky'], 0) self.assertAlmostEqual(returns['spx'], 0.01081, places=5)
def test_annual_vol(self): vols = TSeriesHelper.get_annualised_vol(self.price_data) self.assertAlmostEqual(vols['nky'], 0.07611, places=5) self.assertAlmostEqual(vols['spx'], 0.13227, places=5)