Merge pull request #3701 from freqtrade/fix/optimize_reports
Fix bug in backtesting
This commit is contained in:
commit
c4e597977c
@ -185,6 +185,16 @@ def generate_edge_table(results: dict) -> str:
|
|||||||
|
|
||||||
|
|
||||||
def generate_daily_stats(results: DataFrame) -> Dict[str, Any]:
|
def generate_daily_stats(results: DataFrame) -> Dict[str, Any]:
|
||||||
|
if len(results) == 0:
|
||||||
|
return {
|
||||||
|
'backtest_best_day': 0,
|
||||||
|
'backtest_worst_day': 0,
|
||||||
|
'winning_days': 0,
|
||||||
|
'draw_days': 0,
|
||||||
|
'losing_days': 0,
|
||||||
|
'winner_holding_avg': timedelta(),
|
||||||
|
'loser_holding_avg': timedelta(),
|
||||||
|
}
|
||||||
daily_profit = results.resample('1d', on='close_date')['profit_percent'].sum()
|
daily_profit = results.resample('1d', on='close_date')['profit_percent'].sum()
|
||||||
worst = min(daily_profit)
|
worst = min(daily_profit)
|
||||||
best = max(daily_profit)
|
best = max(daily_profit)
|
||||||
@ -249,7 +259,7 @@ def generate_backtest_stats(config: Dict, btdata: Dict[str, DataFrame],
|
|||||||
'sell_reason_summary': sell_reason_stats,
|
'sell_reason_summary': sell_reason_stats,
|
||||||
'left_open_trades': left_open_results,
|
'left_open_trades': left_open_results,
|
||||||
'total_trades': len(results),
|
'total_trades': len(results),
|
||||||
'profit_mean': results['profit_percent'].mean(),
|
'profit_mean': results['profit_percent'].mean() if len(results) > 0 else 0,
|
||||||
'profit_total': results['profit_percent'].sum(),
|
'profit_total': results['profit_percent'].sum(),
|
||||||
'profit_total_abs': results['profit_abs'].sum(),
|
'profit_total_abs': results['profit_abs'].sum(),
|
||||||
'backtest_start': min_date.datetime,
|
'backtest_start': min_date.datetime,
|
||||||
@ -258,7 +268,7 @@ def generate_backtest_stats(config: Dict, btdata: Dict[str, DataFrame],
|
|||||||
'backtest_end_ts': max_date.timestamp * 1000,
|
'backtest_end_ts': max_date.timestamp * 1000,
|
||||||
'backtest_days': backtest_days,
|
'backtest_days': backtest_days,
|
||||||
|
|
||||||
'trades_per_day': round(len(results) / backtest_days, 2) if backtest_days > 0 else None,
|
'trades_per_day': round(len(results) / backtest_days, 2) if backtest_days > 0 else 0,
|
||||||
'market_change': market_change,
|
'market_change': market_change,
|
||||||
'pairlist': list(btdata.keys()),
|
'pairlist': list(btdata.keys()),
|
||||||
'stake_amount': config['stake_amount'],
|
'stake_amount': config['stake_amount'],
|
||||||
|
@ -204,6 +204,14 @@ def test_generate_daily_stats(testdatadir):
|
|||||||
assert res['winner_holding_avg'] == timedelta(seconds=1440)
|
assert res['winner_holding_avg'] == timedelta(seconds=1440)
|
||||||
assert res['loser_holding_avg'] == timedelta(days=1, seconds=21420)
|
assert res['loser_holding_avg'] == timedelta(days=1, seconds=21420)
|
||||||
|
|
||||||
|
# Select empty dataframe!
|
||||||
|
res = generate_daily_stats(bt_data.loc[bt_data['open_date'] == '2000-01-01', :])
|
||||||
|
assert isinstance(res, dict)
|
||||||
|
assert round(res['backtest_best_day'], 4) == 0.0
|
||||||
|
assert res['winning_days'] == 0
|
||||||
|
assert res['draw_days'] == 0
|
||||||
|
assert res['losing_days'] == 0
|
||||||
|
|
||||||
|
|
||||||
def test_text_table_sell_reason(default_conf):
|
def test_text_table_sell_reason(default_conf):
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user