From 20ad18ad236f39d25a1ee35f382e9429cfabb16a Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 2 Oct 2021 16:11:17 +0200 Subject: [PATCH] Add explicit test for expand_trades_over_period --- freqtrade/data/btanalysis.py | 4 ++- tests/data/test_btanalysis.py | 56 +++++++++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/freqtrade/data/btanalysis.py b/freqtrade/data/btanalysis.py index 8ba61aeed..931f182e1 100644 --- a/freqtrade/data/btanalysis.py +++ b/freqtrade/data/btanalysis.py @@ -9,6 +9,7 @@ import numpy as np import pandas as pd from freqtrade.constants import LAST_BT_RESULT_FN +from freqtrade.exchange import timeframe_to_prev_date from freqtrade.misc import json_load from freqtrade.persistence import LocalTrade, Trade, init_db @@ -202,7 +203,8 @@ def expand_trades_over_period(results: pd.DataFrame, timeframe: str, from freqtrade.exchange import timeframe_to_minutes timeframe_min = timeframe_to_minutes(timeframe) # compute how long each trade was left outstanding as date indexes - dates = [pd.Series(pd.date_range(row[1]['open_date'], row[1]['close_date'], + dates = [pd.Series(pd.date_range(timeframe_to_prev_date(timeframe, row[1]['open_date']), + timeframe_to_prev_date(timeframe, row[1]['close_date']), freq=f"{timeframe_min}min")) for row in results[['open_date', 'close_date']].iterrows()] deltas = [len(x) for x in dates] diff --git a/tests/data/test_btanalysis.py b/tests/data/test_btanalysis.py index 1dcd04a80..d7f99d608 100644 --- a/tests/data/test_btanalysis.py +++ b/tests/data/test_btanalysis.py @@ -1,3 +1,4 @@ +from datetime import datetime from math import isclose from pathlib import Path from unittest.mock import MagicMock @@ -12,9 +13,9 @@ from freqtrade.data.btanalysis import (BT_DATA_COLUMNS, BT_DATA_COLUMNS_MID, BT_ analyze_trade_parallelism, calculate_csum, calculate_market_change, calculate_max_drawdown, combine_dataframes_with_mean, create_cum_profit, - extract_trades_of_period, get_latest_backtest_filename, - get_latest_hyperopt_file, load_backtest_data, load_trades, - load_trades_from_db) + expand_trades_over_period, extract_trades_of_period, + get_latest_backtest_filename, get_latest_hyperopt_file, + load_backtest_data, load_trades, load_trades_from_db) from freqtrade.data.history import load_data, load_pair_history from tests.conftest import create_mock_trades from tests.conftest_trades import MOCK_TRADE_COUNT @@ -178,6 +179,55 @@ def test_analyze_trade_parallelism(default_conf, mocker, testdatadir): assert res['open_trades'].min() == 0 +def test_expand_trades_over_period(testdatadir): + filename = testdatadir / "backtest-result_test.json" + bt_data = load_backtest_data(filename) + + res = expand_trades_over_period(bt_data, "5m") + assert isinstance(res, DataFrame) + assert res['pair'].str.contains('ADA/BTC').sum() == 1970 + pair_res = res[res['pair'] == 'ADA/BTC'] + assert all(pair_res.iloc[[0]].index == '2018-01-10 07:15:00') + assert all(pair_res.iloc[[1]].index == '2018-01-10 07:20:00') + + res = expand_trades_over_period(bt_data, "15m") + # Expanding over 15m should produce fewer rows. + assert isinstance(res, DataFrame) + assert res['pair'].str.contains('ADA/BTC').sum() == 672 + pair_res = res[res['pair'] == 'ADA/BTC'] + assert all(pair_res.iloc[[0]].index == '2018-01-10 07:15:00') + assert all(pair_res.iloc[[1]].index == '2018-01-10 07:30:00') + + trade_results = DataFrame( + { + 'pair': ['ETH/USDT', 'ETH/USDT', 'ETH/USDT', 'ETH/USDT'], + 'profit_ratio': [-0.1, 0.2, -0.1, 0.3], + 'profit_abs': [-0.2, 0.4, -0.2, 0.6], + 'trade_duration': [10, 30, 10, 10], + 'amount': [0.1, 0.1, 0.1, 0.1], + 'open_date': + [ + datetime(2019, 1, 1, 9, 15, 0), + datetime(2019, 1, 2, 8, 55, 0), + datetime(2019, 1, 3, 9, 15, 0), + datetime(2019, 1, 4, 9, 15, 0), + ], + 'close_date': + [ + datetime(2019, 1, 1, 9, 25, 0), + datetime(2019, 1, 2, 9, 25, 0), + datetime(2019, 1, 3, 9, 25, 0), + datetime(2019, 1, 4, 9, 25, 0), + ], + } + ) + + res = expand_trades_over_period(trade_results, "5m") + assert res['pair'].str.contains('ETH/USDT').sum() == 16 + assert all(res.iloc[[0]].index == '2019-01-01 09:15:00') + assert all(res.iloc[[1]].index == '2019-01-01 09:20:00') + + def test_load_trades(default_conf, mocker): db_mock = mocker.patch("freqtrade.data.btanalysis.load_trades_from_db", MagicMock()) bt_mock = mocker.patch("freqtrade.data.btanalysis.load_backtest_data", MagicMock())