Merge pull request #518 from gcarq/cleaning_up_backtesting
Cleaning up backtesting/hyperopt
This commit is contained in:
commit
35c51c73f7
@ -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 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,
|
||||
|
Loading…
Reference in New Issue
Block a user