From d4f8b3ebbc14db2e574fab81fc425d2f033711ab Mon Sep 17 00:00:00 2001 From: Janne Sinivirta Date: Thu, 19 Oct 2017 17:12:08 +0300 Subject: [PATCH 01/17] remove setup.cfg as it's not used but it messes with running a single test --- setup.cfg | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 setup.cfg diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index ea59030de..000000000 --- a/setup.cfg +++ /dev/null @@ -1,5 +0,0 @@ -[aliases] -test=pytest - -[tool:pytest] -addopts = --cov=freqtrade --cov-config=.coveragerc freqtrade/tests/ From 1792e0fb9b0576fb7e0480c373b776128be3ddc0 Mon Sep 17 00:00:00 2001 From: Janne Sinivirta Date: Thu, 19 Oct 2017 17:12:49 +0300 Subject: [PATCH 02/17] use hyperopt to find optimal parameter values for indicators --- freqtrade/tests/test_hyperopt.py | 124 +++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 freqtrade/tests/test_hyperopt.py diff --git a/freqtrade/tests/test_hyperopt.py b/freqtrade/tests/test_hyperopt.py new file mode 100644 index 000000000..72704647f --- /dev/null +++ b/freqtrade/tests/test_hyperopt.py @@ -0,0 +1,124 @@ +# pragma pylint: disable=missing-docstring +import json +import logging +import os +from functools import reduce + +import pytest +import arrow +from pandas import DataFrame + +import hyperopt.pyll.stochastic + +from hyperopt import fmin, tpe, hp + +from freqtrade.analyze import analyze_ticker +from freqtrade.main import should_sell +from freqtrade.persistence import Trade + +logging.disable(logging.DEBUG) # disable debug logs that slow backtesting a lot + +def print_results(results): + print('Made {} buys. Average profit {:.2f}%. Total profit was {:.3f}. Average duration {:.1f} mins.'.format( + len(results.index), + results.profit.mean() * 100.0, + results.profit.sum(), + results.duration.mean() * 5 + )) + +@pytest.fixture +def pairs(): + return ['btc-neo', 'btc-eth', 'btc-omg', 'btc-edg', 'btc-pay', + 'btc-pivx', 'btc-qtum', 'btc-mtl', 'btc-etc', 'btc-ltc'] + +@pytest.fixture +def conf(): + return { + "minimal_roi": { + "50": 0.0, + "40": 0.01, + "30": 0.02, + "0": 0.045 + }, + "stoploss": -0.40 + } + + +def backtest(conf, pairs, mocker, buy_strategy): + trades = [] + mocker.patch.dict('freqtrade.main._CONF', conf) + for pair in pairs: + with open('freqtrade/tests/testdata/'+pair+'.json') as data_file: + data = json.load(data_file) + + mocker.patch('freqtrade.analyze.get_ticker_history', return_value=data) + mocker.patch('arrow.utcnow', return_value=arrow.get('2017-08-20T14:50:00')) + mocker.patch('freqtrade.analyze.populate_buy_trend', side_effect=buy_strategy) + ticker = analyze_ticker(pair) + # for each buy point + for index, row in ticker[ticker.buy == 1].iterrows(): + trade = Trade( + open_rate=row['close'], + open_date=arrow.get(row['date']).datetime, + amount=1, + ) + # calculate win/lose forwards from buy point + for index2, row2 in ticker[index:].iterrows(): + if should_sell(trade, row2['close'], arrow.get(row2['date']).datetime): + current_profit = (row2['close'] - trade.open_rate) / trade.open_rate + + trades.append((pair, current_profit, index2 - index)) + break + + labels = ['currency', 'profit', 'duration'] + results = DataFrame.from_records(trades, columns=labels) + + print_results(results) + if len(results.index) < 800: + return 0 + return results.profit.sum() / results.duration.mean() + +def buy_strategy_generator(params): + print(params) + def populate_buy_trend(dataframe: DataFrame) -> DataFrame: + conditions = [] + conditions.append(dataframe['close'] < dataframe['sma']) + conditions.append(dataframe['tema'] <= dataframe['blower']) + if params['mfi']['enabled']: + conditions.append(dataframe['mfi'] < params['mfi']['value']) + if params['fastd']['enabled']: + conditions.append(dataframe['fastd'] < params['fastd']['value']) + if params['adx']['enabled']: + conditions.append(dataframe['adx'] > params['adx']['value']) + + dataframe.loc[ + reduce(lambda x, y: x & y, conditions), + 'buy'] = 1 + dataframe.loc[dataframe['buy'] == 1, 'buy_price'] = dataframe['close'] + + return dataframe + return populate_buy_trend + +@pytest.mark.skipif(not os.environ.get('BACKTEST', False), reason="BACKTEST not set") +def test_hyperopt(conf, pairs, mocker): + + def optimizer(params): + return backtest(conf, pairs, mocker, buy_strategy_generator(params)) + + space = { + 'mfi': hp.choice('mfi', [ + {'enabled': False}, + {'enabled': True, 'value': hp.uniform('mfi-value', 10, 50)} + ]), + 'fastd': hp.choice('fastd', [ + {'enabled': False}, + {'enabled': True, 'value': hp.uniform('fastd-value', 10, 50)} + ]), + 'adx': hp.choice('adx', [ + {'enabled': False}, + {'enabled': True, 'value': hp.uniform('adx-value', 10, 50)} + ]), + } + + # print(hyperopt.pyll.stochastic.sample(space)) + print(fmin(fn=optimizer, space=space, algo=tpe.suggest, max_evals=2)) From 4feb038d0a5b0ccc652cf58234749a8d7bfb4567 Mon Sep 17 00:00:00 2001 From: Janne Sinivirta Date: Thu, 19 Oct 2017 17:46:41 +0300 Subject: [PATCH 03/17] add hyperopt dependencies --- requirements.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/requirements.txt b/requirements.txt index be3a292f0..82bb1d952 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,6 +14,9 @@ TA-Lib==0.4.10 pytest==3.2.3 pytest-mock==1.6.3 pytest-cov==2.5.1 +hyperopt==0.1 +# do not upgrade networkx before this is fixed https://github.com/hyperopt/hyperopt/issues/325 +networkx==1.11 # Required for plotting data #matplotlib==2.1.0 From ff100bdac4201f473562e0760ddca92b365db0b6 Mon Sep 17 00:00:00 2001 From: Janne Sinivirta Date: Thu, 19 Oct 2017 18:29:57 +0300 Subject: [PATCH 04/17] the optimizer expects values in the order of smaller is better --- freqtrade/tests/test_hyperopt.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/freqtrade/tests/test_hyperopt.py b/freqtrade/tests/test_hyperopt.py index 72704647f..69da3b6b6 100644 --- a/freqtrade/tests/test_hyperopt.py +++ b/freqtrade/tests/test_hyperopt.py @@ -74,9 +74,9 @@ def backtest(conf, pairs, mocker, buy_strategy): results = DataFrame.from_records(trades, columns=labels) print_results(results) - if len(results.index) < 800: - return 0 - return results.profit.sum() / results.duration.mean() + if len(results.index) < 800: + return 100000 # return large number to "ignore" this result + return results.duration.mean() / results.profit.sum() # the smaller the better def buy_strategy_generator(params): print(params) @@ -121,4 +121,4 @@ def test_hyperopt(conf, pairs, mocker): } # print(hyperopt.pyll.stochastic.sample(space)) - print(fmin(fn=optimizer, space=space, algo=tpe.suggest, max_evals=2)) + print('Best parameters {}'.format(fmin(fn=optimizer, space=space, algo=tpe.suggest, max_evals=10))) From bbb2c7cf62294a2a35e7f04d852250c9d5c468c2 Mon Sep 17 00:00:00 2001 From: Janne Sinivirta Date: Fri, 20 Oct 2017 10:39:04 +0300 Subject: [PATCH 05/17] more parametrizing. adjust ranges for previous parameters --- freqtrade/tests/test_hyperopt.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/freqtrade/tests/test_hyperopt.py b/freqtrade/tests/test_hyperopt.py index 69da3b6b6..011fd48e5 100644 --- a/freqtrade/tests/test_hyperopt.py +++ b/freqtrade/tests/test_hyperopt.py @@ -82,7 +82,8 @@ def buy_strategy_generator(params): print(params) def populate_buy_trend(dataframe: DataFrame) -> DataFrame: conditions = [] - conditions.append(dataframe['close'] < dataframe['sma']) + if params['below_sma']['enabled']: + conditions.append(dataframe['close'] < dataframe['sma']) conditions.append(dataframe['tema'] <= dataframe['blower']) if params['mfi']['enabled']: conditions.append(dataframe['mfi'] < params['mfi']['value']) @@ -108,15 +109,19 @@ def test_hyperopt(conf, pairs, mocker): space = { 'mfi': hp.choice('mfi', [ {'enabled': False}, - {'enabled': True, 'value': hp.uniform('mfi-value', 10, 50)} + {'enabled': True, 'value': hp.uniform('mfi-value', 2, 40)} ]), 'fastd': hp.choice('fastd', [ {'enabled': False}, - {'enabled': True, 'value': hp.uniform('fastd-value', 10, 50)} + {'enabled': True, 'value': hp.uniform('fastd-value', 2, 40)} ]), 'adx': hp.choice('adx', [ {'enabled': False}, - {'enabled': True, 'value': hp.uniform('adx-value', 10, 50)} + {'enabled': True, 'value': hp.uniform('adx-value', 2, 40)} + ]), + 'below_sma': hp.choice('below_sma', [ + {'enabled': False}, + {'enabled': True} ]), } From 1196983d5f60a81b845ca83c4fb204033f92018a Mon Sep 17 00:00:00 2001 From: Janne Sinivirta Date: Fri, 20 Oct 2017 10:39:36 +0300 Subject: [PATCH 06/17] change objective to emphasize shorter trades and include average profit --- freqtrade/tests/test_hyperopt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/tests/test_hyperopt.py b/freqtrade/tests/test_hyperopt.py index 011fd48e5..f1ce196af 100644 --- a/freqtrade/tests/test_hyperopt.py +++ b/freqtrade/tests/test_hyperopt.py @@ -76,7 +76,7 @@ def backtest(conf, pairs, mocker, buy_strategy): print_results(results) if len(results.index) < 800: return 100000 # return large number to "ignore" this result - return results.duration.mean() / results.profit.sum() # the smaller the better + return results.duration.mean() * results.duration.mean() / results.profit.sum() / results.profit.mean() # the smaller the better def buy_strategy_generator(params): print(params) From 3f7a583de66ae2f9d62e76124e2001efecf81c3e Mon Sep 17 00:00:00 2001 From: Janne Sinivirta Date: Fri, 20 Oct 2017 12:56:44 +0300 Subject: [PATCH 07/17] add SAR to hyperopt. add over/under sma options to hyperopt --- freqtrade/analyze.py | 3 ++- freqtrade/tests/test_hyperopt.py | 13 ++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/freqtrade/analyze.py b/freqtrade/analyze.py index e3148349f..657ffb14e 100644 --- a/freqtrade/analyze.py +++ b/freqtrade/analyze.py @@ -31,12 +31,13 @@ def populate_indicators(dataframe: DataFrame) -> DataFrame: """ Adds several different TA indicators to the given DataFrame """ + dataframe['sar'] = ta.SAR(dataframe) dataframe['adx'] = ta.ADX(dataframe) stoch = ta.STOCHF(dataframe) dataframe['fastd'] = stoch['fastd'] dataframe['fastk'] = stoch['fastk'] dataframe['blower'] = ta.BBANDS(dataframe, nbdevup=2, nbdevdn=2)['lowerband'] - dataframe['sma'] = ta.SMA(dataframe, timeperiod=30) + dataframe['sma'] = ta.SMA(dataframe, timeperiod=40) dataframe['tema'] = ta.TEMA(dataframe, timeperiod=9) dataframe['mfi'] = ta.MFI(dataframe) return dataframe diff --git a/freqtrade/tests/test_hyperopt.py b/freqtrade/tests/test_hyperopt.py index f1ce196af..b32dda382 100644 --- a/freqtrade/tests/test_hyperopt.py +++ b/freqtrade/tests/test_hyperopt.py @@ -84,6 +84,8 @@ def buy_strategy_generator(params): conditions = [] if params['below_sma']['enabled']: conditions.append(dataframe['close'] < dataframe['sma']) + if params['over_sma']['enabled']: + conditions.append(dataframe['close'] > dataframe['sma']) conditions.append(dataframe['tema'] <= dataframe['blower']) if params['mfi']['enabled']: conditions.append(dataframe['mfi'] < params['mfi']['value']) @@ -91,7 +93,8 @@ def buy_strategy_generator(params): conditions.append(dataframe['fastd'] < params['fastd']['value']) if params['adx']['enabled']: conditions.append(dataframe['adx'] > params['adx']['value']) - + if params['over_sar']['enabled']: + conditions.append(dataframe['close'] > dataframe['sar']) dataframe.loc[ reduce(lambda x, y: x & y, conditions), 'buy'] = 1 @@ -123,6 +126,14 @@ def test_hyperopt(conf, pairs, mocker): {'enabled': False}, {'enabled': True} ]), + 'over_sma': hp.choice('over_sma', [ + {'enabled': False}, + {'enabled': True} + ]), + 'over_sar': hp.choice('over_sar', [ + {'enabled': False}, + {'enabled': True} + ]), } # print(hyperopt.pyll.stochastic.sample(space)) From 0fbca8b8efbd149a790a22786a73b0c4dc8dd3be Mon Sep 17 00:00:00 2001 From: Janne Sinivirta Date: Fri, 20 Oct 2017 13:14:28 +0300 Subject: [PATCH 08/17] add CCI to hyperopt --- freqtrade/analyze.py | 1 + freqtrade/tests/test_hyperopt.py | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/freqtrade/analyze.py b/freqtrade/analyze.py index 657ffb14e..11baa8558 100644 --- a/freqtrade/analyze.py +++ b/freqtrade/analyze.py @@ -40,6 +40,7 @@ def populate_indicators(dataframe: DataFrame) -> DataFrame: dataframe['sma'] = ta.SMA(dataframe, timeperiod=40) dataframe['tema'] = ta.TEMA(dataframe, timeperiod=9) dataframe['mfi'] = ta.MFI(dataframe) + dataframe['cci'] = ta.CCI(dataframe) return dataframe diff --git a/freqtrade/tests/test_hyperopt.py b/freqtrade/tests/test_hyperopt.py index b32dda382..89531d516 100644 --- a/freqtrade/tests/test_hyperopt.py +++ b/freqtrade/tests/test_hyperopt.py @@ -93,6 +93,8 @@ def buy_strategy_generator(params): conditions.append(dataframe['fastd'] < params['fastd']['value']) if params['adx']['enabled']: conditions.append(dataframe['adx'] > params['adx']['value']) + if params['cci']['enabled']: + conditions.append(dataframe['cci'] < params['cci']['value']) if params['over_sar']['enabled']: conditions.append(dataframe['close'] > dataframe['sar']) dataframe.loc[ @@ -122,6 +124,10 @@ def test_hyperopt(conf, pairs, mocker): {'enabled': False}, {'enabled': True, 'value': hp.uniform('adx-value', 2, 40)} ]), + 'cci': hp.choice('cci', [ + {'enabled': False}, + {'enabled': True, 'value': hp.uniform('cci-value', -200, -100)} + ]), 'below_sma': hp.choice('below_sma', [ {'enabled': False}, {'enabled': True} From ce2966dd7fb3a20d7c88e7274df4126905b71109 Mon Sep 17 00:00:00 2001 From: Janne Sinivirta Date: Fri, 20 Oct 2017 18:29:38 +0300 Subject: [PATCH 09/17] add uptrend_sma to hyperopt --- freqtrade/tests/test_hyperopt.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/freqtrade/tests/test_hyperopt.py b/freqtrade/tests/test_hyperopt.py index 89531d516..d0756b690 100644 --- a/freqtrade/tests/test_hyperopt.py +++ b/freqtrade/tests/test_hyperopt.py @@ -97,6 +97,9 @@ def buy_strategy_generator(params): conditions.append(dataframe['cci'] < params['cci']['value']) if params['over_sar']['enabled']: conditions.append(dataframe['close'] > dataframe['sar']) + if params['uptrend_sma']['enabled']: + prevsma = dataframe['sma'].shift(1) + conditions.append(dataframe['sma'] > prevsma) dataframe.loc[ reduce(lambda x, y: x & y, conditions), 'buy'] = 1 @@ -140,6 +143,10 @@ def test_hyperopt(conf, pairs, mocker): {'enabled': False}, {'enabled': True} ]), + 'uptrend_sma': hp.choice('uptrend_sma', [ + {'enabled': False}, + {'enabled': True} + ]), } # print(hyperopt.pyll.stochastic.sample(space)) From 146c254c0fe6a6297561c165736e149af88fb9b4 Mon Sep 17 00:00:00 2001 From: Janne Sinivirta Date: Sat, 21 Oct 2017 10:26:38 +0300 Subject: [PATCH 10/17] start adding other triggers than just the lower BBands --- freqtrade/tests/test_hyperopt.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/freqtrade/tests/test_hyperopt.py b/freqtrade/tests/test_hyperopt.py index d0756b690..ad6c1d619 100644 --- a/freqtrade/tests/test_hyperopt.py +++ b/freqtrade/tests/test_hyperopt.py @@ -82,11 +82,11 @@ def buy_strategy_generator(params): print(params) def populate_buy_trend(dataframe: DataFrame) -> DataFrame: conditions = [] + # GUARDS AND TRENDS if params['below_sma']['enabled']: conditions.append(dataframe['close'] < dataframe['sma']) if params['over_sma']['enabled']: conditions.append(dataframe['close'] > dataframe['sma']) - conditions.append(dataframe['tema'] <= dataframe['blower']) if params['mfi']['enabled']: conditions.append(dataframe['mfi'] < params['mfi']['value']) if params['fastd']['enabled']: @@ -100,6 +100,15 @@ def buy_strategy_generator(params): if params['uptrend_sma']['enabled']: prevsma = dataframe['sma'].shift(1) conditions.append(dataframe['sma'] > prevsma) + + prev_fastd = dataframe['fastd'].shift(1) + # TRIGGERS + triggers = { + 'lower_bb': dataframe['tema'] <= dataframe['blower'], + 'faststoch10': (dataframe['fastd'] >= 10) & (prev_fastd < 10), + } + conditions.append(triggers.get(params['trigger']['type'])) + dataframe.loc[ reduce(lambda x, y: x & y, conditions), 'buy'] = 1 @@ -147,6 +156,10 @@ def test_hyperopt(conf, pairs, mocker): {'enabled': False}, {'enabled': True} ]), + 'trigger': hp.choice('trigger', [ + {'type': 'lower_bb'}, + {'type': 'faststoch10'} + ]), } # print(hyperopt.pyll.stochastic.sample(space)) From f79b44eefe065f957852dda9e4e14d0062216421 Mon Sep 17 00:00:00 2001 From: Janne Sinivirta Date: Sat, 21 Oct 2017 10:28:02 +0300 Subject: [PATCH 11/17] adjust ROI map for shorter trades --- freqtrade/tests/test_hyperopt.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/freqtrade/tests/test_hyperopt.py b/freqtrade/tests/test_hyperopt.py index ad6c1d619..9576a2173 100644 --- a/freqtrade/tests/test_hyperopt.py +++ b/freqtrade/tests/test_hyperopt.py @@ -35,10 +35,10 @@ def pairs(): def conf(): return { "minimal_roi": { - "50": 0.0, - "40": 0.01, - "30": 0.02, - "0": 0.045 + "40": 0.0, + "30": 0.01, + "20": 0.02, + "0": 0.04 }, "stoploss": -0.40 } From 17b984a7cd108ec41e96ac5893074e97fd11a05f Mon Sep 17 00:00:00 2001 From: Janne Sinivirta Date: Sat, 21 Oct 2017 10:28:43 +0300 Subject: [PATCH 12/17] adjust objective function to emphasize trade lenghts more --- freqtrade/tests/test_hyperopt.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freqtrade/tests/test_hyperopt.py b/freqtrade/tests/test_hyperopt.py index 9576a2173..245481b93 100644 --- a/freqtrade/tests/test_hyperopt.py +++ b/freqtrade/tests/test_hyperopt.py @@ -74,9 +74,9 @@ def backtest(conf, pairs, mocker, buy_strategy): results = DataFrame.from_records(trades, columns=labels) print_results(results) - if len(results.index) < 800: + if len(results.index) < 800: # require at least 800 trades return 100000 # return large number to "ignore" this result - return results.duration.mean() * results.duration.mean() / results.profit.sum() / results.profit.mean() # the smaller the better + return results.duration.mean() ** 3 / results.profit.sum() / results.profit.mean() # the smaller the better def buy_strategy_generator(params): print(params) From 913488910cadb16b49ebd41be68f5eea252cffbe Mon Sep 17 00:00:00 2001 From: Janne Sinivirta Date: Sat, 21 Oct 2017 10:29:05 +0300 Subject: [PATCH 13/17] bump minimum evaluations to 40 rounds --- freqtrade/tests/test_hyperopt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/tests/test_hyperopt.py b/freqtrade/tests/test_hyperopt.py index 245481b93..6cdaa9045 100644 --- a/freqtrade/tests/test_hyperopt.py +++ b/freqtrade/tests/test_hyperopt.py @@ -163,4 +163,4 @@ def test_hyperopt(conf, pairs, mocker): } # print(hyperopt.pyll.stochastic.sample(space)) - print('Best parameters {}'.format(fmin(fn=optimizer, space=space, algo=tpe.suggest, max_evals=10))) + print('Best parameters {}'.format(fmin(fn=optimizer, space=space, algo=tpe.suggest, max_evals=40))) From 57acf85b42027203877e6446dd930a35746cce7f Mon Sep 17 00:00:00 2001 From: Janne Sinivirta Date: Sun, 22 Oct 2017 17:11:01 +0300 Subject: [PATCH 14/17] try a different objective function --- freqtrade/tests/test_hyperopt.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/freqtrade/tests/test_hyperopt.py b/freqtrade/tests/test_hyperopt.py index 6cdaa9045..285309db5 100644 --- a/freqtrade/tests/test_hyperopt.py +++ b/freqtrade/tests/test_hyperopt.py @@ -74,9 +74,12 @@ def backtest(conf, pairs, mocker, buy_strategy): results = DataFrame.from_records(trades, columns=labels) print_results(results) - if len(results.index) < 800: # require at least 800 trades - return 100000 # return large number to "ignore" this result - return results.duration.mean() ** 3 / results.profit.sum() / results.profit.mean() # the smaller the better + + # set the value below to suit your number concurrent trades so its realistic to 20days of data + TARGET_TRADES = 1200 + if results.profit.sum() == 0 or results.profit.mean() == 0: + return 49999999999 # avoid division by zero, return huge value to discard result + return abs(len(results.index) - 1200.1) / (results.profit.sum() ** 2) * results.duration.mean() # the smaller the better def buy_strategy_generator(params): print(params) From 37004e331a21d6b1e1e7533d531eee27222439e5 Mon Sep 17 00:00:00 2001 From: Janne Sinivirta Date: Sun, 22 Oct 2017 17:14:55 +0300 Subject: [PATCH 15/17] remove unused import and commented out code --- freqtrade/tests/test_hyperopt.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/freqtrade/tests/test_hyperopt.py b/freqtrade/tests/test_hyperopt.py index 285309db5..486ffbece 100644 --- a/freqtrade/tests/test_hyperopt.py +++ b/freqtrade/tests/test_hyperopt.py @@ -8,8 +8,6 @@ import pytest import arrow from pandas import DataFrame -import hyperopt.pyll.stochastic - from hyperopt import fmin, tpe, hp from freqtrade.analyze import analyze_ticker @@ -165,5 +163,4 @@ def test_hyperopt(conf, pairs, mocker): ]), } - # print(hyperopt.pyll.stochastic.sample(space)) print('Best parameters {}'.format(fmin(fn=optimizer, space=space, algo=tpe.suggest, max_evals=40))) From 6f5307fda7b44be6843128f0bf84c5546ff5fef4 Mon Sep 17 00:00:00 2001 From: Janne Sinivirta Date: Sun, 22 Oct 2017 17:15:57 +0300 Subject: [PATCH 16/17] use more aggressive stop loss for hyperopt --- freqtrade/tests/test_hyperopt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/tests/test_hyperopt.py b/freqtrade/tests/test_hyperopt.py index 486ffbece..167e0d9ab 100644 --- a/freqtrade/tests/test_hyperopt.py +++ b/freqtrade/tests/test_hyperopt.py @@ -38,7 +38,7 @@ def conf(): "20": 0.02, "0": 0.04 }, - "stoploss": -0.40 + "stoploss": -0.05 } From f6ef8383bbcb1afee5bf1e08d28eab071f740c03 Mon Sep 17 00:00:00 2001 From: Janne Sinivirta Date: Sun, 22 Oct 2017 21:50:07 +0300 Subject: [PATCH 17/17] remove filtering from analyze that is super slow and not really needed --- freqtrade/analyze.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/analyze.py b/freqtrade/analyze.py index 11baa8558..310754754 100644 --- a/freqtrade/analyze.py +++ b/freqtrade/analyze.py @@ -24,7 +24,7 @@ def parse_ticker_dataframe(ticker: list, minimum_date: arrow.Arrow) -> DataFrame .drop('BV', 1) \ .rename(columns={'C':'close', 'V':'volume', 'O':'open', 'H':'high', 'L':'low', 'T':'date'}) \ .sort_values('date') - return df[df['date'].map(arrow.get) > minimum_date] + return df def populate_indicators(dataframe: DataFrame) -> DataFrame: