def test_grid_search_optimizer_as_expected(self): # Initialize market data loading values tickers = ['SPY'] ticker_types = [''] data_sources = ['CSV'] start_date = pd.to_datetime('2016-01-01') end_date = pd.to_datetime('2016-5-31') history_window = 20 csv_data_uri = "support_files" # Load market data data = market_data.load_market_data(tickers, ticker_types, data_sources, start_date, end_date, history_window, csv_data_uri) # Initialize grid search optimizer values algorithm_uri = "support_files/MovingAverageDivergenceAlgorithm.py" num_processors = 4 commission = 0.0 ticker_spreads = [0.0001] optimizer_name = "GridSearchOptimizer" optimization_metric = "sharpe_ratio" optimization_metric_ascending = True optimization_parameters = { "ma_long_window": [10, 20, 2], "ma_short_window": [2, 5, 2], "open_long": [-0.25, -0.25, 1], "close_long": [0.4, 0.4, 1] } time_resolution = "daily" # Create trading algorithm trading_algorithm = TradingAlgorithm.create_trading_algorithm( algorithm_uri, tickers, history_window, None) # Setup and run the optimizer optimizer = of.create_optimizer(num_processors, optimizer_name, trading_algorithm, commission, ticker_spreads, optimization_metric, optimization_metric_ascending, optimization_parameters, time_resolution) results = optimizer.run(data, start_date, end_date) # Manually compute optimal parameters opt_params = Optimizer.get_optimal_parameters( results.backtest_results, optimization_metric, results.parameter_sets, optimization_metric_ascending, time_resolution) # Check results self.assertEqual(opt_params, results.optimal_parameters) self.assertTrue( len(results.backtest_results) == len(results.parameter_sets)) self.assertEqual(4, len(results.backtest_results))
def run(self, data, start_date, end_date): # Prepare input data for running parallel backtests backtest_args = itertools.izip( range(len(self.optimization_parameter_sets)), self.optimization_parameter_sets, itertools.repeat(self.trading_algorithm), itertools.repeat(self.commission), itertools.repeat(self.ticker_spreads), itertools.repeat(data), itertools.repeat(start_date), itertools.repeat(end_date)) # Run all backtest scenarios in parallel pool = mp.Pool(processes=self.num_processors) backtest_results = pool.map(func=_backtest, iterable=backtest_args) # Find optimal parameters optimal_parameters = Optimizer.get_optimal_parameters(backtest_results, self.optimization_metric, \ self.optimization_parameter_sets, self.optimization_metric_ascending, self.frequency) # Save results self.results = OptimizationResults(backtest_results, optimal_parameters, self.optimization_parameter_sets) return self.results