Merge pull request #518 from gcarq/cleaning_up_backtesting
Cleaning up backtesting/hyperopt
This commit is contained in:
		| @@ -207,13 +207,7 @@ def scripts_options(parser: argparse.ArgumentParser) -> None: | ||||
|     ) | ||||
|  | ||||
|  | ||||
| def backtesting_options(parser: argparse.ArgumentParser) -> None: | ||||
|     parser.add_argument( | ||||
|         '-l', '--live', | ||||
|         action='store_true', | ||||
|         dest='live', | ||||
|         help='using live data', | ||||
|     ) | ||||
| def optimizer_shared_options(parser: argparse.ArgumentParser) -> None: | ||||
|     parser.add_argument( | ||||
|         '-i', '--ticker-interval', | ||||
|         help='specify ticker interval in minutes (1, 5, 30, 60, 1440)', | ||||
| @@ -227,6 +221,22 @@ def backtesting_options(parser: argparse.ArgumentParser) -> None: | ||||
|         action='store_true', | ||||
|         dest='realistic_simulation', | ||||
|     ) | ||||
|     parser.add_argument( | ||||
|         '--timerange', | ||||
|         help='Specify what timerange of data to use.', | ||||
|         default=None, | ||||
|         type=str, | ||||
|         dest='timerange', | ||||
|     ) | ||||
|  | ||||
|  | ||||
| def backtesting_options(parser: argparse.ArgumentParser) -> None: | ||||
|     parser.add_argument( | ||||
|         '-l', '--live', | ||||
|         action='store_true', | ||||
|         dest='live', | ||||
|         help='using live data', | ||||
|     ) | ||||
|     parser.add_argument( | ||||
|         '-r', '--refresh-pairs-cached', | ||||
|         help='refresh the pairs files in tests/testdata with the latest data from Bittrex. \ | ||||
| @@ -242,13 +252,6 @@ def backtesting_options(parser: argparse.ArgumentParser) -> None: | ||||
|         default=None, | ||||
|         dest='export', | ||||
|     ) | ||||
|     parser.add_argument( | ||||
|         '--timerange', | ||||
|         help='Specify what timerange of data to use.', | ||||
|         default=None, | ||||
|         type=str, | ||||
|         dest='timerange', | ||||
|     ) | ||||
|  | ||||
|  | ||||
| def hyperopt_options(parser: argparse.ArgumentParser) -> None: | ||||
| @@ -266,20 +269,6 @@ def hyperopt_options(parser: argparse.ArgumentParser) -> None: | ||||
|         dest='mongodb', | ||||
|         action='store_true', | ||||
|     ) | ||||
|     parser.add_argument( | ||||
|         '-i', '--ticker-interval', | ||||
|         help='specify ticker interval in minutes (1, 5, 30, 60, 1440)', | ||||
|         dest='ticker_interval', | ||||
|         type=int, | ||||
|         metavar='INT', | ||||
|     ) | ||||
|     parser.add_argument( | ||||
|         '--timerange', | ||||
|         help='Specify what timerange of data to use.', | ||||
|         default=None, | ||||
|         type=str, | ||||
|         dest='timerange', | ||||
|     ) | ||||
|     parser.add_argument( | ||||
|         '-s', '--spaces', | ||||
|         help='Specify which parameters to hyperopt. Space separate list. \ | ||||
| @@ -330,11 +319,13 @@ def build_subcommands(parser: argparse.ArgumentParser) -> None: | ||||
|     # Add backtesting subcommand | ||||
|     backtesting_cmd = subparsers.add_parser('backtesting', help='backtesting module') | ||||
|     backtesting_cmd.set_defaults(func=backtesting.start) | ||||
|     optimizer_shared_options(backtesting_cmd) | ||||
|     backtesting_options(backtesting_cmd) | ||||
|  | ||||
|     # Add hyperopt subcommand | ||||
|     hyperopt_cmd = subparsers.add_parser('hyperopt', help='hyperopt module') | ||||
|     hyperopt_cmd.set_defaults(func=hyperopt.start) | ||||
|     optimizer_shared_options(hyperopt_cmd) | ||||
|     hyperopt_options(hyperopt_cmd) | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -103,13 +103,12 @@ def backtest(args) -> DataFrame: | ||||
|         realistic: do we try to simulate realistic trades? (default: True) | ||||
|         sell_profit_only: sell if profit only | ||||
|         use_sell_signal: act on sell-signal | ||||
|         stoploss: use stoploss | ||||
|     :return: DataFrame | ||||
|     """ | ||||
|     headers = ['date', 'buy', 'open', 'close', 'sell'] | ||||
|     processed = args['processed'] | ||||
|     max_open_trades = args.get('max_open_trades', 0) | ||||
|     realistic = args.get('realistic', True) | ||||
|     realistic = args.get('realistic', False) | ||||
|     record = args.get('record', None) | ||||
|     records = [] | ||||
|     trades = [] | ||||
| @@ -224,7 +223,6 @@ def start(args): | ||||
|                         'realistic': args.realistic_simulation, | ||||
|                         'sell_profit_only': sell_profit_only, | ||||
|                         'use_sell_signal': use_sell_signal, | ||||
|                         'stoploss': strategy.stoploss, | ||||
|                         'record': args.export | ||||
|                         }) | ||||
|     logger.info( | ||||
|   | ||||
| @@ -403,24 +403,24 @@ def buy_strategy_generator(params: Dict[str, Any]) -> Callable: | ||||
|     return populate_buy_trend | ||||
|  | ||||
|  | ||||
| def optimizer(params): | ||||
| def generate_optimizer(args): | ||||
|     def optimizer(params): | ||||
|         global _CURRENT_TRIES | ||||
|  | ||||
|         strategy = Strategy() | ||||
|     if 'roi_t1' in params: | ||||
|         if has_space(args.spaces, 'roi'): | ||||
|             strategy.minimal_roi = generate_roi_table(params) | ||||
|  | ||||
|     if 'trigger' in params: | ||||
|         if has_space(args.spaces, 'buy'): | ||||
|             backtesting.populate_buy_trend = buy_strategy_generator(params) | ||||
|  | ||||
|     if 'stoploss' in params: | ||||
|         stoploss = params['stoploss'] | ||||
|     else: | ||||
|         stoploss = strategy.stoploss | ||||
|         if has_space(args.spaces, 'stoploss'): | ||||
|             strategy.stoploss = params['stoploss'] | ||||
|  | ||||
|         results = backtest({'stake_amount': OPTIMIZE_CONFIG['stake_amount'], | ||||
|                             'processed': PROCESSED, | ||||
|                         'stoploss': stoploss}) | ||||
|                             'realistic': args.realistic_simulation, | ||||
|                             }) | ||||
|         result_explanation = format_results(results) | ||||
|  | ||||
|         total_profit = results.profit_percent.sum() | ||||
| @@ -451,6 +451,8 @@ def optimizer(params): | ||||
|             'result': result_explanation, | ||||
|         } | ||||
|  | ||||
|     return optimizer | ||||
|  | ||||
|  | ||||
| def format_results(results: DataFrame): | ||||
|     return ('{:6d} trades. Avg profit {: 5.2f}%. ' | ||||
| @@ -519,7 +521,7 @@ def start(args): | ||||
|  | ||||
|     try: | ||||
|         best_parameters = fmin( | ||||
|             fn=optimizer, | ||||
|             fn=generate_optimizer(args), | ||||
|             space=hyperopt_space(args.spaces), | ||||
|             algo=tpe.suggest, | ||||
|             max_evals=TOTAL_TRIES, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user