Add analyze_trade_parallelism analysis function
This commit is contained in:
parent
dac88c6aed
commit
dd408aa5d6
@ -52,7 +52,7 @@ def load_backtest_data(filename) -> pd.DataFrame:
|
|||||||
return df
|
return df
|
||||||
|
|
||||||
|
|
||||||
def parallel_trade_analysis(results: pd.DataFrame, timeframe: str) -> pd.DataFrame:
|
def analyze_trade_parallelism(results: pd.DataFrame, timeframe: str) -> pd.DataFrame:
|
||||||
"""
|
"""
|
||||||
Find overlapping trades by expanding each trade once per period it was open
|
Find overlapping trades by expanding each trade once per period it was open
|
||||||
and then counting overlaps.
|
and then counting overlaps.
|
||||||
@ -62,7 +62,8 @@ def parallel_trade_analysis(results: pd.DataFrame, timeframe: str) -> pd.DataFra
|
|||||||
"""
|
"""
|
||||||
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)
|
||||||
dates = [pd.Series(pd.date_range(row[1].open_time, row[1].close_time, freq=f"{timeframe_min}min"))
|
dates = [pd.Series(pd.date_range(row[1].open_time, row[1].close_time,
|
||||||
|
freq=f"{timeframe_min}min"))
|
||||||
for row in results[['open_time', 'close_time']].iterrows()]
|
for row in results[['open_time', 'close_time']].iterrows()]
|
||||||
deltas = [len(x) for x in dates]
|
deltas = [len(x) for x in dates]
|
||||||
dates = pd.Series(pd.concat(dates).values, name='date')
|
dates = pd.Series(pd.concat(dates).values, name='date')
|
||||||
@ -85,7 +86,7 @@ def evaluate_result_multi(results: pd.DataFrame, timeframe: str,
|
|||||||
:param max_open_trades: parameter max_open_trades used during backtest run
|
:param max_open_trades: parameter max_open_trades used during backtest run
|
||||||
:return: dataframe with open-counts per time-period in freq
|
:return: dataframe with open-counts per time-period in freq
|
||||||
"""
|
"""
|
||||||
df_final = parallel_trade_analysis(results, timeframe)
|
df_final = analyze_trade_parallelism(results, timeframe)
|
||||||
return df_final[df_final['open_trades'] > max_open_trades]
|
return df_final[df_final['open_trades'] > max_open_trades]
|
||||||
|
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ from freqtrade.data.btanalysis import (BT_DATA_COLUMNS,
|
|||||||
create_cum_profit,
|
create_cum_profit,
|
||||||
extract_trades_of_period,
|
extract_trades_of_period,
|
||||||
load_backtest_data, load_trades,
|
load_backtest_data, load_trades,
|
||||||
load_trades_from_db)
|
load_trades_from_db, analyze_trade_parallelism)
|
||||||
from freqtrade.data.history import load_data, load_pair_history
|
from freqtrade.data.history import load_data, load_pair_history
|
||||||
from tests.test_persistence import create_mock_trades
|
from tests.test_persistence import create_mock_trades
|
||||||
|
|
||||||
@ -32,7 +32,7 @@ def test_load_backtest_data(testdatadir):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures("init_persistence")
|
@pytest.mark.usefixtures("init_persistence")
|
||||||
def test_load_trades_db(default_conf, fee, mocker):
|
def test_load_trades_from_db(default_conf, fee, mocker):
|
||||||
|
|
||||||
create_mock_trades(fee)
|
create_mock_trades(fee)
|
||||||
# remove init so it does not init again
|
# remove init so it does not init again
|
||||||
@ -84,6 +84,17 @@ def test_extract_trades_of_period(testdatadir):
|
|||||||
assert trades1.iloc[-1].close_time == Arrow(2017, 11, 14, 15, 25, 0).datetime
|
assert trades1.iloc[-1].close_time == Arrow(2017, 11, 14, 15, 25, 0).datetime
|
||||||
|
|
||||||
|
|
||||||
|
def test_analyze_trade_parallelism(default_conf, mocker, testdatadir):
|
||||||
|
filename = testdatadir / "backtest-result_test.json"
|
||||||
|
bt_data = load_backtest_data(filename)
|
||||||
|
|
||||||
|
res = analyze_trade_parallelism(bt_data, "5m")
|
||||||
|
assert isinstance(res, DataFrame)
|
||||||
|
assert 'open_trades' in res.columns
|
||||||
|
assert res['open_trades'].max() == 3
|
||||||
|
assert res['open_trades'].min() == 0
|
||||||
|
|
||||||
|
|
||||||
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