feat: calculate complete drawdown metrics from wallet (incl. underwater)
This commit is contained in:
@@ -68,9 +68,16 @@ def generate_wallet_stats(wallet_df: DataFrame, stake_currency: str) -> dict[str
|
|||||||
calmar = calculate_calmar_from_balance(wallet)
|
calmar = calculate_calmar_from_balance(wallet)
|
||||||
try:
|
try:
|
||||||
drawdown = calculate_max_drawdown_from_balance(wallet)
|
drawdown = calculate_max_drawdown_from_balance(wallet)
|
||||||
|
# max_relative_drawdown = Underwater
|
||||||
|
drawdown_duration = drawdown.low_date - drawdown.high_date
|
||||||
|
|
||||||
except ValueError:
|
except ValueError:
|
||||||
drawdown = None
|
drawdown = None
|
||||||
|
drawdown_duration = timedelta()
|
||||||
|
try:
|
||||||
|
underwater = calculate_max_drawdown_from_balance(wallet, relative=True)
|
||||||
|
except ValueError:
|
||||||
|
underwater = None
|
||||||
return {
|
return {
|
||||||
"start_balance": start_balance,
|
"start_balance": start_balance,
|
||||||
"end_balance": end_balance,
|
"end_balance": end_balance,
|
||||||
@@ -79,7 +86,13 @@ def generate_wallet_stats(wallet_df: DataFrame, stake_currency: str) -> dict[str
|
|||||||
"sharpe": sharpe,
|
"sharpe": sharpe,
|
||||||
"sortino": sortino,
|
"sortino": sortino,
|
||||||
"calmar": calmar,
|
"calmar": calmar,
|
||||||
|
"low_date": low_date.strftime(DATETIME_PRINT_FORMAT),
|
||||||
|
"low_ts": int(low_date.timestamp() * 1000),
|
||||||
|
"high_date": high_date.strftime(DATETIME_PRINT_FORMAT),
|
||||||
|
"high_ts": int(high_date.timestamp() * 1000),
|
||||||
|
# Drawdown metrics
|
||||||
"max_drawdown_account": drawdown.relative_account_drawdown if drawdown else 0.0,
|
"max_drawdown_account": drawdown.relative_account_drawdown if drawdown else 0.0,
|
||||||
|
"max_relative_drawdown": underwater.relative_account_drawdown,
|
||||||
"max_drawdown_abs": drawdown.drawdown_abs if drawdown else 0.0,
|
"max_drawdown_abs": drawdown.drawdown_abs if drawdown else 0.0,
|
||||||
"drawdown_start": (
|
"drawdown_start": (
|
||||||
drawdown.high_date.strftime(DATETIME_PRINT_FORMAT)
|
drawdown.high_date.strftime(DATETIME_PRINT_FORMAT)
|
||||||
@@ -101,10 +114,10 @@ def generate_wallet_stats(wallet_df: DataFrame, stake_currency: str) -> dict[str
|
|||||||
if drawdown and drawdown.low_date is not None
|
if drawdown and drawdown.low_date is not None
|
||||||
else None
|
else None
|
||||||
),
|
),
|
||||||
"low_date": low_date.strftime(DATETIME_PRINT_FORMAT),
|
"drawdown_duration": drawdown_duration,
|
||||||
"low_ts": int(low_date.timestamp() * 1000),
|
"drawdown_duration_s": drawdown_duration.total_seconds(),
|
||||||
"high_date": high_date.strftime(DATETIME_PRINT_FORMAT),
|
"max_drawdown_low": drawdown.low_value,
|
||||||
"high_ts": int(high_date.timestamp() * 1000),
|
"max_drawdown_high": drawdown.high_value,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user