mhallsmoore / qstrader

QuantStart.com - QSTrader backtesting simulation engine.
https://www.quantstart.com/qstrader/
MIT License
2.84k stars 851 forks source link

Backtest.simulate_trading might return results #54

Closed femtotrader closed 8 years ago

femtotrader commented 8 years ago

So it will be possible to save them (CSV, JSON, YAML, Pickle...)

Moreover it will be possible to use backtest results for unit testing purpose.

femtotrader commented 8 years ago

So in examples/... . py

we will have

def run(config, testing):
    ...
    results = backtest.simulate_trading(testing=testing)
    return results
femtotrader commented 8 years ago

Here is how a test for a strategy could be written

    def test_sp500tr_buy_and_hold_backtest(self):
        """
        Test sp500tr_buy_and_hold
        Bar 0, at 2010-01-04 00:00:00
        Bar 1628, at 2016-06-22 00:00:00
        """
        results = examples.sp500tr_buy_and_hold_backtest.run(self.config, testing=self.testing)
        for (key, expected) in [
            ('sharpe', 0.5969),
            ('max_drawdown_pct', 5.0308),
            ('max_drawdown', 30174.01)
        ]:
            value = float(results[key])
            self.assertAlmostEqual(expected, value)
        for (key, expected) in [
                ('equity_returns', {'min': -1.6027, 'max': 1.2553, 'first': 0.0000, 'last': -0.0580}),
                ('drawdowns', {'min': 0.0, 'max': 30174.01, 'first': 0.0, 'last': 4537.02}),
                ('equity', {'min': 488958.0, 'max': 599782.01, 'first': 500000.0, 'last': 595244.99})
            ]:
            values = results[key]
            self.assertAlmostEqual(float(min(values)), expected['min'])
            self.assertAlmostEqual(float(max(values)), expected['max'])
            self.assertAlmostEqual(float(values.iloc[0]), expected['first'])
            self.assertAlmostEqual(float(values.iloc[-1]), expected['last'])

we probably don't need such tests for every strategy but one like this could avoid regression

For others strategies we can only test sharpe

    def test_mac_backtest(self):
        """
        Test mac_backtest
        """
        results = examples.mac_backtest.main(self.config, testing=self.testing)
        self.assertAlmostEqual(float(results['sharpe']), 0.6018)

    def test_strategy_backtest(self):
        """
        Test strategy_backtest
        """
        results = examples.strategy_backtest.main(self.config, testing=self.testing)
        self.assertAlmostEqual(float(results['sharpe']), -7.5299)
femtotrader commented 8 years ago

Closed by https://github.com/mhallsmoore/qstrader/commit/bffc1a15f5634b49848c6aa741495646044138b0