示例#1
0
    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]
            })
示例#2
0
    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])
示例#3
0
    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]
            })
示例#4
0
    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]
            })
示例#5
0
    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)
示例#6
0
    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
            })