Add explicit test for expand_trades_over_period
This commit is contained in:
parent
e2356c856d
commit
20ad18ad23
@ -9,6 +9,7 @@ import numpy as np
|
|||||||
import pandas as pd
|
import pandas as pd
|
||||||
|
|
||||||
from freqtrade.constants import LAST_BT_RESULT_FN
|
from freqtrade.constants import LAST_BT_RESULT_FN
|
||||||
|
from freqtrade.exchange import timeframe_to_prev_date
|
||||||
from freqtrade.misc import json_load
|
from freqtrade.misc import json_load
|
||||||
from freqtrade.persistence import LocalTrade, Trade, init_db
|
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
|
from freqtrade.exchange import timeframe_to_minutes
|
||||||
timeframe_min = timeframe_to_minutes(timeframe)
|
timeframe_min = timeframe_to_minutes(timeframe)
|
||||||
# compute how long each trade was left outstanding as date indexes
|
# 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"))
|
freq=f"{timeframe_min}min"))
|
||||||
for row in results[['open_date', 'close_date']].iterrows()]
|
for row in results[['open_date', 'close_date']].iterrows()]
|
||||||
deltas = [len(x) for x in dates]
|
deltas = [len(x) for x in dates]
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
from datetime import datetime
|
||||||
from math import isclose
|
from math import isclose
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from unittest.mock import MagicMock
|
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,
|
analyze_trade_parallelism, calculate_csum,
|
||||||
calculate_market_change, calculate_max_drawdown,
|
calculate_market_change, calculate_max_drawdown,
|
||||||
combine_dataframes_with_mean, create_cum_profit,
|
combine_dataframes_with_mean, create_cum_profit,
|
||||||
extract_trades_of_period, get_latest_backtest_filename,
|
expand_trades_over_period, extract_trades_of_period,
|
||||||
get_latest_hyperopt_file, load_backtest_data, load_trades,
|
get_latest_backtest_filename, get_latest_hyperopt_file,
|
||||||
load_trades_from_db)
|
load_backtest_data, load_trades, load_trades_from_db)
|
||||||
from freqtrade.data.history import load_data, load_pair_history
|
from freqtrade.data.history import load_data, load_pair_history
|
||||||
from tests.conftest import create_mock_trades
|
from tests.conftest import create_mock_trades
|
||||||
from tests.conftest_trades import MOCK_TRADE_COUNT
|
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
|
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):
|
def test_load_trades(default_conf, mocker):
|
||||||
db_mock = mocker.patch("freqtrade.data.btanalysis.load_trades_from_db", MagicMock())
|
db_mock = mocker.patch("freqtrade.data.btanalysis.load_trades_from_db", MagicMock())
|
||||||
bt_mock = mocker.patch("freqtrade.data.btanalysis.load_backtest_data", MagicMock())
|
bt_mock = mocker.patch("freqtrade.data.btanalysis.load_backtest_data", MagicMock())
|
||||||
|
Loading…
Reference in New Issue
Block a user