mirror of
https://github.com/freqtrade/freqtrade.git
synced 2026-01-20 05:50:36 +00:00
Merge branch 'develop' into optuna
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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"])
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user