diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 578b7b18d..d02691886 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -73,7 +73,6 @@ class Backtesting(object): :return: pretty printed table with tabulate as str """ stake_currency = self.config.get('stake_currency') - ticker_interval = self.ticker_interval floatfmt = ('s', 'd', '.2f', '.8f', '.1f') tabular_data = [] @@ -86,7 +85,7 @@ class Backtesting(object): len(result.index), result.profit_percent.mean() * 100.0, result.profit_BTC.sum(), - result.duration.mean() * ticker_interval, + result.duration.mean(), len(result[result.profit_BTC > 0]), len(result[result.profit_BTC < 0]) ]) @@ -97,7 +96,7 @@ class Backtesting(object): len(results.index), results.profit_percent.mean() * 100.0, results.profit_BTC.sum(), - results.duration.mean() * ticker_interval, + result.duration.mean(), len(results[results.profit_BTC > 0]), len(results[results.profit_BTC < 0]) ]) @@ -108,27 +107,27 @@ class Backtesting(object): max_open_trades = args.get('max_open_trades', 0) trade = Trade( open_rate=row.close, - open_date=row.date, + open_date=row.Index, stake_amount=stake_amount, amount=stake_amount / row.open, fee=exchange.get_fee() ) # calculate win/lose forwards from buy point - sell_subset = ticker[ticker.date > row.date][['close', 'date', 'sell']] + sell_subset = ticker[ticker.index > row.Index][['close', 'sell']] for row2 in sell_subset.itertuples(index=True): if max_open_trades > 0: # Increase trade_count_lock for every iteration - trade_count_lock[row2.date] = trade_count_lock.get(row2.date, 0) + 1 + trade_count_lock[row2.Index] = trade_count_lock.get(row2.Index, 0) + 1 # Buy is on is in the buy_subset there is a row that matches the date # of the sell event - buy_signal = not buy_subset[buy_subset.date == row2.date].empty + buy_signal = (buy_subset.index == row2.Index).any() if( self.analyze.should_sell( trade=trade, rate=row2.close, - date=row2.date, + date=row2.Index, buy=buy_signal, sell=row2.sell ) @@ -139,9 +138,9 @@ class Backtesting(object): pair, trade.calc_profit_percent(rate=row2.close), trade.calc_profit(rate=row2.close), - row2.Index - row.Index + (row2.Index - row.Index).seconds // 60 ),\ - row2.date + row2.Index return None def backtest(self, args) -> DataFrame: @@ -174,22 +173,24 @@ class Backtesting(object): ticker = self.populate_sell_trend( self.populate_buy_trend(pair_data) ) + if 'date' in ticker: + ticker.set_index('date', inplace=True) # for each buy point lock_pair_until = None - headers = ['buy', 'open', 'close', 'date', 'sell'] + headers = ['buy', 'open', 'close', 'sell'] buy_subset = ticker[(ticker.buy == 1) & (ticker.sell == 0)][headers] for row in buy_subset.itertuples(index=True): if realistic: - if lock_pair_until is not None and row.date <= lock_pair_until: + if lock_pair_until is not None and row.Index <= lock_pair_until: continue if max_open_trades > 0: # Check if max_open_trades has already been reached for the given date - if not trade_count_lock.get(row.date, 0) < max_open_trades: + if not trade_count_lock.get(row.Index, 0) < max_open_trades: continue if max_open_trades > 0: # Increase lock - trade_count_lock[row.date] = trade_count_lock.get(row.date, 0) + 1 + trade_count_lock[row.Index] = trade_count_lock.get(row.Index, 0) + 1 ret = self._get_sell_trade_entry( pair=pair, @@ -209,8 +210,8 @@ class Backtesting(object): # record a tuple of pair, current_profit_percent, # entry-date, duration records.append((pair, trade_entry[1], - row.date.strftime('%s'), - row2.date.strftime('%s'), + row.Index.strftime('%s'), + row2.Index.strftime('%s'), row.Index, trade_entry[3])) # For now export inside backtest(), maybe change so that backtest() # returns a tuple like: (dataframe, records, logs, etc) diff --git a/freqtrade/optimize/hyperopt.py b/freqtrade/optimize/hyperopt.py index cf68c19f8..3408a63c3 100644 --- a/freqtrade/optimize/hyperopt.py +++ b/freqtrade/optimize/hyperopt.py @@ -440,7 +440,7 @@ class Hyperopt(Backtesting): total_profit = results.profit_percent.sum() trade_count = len(results.index) - trade_duration = results.duration.mean() * 5 + trade_duration = results.duration.mean() if trade_count == 0 or trade_duration > self.max_accepted_trade_duration: print('.', end='') diff --git a/freqtrade/tests/optimize/test_backtesting.py b/freqtrade/tests/optimize/test_backtesting.py index f6968d370..06133be82 100644 --- a/freqtrade/tests/optimize/test_backtesting.py +++ b/freqtrade/tests/optimize/test_backtesting.py @@ -312,9 +312,9 @@ def test_generate_text_table(): '------- ----------- -------------- ' '------------------ -------------- -------- ------\n' 'BTC_ETH 2 15.00 ' - '0.60000000 100.0 2 0\n' + '0.60000000 20.0 2 0\n' 'TOTAL 2 15.00 ' - '0.60000000 100.0 2 0' + '0.60000000 20.0 2 0' ) assert backtesting._generate_text_table(data={'BTC_ETH': {}}, results=results) == result_str