Merge branch 'develop' into optuna

This commit is contained in:
Matthias
2025-05-08 19:25:33 +02:00
156 changed files with 12489 additions and 5844 deletions

View File

@@ -69,8 +69,8 @@ def _build_backtest_dataframe(data):
]
if len(data[0]) == 8:
# No short columns
data = [d + [0, 0] for d in data]
columns = columns + ["enter_tag"] if len(data[0]) == 11 else columns
data = [[*d, 0, 0] for d in data]
columns = [*columns, "enter_tag"] if len(data[0]) == 11 else columns
frame = DataFrame.from_records(data, columns=columns)
frame["date"] = frame["date"].apply(_get_frame_time_from_offset)

View File

@@ -102,7 +102,7 @@ tc3 = BTContainer(
)
# Test 4: Minus 3% / recovery +15%
# Candle Data for test 3 Candle drops 3% Closed 15% up
# Candle Data for test 3 - Candle drops 3% Closed 15% up
# Test with Stop-loss at 2% ROI 6%
# Stop-Loss Triggered 2% Loss
tc4 = BTContainer(

View File

@@ -828,6 +828,7 @@ def test_backtest_one(default_conf, mocker, testdatadir) -> None:
},
],
],
"funding_fees": [0.0, 0.0],
}
)
pd.testing.assert_frame_equal(results, expected)
@@ -991,7 +992,7 @@ def test_backtest_one_detail_futures(
timerange=timerange,
candle_type=CandleType.FUTURES,
)
backtesting.load_bt_data_detail()
backtesting._load_bt_data_detail()
processed = backtesting.strategy.advise_all_indicators(data)
min_date, max_date = get_timerange(processed)
@@ -1119,7 +1120,7 @@ def test_backtest_one_detail_futures_funding_fees(
timerange=timerange,
candle_type=CandleType.FUTURES,
)
backtesting.load_bt_data_detail()
backtesting._load_bt_data_detail()
processed = backtesting.strategy.advise_all_indicators(data)
min_date, max_date = get_timerange(processed)
@@ -2576,7 +2577,7 @@ def test_backtest_start_multi_strat_caching(
],
)
mocker.patch.multiple(
"freqtrade.data.btanalysis",
"freqtrade.data.btanalysis.bt_fileutils",
load_backtest_metadata=load_backtest_metadata,
load_backtest_stats=load_backtest_stats,
)

View File

@@ -80,6 +80,7 @@ def test_backtest_position_adjustment(default_conf, fee, mocker, testdatadir) ->
"is_short": [False, False],
"open_timestamp": [1517251200000, 1517283000000],
"close_timestamp": [1517263200000, 1517285400000],
"funding_fees": [0.0, 0.0],
}
)
results_no = results.drop(columns=["orders"])

View File

@@ -685,7 +685,7 @@ def test_print_json_spaces_all(mocker, hyperopt_conf, capsys) -> None:
'{"params":{"mfi-value":null,"sell-mfi-value":null},"minimal_roi"'
':{},"stoploss":null,"trailing_stop":null,"max_open_trades":null}'
)
assert result_str in out # noqa: E501
assert result_str in out
# Should be called for historical candle data
assert dumper.call_count == 1
assert dumper2.call_count == 1
@@ -742,7 +742,7 @@ def test_print_json_spaces_default(mocker, hyperopt_conf, capsys) -> None:
assert (
'{"params":{"mfi-value":null,"sell-mfi-value":null},"minimal_roi":{},"stoploss":null}'
in out
) # noqa: E501
)
# Should be called for historical candle data
assert dumper.call_count == 1
assert dumper2.call_count == 1

View File

@@ -153,6 +153,7 @@ def test_loss_calculation_has_limited_profit(hyperopt_conf, hyperopt_results) ->
"SharpeHyperOptLossDaily",
"MaxDrawDownHyperOptLoss",
"MaxDrawDownRelativeHyperOptLoss",
"MaxDrawDownPerPairHyperOptLoss",
"CalmarHyperOptLoss",
"ProfitDrawDownHyperOptLoss",
"MultiMetricHyperOptLoss",
@@ -165,6 +166,34 @@ def test_loss_functions_better_profits(default_conf, hyperopt_results, lossfunct
results_under = hyperopt_results.copy()
results_under["profit_abs"] = hyperopt_results["profit_abs"] / 2 - 0.2
results_under["profit_ratio"] = hyperopt_results["profit_ratio"] / 2
pair_results = [
{
"key": "ETH/USDT",
"max_drawdown_abs": 50.0,
"profit_total_abs": 100.0,
},
{
"key": "BTC/USDT",
"max_drawdown_abs": 50.0,
"profit_total_abs": 100.0,
},
]
pair_results_over = [
{
**p,
"max_drawdown_abs": p["max_drawdown_abs"] * 0.5,
"profit_total_abs": p["profit_total_abs"] * 2,
}
for p in pair_results
]
pair_results_under = [
{
**p,
"max_drawdown_abs": p["max_drawdown_abs"] * 2,
"profit_total_abs": p["profit_total_abs"] * 0.5,
}
for p in pair_results
]
default_conf.update({"hyperopt_loss": lossfunction})
hl = HyperOptLossResolver.load_hyperoptloss(default_conf)
@@ -175,7 +204,10 @@ def test_loss_functions_better_profits(default_conf, hyperopt_results, lossfunct
max_date=datetime(2019, 5, 1),
config=default_conf,
processed=None,
backtest_stats={"profit_total": hyperopt_results["profit_abs"].sum()},
backtest_stats={
"profit_total": hyperopt_results["profit_abs"].sum(),
"results_per_pair": pair_results,
},
starting_balance=default_conf["dry_run_wallet"],
)
over = hl.hyperopt_loss_function(
@@ -185,7 +217,10 @@ def test_loss_functions_better_profits(default_conf, hyperopt_results, lossfunct
max_date=datetime(2019, 5, 1),
config=default_conf,
processed=None,
backtest_stats={"profit_total": results_over["profit_abs"].sum()},
backtest_stats={
"profit_total": results_over["profit_abs"].sum(),
"results_per_pair": pair_results_over,
},
starting_balance=default_conf["dry_run_wallet"],
)
under = hl.hyperopt_loss_function(
@@ -195,7 +230,10 @@ def test_loss_functions_better_profits(default_conf, hyperopt_results, lossfunct
max_date=datetime(2019, 5, 1),
config=default_conf,
processed=None,
backtest_stats={"profit_total": results_under["profit_abs"].sum()},
backtest_stats={
"profit_total": results_under["profit_abs"].sum(),
"results_per_pair": pair_results_under,
},
starting_balance=default_conf["dry_run_wallet"],
)
assert over < correct

View File

@@ -68,11 +68,21 @@ def test_text_table_bt_results(capsys):
"profit_ratio": [0.1, 0.2, -0.05],
"profit_abs": [0.2, 0.4, -0.1],
"trade_duration": [10, 30, 20],
"close_date": [
dt_utc(2017, 11, 14, 21, 35, 00),
dt_utc(2017, 11, 14, 22, 10, 00),
dt_utc(2017, 11, 14, 22, 43, 00),
],
}
)
pair_results = generate_pair_metrics(
["ETH/BTC"], stake_currency="BTC", starting_balance=4, results=results
["ETH/BTC"],
stake_currency="BTC",
starting_balance=4,
results=results,
min_date=dt_from_ts(1510688220),
max_date=dt_from_ts(1510700340),
)
text_table_bt_results(pair_results, stake_currency="BTC", title="title")
text = capsys.readouterr().out
@@ -420,6 +430,10 @@ def test_generate_pair_metrics():
"profit_ratio": [0.1, 0.2],
"profit_abs": [0.2, 0.4],
"trade_duration": [10, 30],
"close_date": [
dt_utc(2017, 11, 14, 21, 35, 00),
dt_utc(2017, 11, 14, 22, 10, 00),
],
"wins": [2, 0],
"draws": [0, 0],
"losses": [0, 0],
@@ -427,7 +441,12 @@ def test_generate_pair_metrics():
)
pair_results = generate_pair_metrics(
["ETH/BTC"], stake_currency="BTC", starting_balance=2, results=results
["ETH/BTC"],
stake_currency="BTC",
starting_balance=2,
results=results,
min_date=dt_from_ts(1510688220),
max_date=dt_from_ts(1510700340),
)
assert isinstance(pair_results, list)
assert len(pair_results) == 2
@@ -512,6 +531,11 @@ def test_text_table_exit_reason(capsys):
"profit_ratio": [0.1, 0.2, -0.1],
"profit_abs": [0.2, 0.4, -0.2],
"trade_duration": [10, 30, 10],
"close_date": [
dt_utc(2017, 11, 14, 21, 35, 00),
dt_utc(2017, 11, 14, 22, 10, 00),
dt_utc(2017, 11, 14, 22, 43, 00),
],
"wins": [2, 0, 0],
"draws": [0, 0, 0],
"losses": [0, 0, 1],
@@ -520,7 +544,12 @@ def test_text_table_exit_reason(capsys):
)
exit_reason_stats = generate_tag_metrics(
"exit_reason", starting_balance=22, results=results, skip_nan=False
"exit_reason",
starting_balance=22,
results=results,
min_date=dt_from_ts(1510688220),
max_date=dt_from_ts(1510700340),
skip_nan=False,
)
text_table_tags("exit_tag", exit_reason_stats, "BTC")
text = capsys.readouterr().out
@@ -550,6 +579,11 @@ def test_generate_sell_reason_stats():
"profit_ratio": [0.1, 0.2, -0.1],
"profit_abs": [0.2, 0.4, -0.2],
"trade_duration": [10, 30, 10],
"close_date": [
dt_utc(2017, 11, 14, 21, 35, 00),
dt_utc(2017, 11, 14, 22, 10, 00),
dt_utc(2017, 11, 14, 22, 43, 00),
],
"wins": [2, 0, 0],
"draws": [0, 0, 0],
"losses": [0, 0, 1],
@@ -558,7 +592,12 @@ def test_generate_sell_reason_stats():
)
exit_reason_stats = generate_tag_metrics(
"exit_reason", starting_balance=22, results=results, skip_nan=False
"exit_reason",
starting_balance=22,
results=results,
min_date=dt_from_ts(1510688220),
max_date=dt_from_ts(1510700340),
skip_nan=False,
)
roi_result = exit_reason_stats[0]
assert roi_result["key"] == "roi"