Add explicit test for expand_trades_over_period

This commit is contained in:
Matthias 2021-10-02 16:11:17 +02:00
parent e2356c856d
commit 20ad18ad23
2 changed files with 56 additions and 4 deletions

View File

@ -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]

View File

@ -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())