def run(cache_name, cache_backend, expire_after, data_source, start, end, config, testing, tickers, filename, n, n_window): # Set up variables needed for backtest events_queue = queue.Queue() initial_equity = PriceParser.parse(500000.00) session = init_session(cache_name, cache_backend, expire_after) period = 86400 # Seconds in a day if len(tickers) == 1: data = web.DataReader(tickers[0], data_source, start, end, session=session) else: data = web.DataReader(tickers, data_source, start, end, session=session) # Use Generic Bar Handler with Pandas Bar Iterator price_event_iterator = PandasBarEventIterator(data, period, tickers[0]) price_handler = GenericPriceHandler(events_queue, price_event_iterator) # Use the Display Strategy strategy1 = DisplayStrategy(n=n, n_window=n_window) strategy2 = BuyAndHoldStrategy(tickers, events_queue) strategy = Strategies(strategy1, strategy2) # Use an example Position Sizer position_sizer = FixedPositionSizer() # Use an example Risk Manager risk_manager = ExampleRiskManager() # Use the default Portfolio Handler portfolio_handler = PortfolioHandler( initial_equity, events_queue, price_handler, position_sizer, risk_manager ) # Use the ExampleCompliance component compliance = ExampleCompliance(config) # Use a simulated IB Execution Handler execution_handler = IBSimulatedExecutionHandler( events_queue, price_handler, compliance ) # Use the default Statistics statistics = SimpleStatistics(config, portfolio_handler) # Set up the backtest backtest = Backtest( price_handler, strategy, portfolio_handler, execution_handler, position_sizer, risk_manager, statistics, initial_equity ) results = backtest.simulate_trading(testing=testing) statistics.save(filename) return results
def run(config, testing, tickers, filename): # Set up variables needed for backtest events_queue = queue.Queue() csv_dir = config.CSV_DATA_DIR initial_equity = Decimal("500000.00") # heartbeat = 0.0 # max_iters = 10000000000 # Use Yahoo Daily Price Handler price_handler = YahooDailyCsvBarPriceHandler( csv_dir, events_queue, tickers ) # Use the Buy and Hold Strategy strategy = BuyAndHoldStrategy(tickers, events_queue) strategy = Strategies(strategy, DisplayStrategy()) # Use an example Position Sizer position_sizer = FixedPositionSizer() # Use an example Risk Manager risk_manager = ExampleRiskManager() # Use the default Portfolio Handler portfolio_handler = PortfolioHandler( initial_equity, events_queue, price_handler, position_sizer, risk_manager ) # Use the ExampleCompliance component compliance = ExampleCompliance(config) # Use a simulated IB Execution Handler execution_handler = IBSimulatedExecutionHandler( events_queue, price_handler, compliance ) # Use the default Statistics statistics = SimpleStatistics(config, portfolio_handler) # Set up the backtest backtest = Backtest( tickers, price_handler, strategy, portfolio_handler, execution_handler, position_sizer, risk_manager, statistics, initial_equity ) results = backtest.simulate_trading(testing=testing) statistics.save(filename) return results
def run(config, testing, tickers, filename, n, n_window): # Set up variables needed for backtest events_queue = queue.Queue() ig_service = IGService(config.IG.USERNAME, config.IG.PASSWORD, config.IG.API_KEY, config.IG.ACCOUNT.TYPE) ig_stream_service = IGStreamService(ig_service) ig_session = ig_stream_service.create_session() accountId = ig_session[u'accounts'][0][u'accountId'] ig_stream_service.connect(accountId) initial_equity = PriceParser.parse(500000.00) # Use IG Tick Price Handler price_handler = IGTickPriceHandler(events_queue, ig_stream_service, tickers) # Use the Display Strategy strategy = DisplayStrategy(n=n, n_window=n_window) # Use an example Position Sizer position_sizer = FixedPositionSizer() # Use an example Risk Manager risk_manager = ExampleRiskManager() # Use the default Portfolio Handler portfolio_handler = PortfolioHandler(initial_equity, events_queue, price_handler, position_sizer, risk_manager) # Use the ExampleCompliance component compliance = ExampleCompliance(config) # Use a simulated IB Execution Handler execution_handler = IBSimulatedExecutionHandler(events_queue, price_handler, compliance) # Use the default Statistics statistics = SimpleStatistics(config, portfolio_handler) # Set up the backtest backtest = Backtest(price_handler, strategy, portfolio_handler, execution_handler, position_sizer, risk_manager, statistics, initial_equity) results = backtest.simulate_trading(testing=testing) statistics.save(filename) return results
def run(config, testing, tickers, filename, n, n_window): # Set up variables needed for backtest events_queue = queue.Queue() csv_dir = config.CSV_DATA_DIR initial_equity = PriceParser.parse(500000.00) # Use Yahoo Daily Price Handler price_handler = YahooDailyCsvBarPriceHandler( csv_dir, events_queue, tickers ) # Use the Display Strategy strategy = DisplayStrategy(n=n, n_window=n_window) # Use an example Position Sizer position_sizer = FixedPositionSizer() # Use an example Risk Manager risk_manager = ExampleRiskManager() # Use the default Portfolio Handler portfolio_handler = PortfolioHandler( initial_equity, events_queue, price_handler, position_sizer, risk_manager ) # Use the ExampleCompliance component compliance = ExampleCompliance(config) # Use a simulated IB Execution Handler execution_handler = IBSimulatedExecutionHandler( events_queue, price_handler, compliance ) # Use the default Statistics statistics = SimpleStatistics(config, portfolio_handler) # Set up the backtest backtest = Backtest( price_handler, strategy, portfolio_handler, execution_handler, position_sizer, risk_manager, statistics, initial_equity ) results = backtest.simulate_trading(testing=testing) statistics.save(filename) return results
def run(config, testing, tickers, filename): # Set up variables needed for backtest events_queue = queue.Queue() csv_dir = config.CSV_DATA_DIR initial_equity = PriceParser.parse(500000.00) # Use Yahoo Daily Price Handler price_handler = YahooDailyCsvBarPriceHandler(csv_dir, events_queue, tickers) # Use the MAC Strategy strategy = MovingAverageCrossStrategy(tickers, events_queue) strategy = Strategies(strategy, DisplayStrategy()) # Use an example Position Sizer, position_sizer = FixedPositionSizer() # Use an example Risk Manager, risk_manager = ExampleRiskManager() # Use the default Portfolio Handler portfolio_handler = PortfolioHandler(initial_equity, events_queue, price_handler, position_sizer, risk_manager) # Use the ExampleCompliance component compliance = ExampleCompliance(config) # Use a simulated IB Execution Handler execution_handler = IBSimulatedExecutionHandler(events_queue, price_handler, compliance) # Use the default Statistics statistics = SimpleStatistics(config, portfolio_handler) # Set up the backtest backtest = Backtest(price_handler, strategy, portfolio_handler, execution_handler, position_sizer, risk_manager, statistics, initial_equity) results = backtest.simulate_trading(testing=testing) statistics.save(filename) return results
def test_calculating_statistics(self): """ Purchase/sell multiple lots of AMZN, GOOG at various prices/commissions to ensure the arithmetic in calculating equity, drawdowns and sharpe ratio is correct. """ # Create Statistics object price_handler = PriceHandlerMock() self.portfolio = Portfolio(price_handler, PriceParser.parse(500000.00)) portfolio_handler = PortfolioHandlerMock(self.portfolio) statistics = SimpleStatistics(self.config, portfolio_handler) # Check initialization was correct self.assertEqual(PriceParser.display(statistics.equity[0]), 500000.00) self.assertEqual(PriceParser.display(statistics.drawdowns[0]), 00) self.assertEqual(statistics.equity_returns[0], 0.0) # Perform transaction and test statistics at this tick self.portfolio.transact_position( "BOT", "AMZN", 100, PriceParser.parse(566.56), PriceParser.parse(1.00) ) t = "2000-01-01 00:00:00" statistics.update(t, portfolio_handler) self.assertEqual(PriceParser.display(statistics.equity[1]), 499807.00) self.assertEqual(PriceParser.display(statistics.drawdowns[1]), 193.00) self.assertEqual(statistics.equity_returns[1], -0.0386) # Perform transaction and test statistics at this tick self.portfolio.transact_position( "BOT", "AMZN", 200, PriceParser.parse(566.395), PriceParser.parse(1.00) ) t = "2000-01-02 00:00:00" statistics.update(t, portfolio_handler) self.assertEqual(PriceParser.display(statistics.equity[2]), 499455.00) self.assertEqual(PriceParser.display(statistics.drawdowns[2]), 545.00) self.assertEqual(statistics.equity_returns[2], -0.0705) # Perform transaction and test statistics at this tick self.portfolio.transact_position( "BOT", "GOOG", 200, PriceParser.parse(707.50), PriceParser.parse(1.00) ) t = "2000-01-03 00:00:00" statistics.update(t, portfolio_handler) self.assertEqual(PriceParser.display(statistics.equity[3]), 499046.00) self.assertEqual(PriceParser.display(statistics.drawdowns[3]), 954.00) self.assertEqual(statistics.equity_returns[3], -0.0820) # Perform transaction and test statistics at this tick self.portfolio.transact_position( "SLD", "AMZN", 100, PriceParser.parse(565.83), PriceParser.parse(1.00) ) t = "2000-01-04 00:00:00" statistics.update(t, portfolio_handler) self.assertEqual(PriceParser.display(statistics.equity[4]), 499164.00) self.assertEqual(PriceParser.display(statistics.drawdowns[4]), 836.00) self.assertEqual(statistics.equity_returns[4], 0.0236) # Perform transaction and test statistics at this tick self.portfolio.transact_position( "BOT", "GOOG", 200, PriceParser.parse(705.545), PriceParser.parse(1.00) ) t = "2000-01-05 00:00:00" statistics.update(t, portfolio_handler) self.assertEqual(PriceParser.display(statistics.equity[5]), 499146.00) self.assertEqual(PriceParser.display(statistics.drawdowns[5]), 854.00) self.assertEqual(statistics.equity_returns[5], -0.0036) # Perform transaction and test statistics at this tick self.portfolio.transact_position( "SLD", "AMZN", 200, PriceParser.parse(565.59), PriceParser.parse(1.00) ) t = "2000-01-06 00:00:00" statistics.update(t, portfolio_handler) self.assertEqual(PriceParser.display(statistics.equity[6]), 499335.00) self.assertEqual(PriceParser.display(statistics.drawdowns[6]), 665.00) self.assertEqual(statistics.equity_returns[6], 0.0379) # Perform transaction and test statistics at this tick self.portfolio.transact_position( "SLD", "GOOG", 100, PriceParser.parse(707.92), PriceParser.parse(1.00) ) t = "2000-01-07 00:00:00" statistics.update(t, portfolio_handler) self.assertEqual(PriceParser.display(statistics.equity[7]), 499580.00) self.assertEqual(PriceParser.display(statistics.drawdowns[7]), 420.00) self.assertEqual(statistics.equity_returns[7], 0.0490) # Perform transaction and test statistics at this tick self.portfolio.transact_position( "SLD", "GOOG", 100, PriceParser.parse(707.90), PriceParser.parse(0.00) ) t = "2000-01-08 00:00:00" statistics.update(t, portfolio_handler) self.assertEqual(PriceParser.display(statistics.equity[8]), 499824.00) self.assertEqual(PriceParser.display(statistics.drawdowns[8]), 176.00) self.assertEqual(statistics.equity_returns[8], 0.0488) # Perform transaction and test statistics at this tick self.portfolio.transact_position( "SLD", "GOOG", 100, PriceParser.parse(707.92), PriceParser.parse(0.50) ) t = "2000-01-09 00:00:00" statistics.update(t, portfolio_handler) self.assertEqual(PriceParser.display(statistics.equity[9]), 500069.50) self.assertEqual(PriceParser.display(statistics.drawdowns[9]), 00.00) self.assertEqual(statistics.equity_returns[9], 0.0491) # Perform transaction and test statistics at this tick self.portfolio.transact_position( "SLD", "GOOG", 100, PriceParser.parse(707.78), PriceParser.parse(1.00) ) t = "2000-01-10 00:00:00" statistics.update(t, portfolio_handler) self.assertEqual(PriceParser.display(statistics.equity[10]), 500300.50) self.assertEqual(PriceParser.display(statistics.drawdowns[10]), 00.00) self.assertEqual(statistics.equity_returns[10], 0.0462) # Test that results are calculated correctly. results = statistics.get_results() self.assertEqual(results["max_drawdown"], 954.00) self.assertEqual(results["max_drawdown_pct"], 0.1908) self.assertAlmostEqual(float(results["sharpe"]), 1.7575)
def test_calculating_statistics(self): """ Purchase/sell multiple lots of AMZN, GOOG at various prices/commissions to ensure the arithmetic in calculating equity, drawdowns and sharpe ratio is correct. """ # Create Statistics object price_handler = PriceHandlerMock() self.portfolio = Portfolio(price_handler, Decimal("500000.00")) portfolio_handler = PortfolioHandlerMock(self.portfolio) statistics = SimpleStatistics(portfolio_handler) # Perform transaction and test statistics at this tick self.portfolio.transact_position( "BOT", "AMZN", 100, Decimal("566.56"), Decimal("1.00") ) t = "2000-01-01 00:00:00" statistics.update(t) self.assertEqual(statistics.equity[t], Decimal("499807.00")) self.assertEqual(statistics.drawdowns[t], Decimal("193.00")) self.assertEqual(statistics.equity_returns[t], Decimal("-0.0386")) # Perform transaction and test statistics at this tick self.portfolio.transact_position( "BOT", "AMZN", 200, Decimal ("566.395"), Decimal("1.00") ) t = "2000-01-02 00:00:00" statistics.update(t) self.assertEqual(statistics.equity[t], Decimal("499455.00")) self.assertEqual(statistics.drawdowns[t], Decimal("545.00")) self.assertEqual(statistics.equity_returns[t], Decimal("-0.0705")) # Perform transaction and test statistics at this tick self.portfolio.transact_position( "BOT", "GOOG", 200, Decimal("707.50"), Decimal("1.00") ) t = "2000-01-03 00:00:00" statistics.update(t) self.assertEqual(statistics.equity[t], Decimal("499046.00")) self.assertEqual(statistics.drawdowns[t], Decimal("954.00")) self.assertEqual(statistics.equity_returns[t], Decimal("-0.0820")) # Perform transaction and test statistics at this tick self.portfolio.transact_position( "SLD", "AMZN", 100, Decimal("565.83"), Decimal("1.00") ) t = "2000-01-04 00:00:00" statistics.update(t) self.assertEqual(statistics.equity[t], Decimal("499164.00")) self.assertEqual(statistics.drawdowns[t], Decimal("836.00")) self.assertEqual(statistics.equity_returns[t], Decimal("0.0236")) # Perform transaction and test statistics at this tick self.portfolio.transact_position( "BOT", "GOOG", 200, Decimal("705.545"), Decimal("1.00") ) t = "2000-01-05 00:00:00" statistics.update(t) self.assertEqual(statistics.equity[t], Decimal("499146.00")) self.assertEqual(statistics.drawdowns[t], Decimal("854.00")) self.assertEqual(statistics.equity_returns[t], Decimal("-0.0036")) # Perform transaction and test statistics at this tick self.portfolio.transact_position( "SLD", "AMZN", 200, Decimal("565.59"), Decimal("1.00") ) t = "2000-01-06 00:00:00" statistics.update(t) self.assertEqual(statistics.equity[t], Decimal("499335.00")) self.assertEqual(statistics.drawdowns[t], Decimal("665.00")) self.assertEqual(statistics.equity_returns[t], Decimal("0.0379")) # Perform transaction and test statistics at this tick self.portfolio.transact_position( "SLD", "GOOG", 100, Decimal("707.92"), Decimal("1.00") ) t = "2000-01-07 00:00:00" statistics.update(t) self.assertEqual(statistics.equity[t], Decimal("499580.00")) self.assertEqual(statistics.drawdowns[t], Decimal("420.00")) self.assertEqual(statistics.equity_returns[t], Decimal("0.0490")) # Perform transaction and test statistics at this tick self.portfolio.transact_position( "SLD", "GOOG", 100, Decimal("707.90"), Decimal("0.00") ) t = "2000-01-08 00:00:00" statistics.update(t) self.assertEqual(statistics.equity[t], Decimal("499824.00")) self.assertEqual(statistics.drawdowns[t], Decimal("176.00")) self.assertEqual(statistics.equity_returns[t], Decimal("0.0488")) # Perform transaction and test statistics at this tick self.portfolio.transact_position( "SLD", "GOOG", 100, Decimal("707.92"), Decimal("0.50") ) t = "2000-01-09 00:00:00" statistics.update(t) self.assertEqual(statistics.equity[t], Decimal("500069.50")) self.assertEqual(statistics.drawdowns[t], Decimal("00.00")) self.assertEqual(statistics.equity_returns[t], Decimal("0.0491")) # Perform transaction and test statistics at this tick self.portfolio.transact_position( "SLD", "GOOG", 100, Decimal("707.78"), Decimal("1.00") ) t = "2000-01-10 00:00:00" statistics.update(t) self.assertEqual(statistics.equity[t], Decimal("500300.50")) self.assertEqual(statistics.drawdowns[t], Decimal("00.00")) self.assertEqual(statistics.equity_returns[t], Decimal("0.0462")) # Test that results are calculated correctly. results = statistics.get_results() self.assertEqual(results["max_drawdown"], Decimal("954.00")) self.assertEqual(results["max_drawdown_pct"], Decimal("0.1908")) self.assertAlmostEqual(float(results["sharpe"]), 1.8353)
def test_calculating_statistics(self): """ Purchase/sell multiple lots of AMZN, GOOG at various prices/commissions to ensure the arithmetic in calculating equity, drawdowns and sharpe ratio is correct. """ # Create Statistics object price_handler = PriceHandlerMock() self.portfolio = Portfolio(price_handler, PriceParser.parse(500000.00)) portfolio_handler = PortfolioHandlerMock(self.portfolio) statistics = SimpleStatistics(self.config, portfolio_handler) # Check initialization was correct self.assertEqual(PriceParser.display(statistics.equity[0]), 500000.00) self.assertEqual(PriceParser.display(statistics.drawdowns[0]), 00) self.assertEqual(statistics.equity_returns[0], 0.0) # Perform transaction and test statistics at this tick self.portfolio.transact_position("BOT", "AMZN", 100, PriceParser.parse(566.56), PriceParser.parse(1.00)) t = "2000-01-01 00:00:00" statistics.update(t, portfolio_handler) self.assertEqual(PriceParser.display(statistics.equity[1]), 499807.00) self.assertEqual(PriceParser.display(statistics.drawdowns[1]), 193.00) self.assertEqual(statistics.equity_returns[1], -0.0386) # Perform transaction and test statistics at this tick self.portfolio.transact_position("BOT", "AMZN", 200, PriceParser.parse(566.395), PriceParser.parse(1.00)) t = "2000-01-02 00:00:00" statistics.update(t, portfolio_handler) self.assertEqual(PriceParser.display(statistics.equity[2]), 499455.00) self.assertEqual(PriceParser.display(statistics.drawdowns[2]), 545.00) self.assertEqual(statistics.equity_returns[2], -0.0705) # Perform transaction and test statistics at this tick self.portfolio.transact_position("BOT", "GOOG", 200, PriceParser.parse(707.50), PriceParser.parse(1.00)) t = "2000-01-03 00:00:00" statistics.update(t, portfolio_handler) self.assertEqual(PriceParser.display(statistics.equity[3]), 499046.00) self.assertEqual(PriceParser.display(statistics.drawdowns[3]), 954.00) self.assertEqual(statistics.equity_returns[3], -0.0820) # Perform transaction and test statistics at this tick self.portfolio.transact_position("SLD", "AMZN", 100, PriceParser.parse(565.83), PriceParser.parse(1.00)) t = "2000-01-04 00:00:00" statistics.update(t, portfolio_handler) self.assertEqual(PriceParser.display(statistics.equity[4]), 499164.00) self.assertEqual(PriceParser.display(statistics.drawdowns[4]), 836.00) self.assertEqual(statistics.equity_returns[4], 0.0236) # Perform transaction and test statistics at this tick self.portfolio.transact_position("BOT", "GOOG", 200, PriceParser.parse(705.545), PriceParser.parse(1.00)) t = "2000-01-05 00:00:00" statistics.update(t, portfolio_handler) self.assertEqual(PriceParser.display(statistics.equity[5]), 499146.00) self.assertEqual(PriceParser.display(statistics.drawdowns[5]), 854.00) self.assertEqual(statistics.equity_returns[5], -0.0036) # Perform transaction and test statistics at this tick self.portfolio.transact_position("SLD", "AMZN", 200, PriceParser.parse(565.59), PriceParser.parse(1.00)) t = "2000-01-06 00:00:00" statistics.update(t, portfolio_handler) self.assertEqual(PriceParser.display(statistics.equity[6]), 499335.00) self.assertEqual(PriceParser.display(statistics.drawdowns[6]), 665.00) self.assertEqual(statistics.equity_returns[6], 0.0379) # Perform transaction and test statistics at this tick self.portfolio.transact_position("SLD", "GOOG", 100, PriceParser.parse(707.92), PriceParser.parse(1.00)) t = "2000-01-07 00:00:00" statistics.update(t, portfolio_handler) self.assertEqual(PriceParser.display(statistics.equity[7]), 499580.00) self.assertEqual(PriceParser.display(statistics.drawdowns[7]), 420.00) self.assertEqual(statistics.equity_returns[7], 0.0490) # Perform transaction and test statistics at this tick self.portfolio.transact_position("SLD", "GOOG", 100, PriceParser.parse(707.90), PriceParser.parse(0.00)) t = "2000-01-08 00:00:00" statistics.update(t, portfolio_handler) self.assertEqual(PriceParser.display(statistics.equity[8]), 499824.00) self.assertEqual(PriceParser.display(statistics.drawdowns[8]), 176.00) self.assertEqual(statistics.equity_returns[8], 0.0488) # Perform transaction and test statistics at this tick self.portfolio.transact_position("SLD", "GOOG", 100, PriceParser.parse(707.92), PriceParser.parse(0.50)) t = "2000-01-09 00:00:00" statistics.update(t, portfolio_handler) self.assertEqual(PriceParser.display(statistics.equity[9]), 500069.50) self.assertEqual(PriceParser.display(statistics.drawdowns[9]), 00.00) self.assertEqual(statistics.equity_returns[9], 0.0491) # Perform transaction and test statistics at this tick self.portfolio.transact_position("SLD", "GOOG", 100, PriceParser.parse(707.78), PriceParser.parse(1.00)) t = "2000-01-10 00:00:00" statistics.update(t, portfolio_handler) self.assertEqual(PriceParser.display(statistics.equity[10]), 500300.50) self.assertEqual(PriceParser.display(statistics.drawdowns[10]), 00.00) self.assertEqual(statistics.equity_returns[10], 0.0462) # Test that results are calculated correctly. results = statistics.get_results() self.assertEqual(results["max_drawdown"], 954.00) self.assertEqual(results["max_drawdown_pct"], 0.1908) self.assertAlmostEqual(float(results["sharpe"]), 1.7575)
def run(config, testing, tickers, filename, n, n_window): # Set up variables needed for backtest events_queue = queue.Queue() csv_dir = config.CSV_DATA_DIR initial_equity = PriceParser.parse(500000.00) d_tickers = OrderedDict() for ticker in tickers: ticker_path = os.path.join(csv_dir, "%s.csv" % ticker) df = pd.io.parsers.read_csv( ticker_path, header=0, parse_dates=True, dayfirst=True, index_col=1, names=("Ticker", "Time", "Bid", "Ask") ) del df["Ticker"] d_tickers[ticker] = df if len(tickers) == 1: ticker = tickers[0] data = d_tickers[ticker] else: data = pd.Panel.from_dict(d_tickers) data = data.transpose(2, 1, 0) print(data) print("Null:") print(data.isnull().sum()) # Use Generic Tick Handler with Pandas Tick Iterator price_event_iterator = PandasTickEventIterator(data, tickers[0]) price_handler = GenericPriceHandler(events_queue, price_event_iterator) # Use the Display Strategy and ExampleStrategy strategy1 = DisplayStrategy(n=n, n_window=n_window) strategy2 = ExampleStrategy(tickers, events_queue) strategy = Strategies(strategy1, strategy2) # strategy = ExampleStrategy(tickers, events_queue) # Use an example Position Sizer position_sizer = FixedPositionSizer() # Use an example Risk Manager risk_manager = ExampleRiskManager() # Use the default Portfolio Handler portfolio_handler = PortfolioHandler( initial_equity, events_queue, price_handler, position_sizer, risk_manager ) # Use the ExampleCompliance component compliance = ExampleCompliance(config) # Use a simulated IB Execution Handler execution_handler = IBSimulatedExecutionHandler( events_queue, price_handler, compliance ) # Use the default Statistics statistics = SimpleStatistics(config, portfolio_handler) # Set up the backtest backtest = Backtest( price_handler, strategy, portfolio_handler, execution_handler, position_sizer, risk_manager, statistics, initial_equity ) results = backtest.simulate_trading(testing=testing) statistics.save(filename) return results