Add avgduration for winners and losers
This commit is contained in:
parent
8e0ff4bd86
commit
987188e41f
@ -224,9 +224,10 @@ The last element of the backtest report is the summary metrics table.
|
|||||||
It contains some useful key metrics about your strategy.
|
It contains some useful key metrics about your strategy.
|
||||||
|
|
||||||
```
|
```
|
||||||
============ SUMMARY METRICS =============
|
=============== SUMMARY METRICS ===============
|
||||||
| Metric | Value |
|
| Metric | Value |
|
||||||
|------------------+---------------------|
|
|-----------------------+---------------------|
|
||||||
|
|
||||||
| Total trades | 429 |
|
| Total trades | 429 |
|
||||||
| First trade | 2019-01-01 18:30:00 |
|
| First trade | 2019-01-01 18:30:00 |
|
||||||
| First trade Pair | EOS/USDT |
|
| First trade Pair | EOS/USDT |
|
||||||
@ -235,12 +236,14 @@ It contains some useful key metrics about your strategy.
|
|||||||
| Trades per day | 3.575 |
|
| Trades per day | 3.575 |
|
||||||
| Best day | 25.27% |
|
| Best day | 25.27% |
|
||||||
| Worst day | -30.67% |
|
| Worst day | -30.67% |
|
||||||
|
| Avg. Duration Winners | 4:23:00 |
|
||||||
|
| Avg. Duration Loser | 6:55:00 |
|
||||||
| | |
|
| | |
|
||||||
| Max Drawdown | 50.63% |
|
| Max Drawdown | 50.63% |
|
||||||
| Drawdown Start | 2019-02-15 14:10:00 |
|
| Drawdown Start | 2019-02-15 14:10:00 |
|
||||||
| Drawdown End | 2019-04-11 18:15:00 |
|
| Drawdown End | 2019-04-11 18:15:00 |
|
||||||
| Market change | -5.88% |
|
| Market change | -5.88% |
|
||||||
==========================================
|
===============================================
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -250,6 +253,7 @@ It contains some useful key metrics about your strategy.
|
|||||||
- `Backtesting from` / `Backtesting to`: Backtesting range (usually defined as `--timerange from-to`).
|
- `Backtesting from` / `Backtesting to`: Backtesting range (usually defined as `--timerange from-to`).
|
||||||
- `Trades per day`: Total trades / Backtest duration (this will give you information about how many trades to expect from the strategy).
|
- `Trades per day`: Total trades / Backtest duration (this will give you information about how many trades to expect from the strategy).
|
||||||
- `Best day` / `Worst day`: Best and worst day based on daily profit.
|
- `Best day` / `Worst day`: Best and worst day based on daily profit.
|
||||||
|
- `Avg. Duration Winners` / `Avg. Duration Loser`: Average durations for winning and losing trades.
|
||||||
- `Max Drawdown`: Maximum drawown experienced. a value of 50% means that from highest to subsequent lowest point, a 50% drop was experiened).
|
- `Max Drawdown`: Maximum drawown experienced. a value of 50% means that from highest to subsequent lowest point, a 50% drop was experiened).
|
||||||
- `Drawdown Start` / `Drawdown End`: From when to when was this large drawdown (can also be visualized via `plot-dataframe` subcommand).
|
- `Drawdown Start` / `Drawdown End`: From when to when was this large drawdown (can also be visualized via `plot-dataframe` subcommand).
|
||||||
- `Market change`: Change of the market during the backtest period. Calculated as average of all pairs changes from the first to the last candle using the "close" column.
|
- `Market change`: Change of the market during the backtest period. Calculated as average of all pairs changes from the first to the last candle using the "close" column.
|
||||||
|
@ -218,12 +218,19 @@ def generate_daily_stats(results: DataFrame) -> Dict[str, Any]:
|
|||||||
draw_days = sum(daily_profit == 0)
|
draw_days = sum(daily_profit == 0)
|
||||||
losing_days = sum(daily_profit < 0)
|
losing_days = sum(daily_profit < 0)
|
||||||
|
|
||||||
|
winning_trades = results.loc[results['profit_percent'] > 0]
|
||||||
|
losing_trades = results.loc[results['profit_percent'] < 0]
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'backtest_best_day': best,
|
'backtest_best_day': best,
|
||||||
'backtest_worst_day': worst,
|
'backtest_worst_day': worst,
|
||||||
'winning_days': winning_days,
|
'winning_days': winning_days,
|
||||||
'draw_days': draw_days,
|
'draw_days': draw_days,
|
||||||
'losing_days': losing_days,
|
'losing_days': losing_days,
|
||||||
|
'winner_holding_avg': (timedelta(minutes=round(winning_trades['trade_duration'].mean()))
|
||||||
|
if not winning_trades.empty else '0:00'),
|
||||||
|
'loser_holding_avg': (timedelta(minutes=round(losing_trades['trade_duration'].mean()))
|
||||||
|
if not losing_trades.empty else '0:00'),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -390,6 +397,8 @@ def text_table_add_metrics(strat_results: Dict) -> str:
|
|||||||
('Worst day', f"{round(strat_results['backtest_worst_day'] * 100, 2)}%"),
|
('Worst day', f"{round(strat_results['backtest_worst_day'] * 100, 2)}%"),
|
||||||
('Days win/draw/lose', f"{strat_results['winning_days']} / "
|
('Days win/draw/lose', f"{strat_results['winning_days']} / "
|
||||||
f"{strat_results['draw_days']} / {strat_results['losing_days']}"),
|
f"{strat_results['draw_days']} / {strat_results['losing_days']}"),
|
||||||
|
('Avg. Duration Winners', f"{strat_results['winner_holding_avg']}"),
|
||||||
|
('Avg. Duration Loser', f"{strat_results['loser_holding_avg']}"),
|
||||||
('', ''), # Empty line to improve readability
|
('', ''), # Empty line to improve readability
|
||||||
('Max Drawdown', f"{round(strat_results['max_drawdown'] * 100, 2)}%"),
|
('Max Drawdown', f"{round(strat_results['max_drawdown'] * 100, 2)}%"),
|
||||||
('Drawdown Start', strat_results['drawdown_start'].strftime(DATETIME_PRINT_FORMAT)),
|
('Drawdown Start', strat_results['drawdown_start'].strftime(DATETIME_PRINT_FORMAT)),
|
||||||
|
Loading…
Reference in New Issue
Block a user