timeperiod argument to backtesting and hyperopt

This commit is contained in:
kryofly 2018-01-10 23:03:05 +01:00
parent feca87345f
commit b0f3fd7ffb
7 changed files with 41 additions and 17 deletions

View File

@ -183,6 +183,13 @@ def build_subcommands(parser: argparse.ArgumentParser) -> None:
action='store_true',
dest='refresh_pairs',
)
backtesting_cmd.add_argument(
'-tp', '--timeperiod',
help='Use the last N ticks of data.',
default=None,
type=int,
dest='timeperiod',
)
# Add hyperopt subcommand
hyperopt_cmd = subparsers.add_parser('hyperopt', help='hyperopt module')
@ -209,6 +216,13 @@ def build_subcommands(parser: argparse.ArgumentParser) -> None:
type=int,
metavar='INT',
)
hyperopt_cmd.add_argument(
'-tp', '--timeperiod',
help='Use the last N ticks of data.',
default=None,
type=int,
dest='timeperiod',
)
# Required json-schema for user specified config

View File

@ -12,6 +12,13 @@ from freqtrade.analyze import populate_indicators, parse_ticker_dataframe
logger = logging.getLogger(__name__)
def trim_tickerlist(dl, num):
new = {}
for pair, pair_data in dl.items():
new[pair] = pair_data[num:]
return new
def load_tickerdata_file(datadir, pair, ticker_interval):
"""
Load a pair from file,
@ -61,7 +68,9 @@ def load_data(datadir: str, ticker_interval: int = 5, pairs: Optional[List[str]]
return result
def tickerdata_to_dataframe(data):
def tickerdata_to_dataframe(data, timeperiod=None):
if timeperiod:
data = trim_tickerlist(data, timeperiod)
preprocessed = preprocess(data)
return preprocessed

View File

@ -176,7 +176,7 @@ def start(args):
from freqtrade import main
main._CONF = config
preprocessed = optimize.tickerdata_to_dataframe(data)
preprocessed = optimize.tickerdata_to_dataframe(data, timeperiod=args.timeperiod)
# Print timeframe
min_date, max_date = get_timeframe(preprocessed)
logger.info('Measuring data from %s up to %s ...', min_date.isoformat(), max_date.isoformat())

View File

@ -231,7 +231,7 @@ def start(args):
config = load_config(args.config)
pairs = config['exchange']['pair_whitelist']
data = optimize.load_data(args.datadir, pairs=pairs, ticker_interval=args.ticker_interval)
PROCESSED = optimize.tickerdata_to_dataframe(data)
PROCESSED = optimize.tickerdata_to_dataframe(data, timeperiod=args.timeperiod)
if args.mongodb:
logger.info('Using mongodb ...')

View File

@ -6,7 +6,7 @@ import pandas as pd
from unittest.mock import MagicMock
from freqtrade import exchange, optimize
from freqtrade.exchange import Bittrex
from freqtrade.optimize import preprocess
from freqtrade.optimize import preprocess, trim_tickerlist
from freqtrade.optimize.backtesting import backtest, generate_text_table, get_timeframe
import freqtrade.optimize.backtesting as backtesting
@ -59,16 +59,9 @@ def test_backtest_1min_ticker_interval(default_conf, mocker):
assert not results.empty
def trim_dictlist(dl, num):
new = {}
for pair, pair_data in dl.items():
new[pair] = pair_data[num:]
return new
def load_data_test(what):
data = optimize.load_data(None, ticker_interval=1, pairs=['BTC_UNITEST'])
data = trim_dictlist(data, -100)
data = trim_tickerlist(data, -100)
pair = data['BTC_UNITEST']
datalen = len(pair)
# Depending on the what parameter we now adjust the
@ -152,7 +145,7 @@ def test_backtest_pricecontours(default_conf, mocker):
def mocked_load_data(datadir, pairs=[], ticker_interval=0, refresh_pairs=False):
tickerdata = optimize.load_tickerdata_file(datadir, 'BTC_UNITEST', 1)
pairdata = {'BTC_UNITEST': tickerdata}
return trim_dictlist(pairdata, -100)
return trim_tickerlist(pairdata, -100)
def test_backtest_start(default_conf, mocker, caplog):
@ -166,6 +159,7 @@ def test_backtest_start(default_conf, mocker, caplog):
args.level = 10
args.live = False
args.datadir = None
args.timeperiod = None # needed due to MagicMock malleability
backtesting.start(args)
# check the logs, that will contain the backtest result
exists = ['Using max_open_trades: 1 ...',

View File

@ -37,7 +37,7 @@ def create_trials(mocker):
def test_start_calls_fmin(mocker):
mocker.patch('freqtrade.optimize.hyperopt.Trials', return_value=create_trials(mocker))
mocker.patch('freqtrade.optimize.preprocess')
mocker.patch('freqtrade.optimize.tickerdata_to_dataframe')
mocker.patch('freqtrade.optimize.load_data')
mock_fmin = mocker.patch('freqtrade.optimize.hyperopt.fmin', return_value={})
@ -50,7 +50,7 @@ def test_start_calls_fmin(mocker):
def test_start_uses_mongotrials(mocker):
mock_mongotrials = mocker.patch('freqtrade.optimize.hyperopt.MongoTrials',
return_value=create_trials(mocker))
mocker.patch('freqtrade.optimize.preprocess')
mocker.patch('freqtrade.optimize.tickerdata_to_dataframe')
mocker.patch('freqtrade.optimize.load_data')
mocker.patch('freqtrade.optimize.hyperopt.fmin', return_value={})
@ -104,7 +104,7 @@ def test_fmin_best_results(mocker, caplog):
}
mocker.patch('freqtrade.optimize.hyperopt.MongoTrials', return_value=create_trials(mocker))
mocker.patch('freqtrade.optimize.preprocess')
mocker.patch('freqtrade.optimize.tickerdata_to_dataframe')
mocker.patch('freqtrade.optimize.load_data')
mocker.patch('freqtrade.optimize.hyperopt.fmin', return_value=fmin_result)
@ -126,7 +126,7 @@ def test_fmin_best_results(mocker, caplog):
def test_fmin_throw_value_error(mocker, caplog):
mocker.patch('freqtrade.optimize.hyperopt.MongoTrials', return_value=create_trials(mocker))
mocker.patch('freqtrade.optimize.preprocess')
mocker.patch('freqtrade.optimize.tickerdata_to_dataframe')
mocker.patch('freqtrade.optimize.load_data')
mocker.patch('freqtrade.optimize.hyperopt.fmin', side_effect=ValueError())

View File

@ -174,3 +174,10 @@ def test_load_tickerdata_file():
assert not load_tickerdata_file(None, 'BTC_UNITEST', 7)
tickerdata = load_tickerdata_file(None, 'BTC_UNITEST', 1)
assert _btc_unittest_length == len(tickerdata)
def test_tickerdata_to_dataframe():
tick = load_tickerdata_file(None, 'BTC_UNITEST', 1)
tickerlist = {'BTC_UNITEST': tick}
data = optimize.tickerdata_to_dataframe(tickerlist, timeperiod=-100)
assert 100 == len(data['BTC_UNITEST'])