def test_trim_outliers(self): perf = DailyPerformance.from_moonshot_csv("backtest.csv") zscores = get_zscores(perf.returns) self.assertDictEqual( zscores.to_dict(orient="list"), { 'strategy-1': [-0.5148664345304096, 1.152522272022025, -0.6376558374916148], 'strategy-2': [1.1544487988426575, -0.5981044889340401, -0.5563443099086175] }) self.assertDictEqual( perf.returns.to_dict(orient="list"), { 'strategy-1': [-0.002257125, -0.000375271, -0.002395708], 'strategy-2': [0.00278717, -0.005031677, -0.004845368] }) perf = DailyPerformance.from_moonshot_csv("backtest.csv", trim_outliers=1.154) self.assertDictEqual( perf.returns.to_dict(orient="list"), { 'strategy-1': [-0.002257125, -0.000375271, -0.002395708], 'strategy-2': [0.0, -0.005031677, -0.004845368] })
def test_benchmark(self): backtest_results = deepcopy(BACKTEST_RESULTS) backtest_results["strategy-1"].update({ ('Benchmark', '2018-12-03'): None, ('Benchmark', '2018-12-04'): None, ('Benchmark', '2018-12-05'): None }) backtest_results["strategy-2"].update({ ('Benchmark', '2018-12-03'): 100.10, ('Benchmark', '2018-12-04'): 102.34, ('Benchmark', '2018-12-05'): 102.08 }) backtest_results = pd.DataFrame.from_dict(backtest_results) backtest_results.index.set_names(["Field", "Date"], inplace=True) backtest_results.to_csv("backtest.csv") perf = DailyPerformance.from_moonshot_csv("backtest.csv") self.assertListEqual(perf.benchmark_returns.tolist(), [0.0, 0.02237762237762242, -0.002540551104162625])
def test_rolling_sharpe_window(self): perf = DailyPerformance.from_moonshot_csv("backtest.csv") self.assertDictEqual( perf.rolling_sharpe.fillna(-1).to_dict(orient="list"), { 'strategy-1': [-1.0, -1.0, -1.0], 'strategy-2': [-1.0, -1.0, -1.0] }) perf = DailyPerformance.from_moonshot_csv("backtest.csv", rolling_sharpe_window=2) self.assertDictEqual( perf.rolling_sharpe.fillna(-1).to_dict(orient="list"), { 'strategy-1': [-1.0, -22.205756137004837, -21.77149197579271], 'strategy-2': [-1.0, -4.55699466016689, -841.576244567701] })
def test_compound(self): perf = DailyPerformance.from_moonshot_csv("backtest.csv") self.assertDictEqual( perf.cum_returns.to_dict(orient="list"), { 'strategy-1': [0.997742875, 0.9973684510335559, 0.9949790474564671], 'strategy-2': [1.00278717, 0.9977414688608159, 0.9929070442753247] }) perf = DailyPerformance.from_moonshot_csv("backtest.csv", compound=False) self.assertDictEqual( perf.cum_returns.to_dict(orient="list"), { 'strategy-1': [0.997742875, 0.997367604, 0.994971896], 'strategy-2': [1.00278717, 0.997755493, 0.992910125] })
def test_from_moonshot_csv_agg_perf(self): perf = DailyPerformance.from_moonshot_csv("backtest.csv") agg_perf = AggregateDailyPerformance(perf) self.assertListEqual(list(agg_perf.returns.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertListEqual( agg_perf.returns.tolist(), [0.0005300449999999998, -0.005406948, -0.007241076]) self.assertListEqual( list(agg_perf.abs_exposures.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertListEqual(agg_perf.abs_exposures.tolist(), [0.666666666, 0.666666666, 0.666666666]) self.assertListEqual( list(agg_perf.net_exposures.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertListEqual(agg_perf.net_exposures.tolist(), [0.303030303, 0.393939394, 0.242424242]) self.assertListEqual( list(agg_perf.turnover.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertListEqual(agg_perf.turnover.tolist(), [0.04906204900000001, 0.090909091, 0.151515152]) self.assertListEqual( list(agg_perf.total_holdings.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertListEqual(agg_perf.total_holdings.tolist(), [47.0, 47.0, 47.0]) self.assertListEqual( list(agg_perf.commissions.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertListEqual(agg_perf.commissions.tolist(), [0.0001, 0.0001, 0.0001]) self.assertListEqual( list(agg_perf.cum_commissions.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertListEqual(agg_perf.cum_commissions.tolist(), [1.0001, 1.0002, 1.0003]) self.assertListEqual( list(agg_perf.slippages.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertListEqual(agg_perf.slippages.tolist(), [0.0001, 0.0001, 0.0031]) self.assertListEqual( list(agg_perf.cum_slippages.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertListEqual(agg_perf.cum_slippages.tolist(), [1.0001, 1.0002, 1.0033]) self.assertEqual(agg_perf.cagr, -0.8912867832023363) self.assertEqual(agg_perf.sharpe, -15.785645344093775) self.assertListEqual( list(agg_perf.cum_returns.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertListEqual( agg_perf.cum_returns.tolist(), [1.000530045, 0.9951202310742474, 0.9879144898519012]) self.assertListEqual( list(agg_perf.drawdowns.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertListEqual( agg_perf.drawdowns.tolist(), [0.0, -0.005406947999999967, -0.012608871878603933]) self.assertEqual(agg_perf.max_drawdown, -0.012608871878603933)
def test_from_moonshot_csv(self): perf = DailyPerformance.from_moonshot_csv("backtest.csv") self.assertListEqual(list(perf.returns.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertDictEqual( perf.returns.to_dict(orient="list"), { 'strategy-1': [-0.002257125, -0.000375271, -0.002395708], 'strategy-2': [0.00278717, -0.005031677, -0.004845368] }) self.assertListEqual( list(perf.abs_exposures.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertDictEqual( perf.abs_exposures.to_dict(orient="list"), { 'strategy-1': [0.333333333, 0.333333333, 0.333333333], 'strategy-2': [0.333333333, 0.333333333, 0.333333333] }) self.assertListEqual( list(perf.net_exposures.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertDictEqual( perf.net_exposures.to_dict(orient="list"), { 'strategy-1': [-0.03030303, 0.060606061, -0.090909091], 'strategy-2': [0.333333333, 0.333333333, 0.333333333] }) self.assertListEqual(list(perf.turnover.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertDictEqual( perf.turnover.to_dict(orient="list"), { 'strategy-1': [0.049062049, 0.090909091, 0.151515152], 'strategy-2': [3.47e-18, 0.0, 0.0] }) self.assertListEqual( list(perf.total_holdings.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertDictEqual(perf.total_holdings.to_dict(orient="list"), { 'strategy-1': [22.0, 22.0, 22.0], 'strategy-2': [25.0, 25.0, 25.0] }) self.assertListEqual(list(perf.commissions.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertDictEqual(perf.commissions.to_dict(orient="list"), { 'strategy-1': [0.0001, 0.0001, 0.0001], 'strategy-2': [0.0, 0.0, 0.0] }) self.assertListEqual( list(perf.cum_commissions.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertDictEqual(perf.cum_commissions.to_dict(orient="list"), { 'strategy-1': [1.0001, 1.0002, 1.0003], 'strategy-2': [1.0, 1.0, 1.0] }) self.assertListEqual(list(perf.slippages.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertDictEqual( perf.slippages.to_dict(orient="list"), { 'strategy-1': [0.0001, 0.0001, 0.0001], 'strategy-2': [0.0, 0.0, 0.003] }) self.assertListEqual( list(perf.cum_slippages.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertDictEqual( perf.cum_slippages.to_dict(orient="list"), { 'strategy-1': [1.0001, 1.0002, 1.0003], 'strategy-2': [1.0, 1.0, 1.003] }) self.assertDictEqual(perf.cagr.to_dict(), { 'strategy-1': -0.6009354029100387, 'strategy-2': -0.7272165531290371 }) self.assertDictEqual(perf.sharpe.to_dict(), { 'strategy-1': -23.574049805803934, 'strategy-2': -8.409034049060317 }) self.assertListEqual(list(perf.cum_returns.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertDictEqual( perf.cum_returns.to_dict(orient="list"), { 'strategy-1': [0.997742875, 0.9973684510335559, 0.9949790474564671], 'strategy-2': [1.00278717, 0.9977414688608159, 0.9929070442753247] }) self.assertListEqual(list(perf.drawdowns.index.strftime("%Y-%m-%d")), ['2018-12-03', '2018-12-04', '2018-12-05']) self.assertDictEqual( perf.drawdowns.to_dict(orient="list"), { 'strategy-1': [0.0, -0.00037527100000001035, -0.0027700799602632387], 'strategy-2': [0.0, -0.005031676999999957, -0.009852664673277833] }) self.assertDictEqual( perf.max_drawdown.to_dict(), { 'strategy-1': -0.0027700799602632387, 'strategy-2': -0.009852664673277833 })