Pārlūkot izejas kodu

fix: include tail mtm in drawdown

lxy 1 mēnesi atpakaļ
vecāks
revīzija
91a6c2a477
2 mainītis faili ar 22 papildinājumiem un 0 dzēšanām
  1. 5 0
      okx_codex_trader/backtest.py
  2. 17 0
      tests/test_backtest.py

+ 5 - 0
okx_codex_trader/backtest.py

@@ -93,6 +93,11 @@ def run_backtest(candles: list[Candle], leverage: int) -> BacktestResult:
         else:
         else:
             price_return = (entry_price - candles[-1].close) / entry_price
             price_return = (entry_price - candles[-1].close) / entry_price
         ending_equity = margin_used + (margin_used * leverage * price_return)
         ending_equity = margin_used + (margin_used * leverage * price_return)
+        if ending_equity > peak_equity:
+            peak_equity = ending_equity
+        drawdown = (peak_equity - ending_equity) / peak_equity
+        if drawdown > max_drawdown:
+            max_drawdown = drawdown
 
 
     return BacktestResult(
     return BacktestResult(
         initial_equity=initial_equity,
         initial_equity=initial_equity,

+ 17 - 0
tests/test_backtest.py

@@ -79,6 +79,11 @@ def build_open_position_series() -> list[Candle]:
     return candles
     return candles
 
 
 
 
+def build_tail_drawdown_series() -> list[Candle]:
+    candles = build_crossing_series()[:22]
+    return candles
+
+
 def build_drawdown_series() -> list[Candle]:
 def build_drawdown_series() -> list[Candle]:
     closes = [60.0] * 20 + [120.0, 75.0, 100.0] + [75.0] * 14
     closes = [60.0] * 20 + [120.0, 75.0, 100.0] + [75.0] * 14
     opens = list(closes)
     opens = list(closes)
@@ -162,3 +167,15 @@ def test_backtest_tracks_open_trade_drawdown_from_candle_close():
     assert result.trades[0].entry_price == candles[21].open
     assert result.trades[0].entry_price == candles[21].open
     assert result.trades[0].exit_price == candles[36].open
     assert result.trades[0].exit_price == candles[36].open
     assert result.max_drawdown == 0.5
     assert result.max_drawdown == 0.5
+
+
+def test_backtest_tracks_tail_drawdown_for_final_open_position():
+    candles = build_tail_drawdown_series()
+
+    result = run_backtest(candles=candles, leverage=2)
+
+    assert result.trade_count == 0
+    assert result.trades == []
+    assert result.ending_equity == 0.0
+    assert result.total_return == -1.0
+    assert result.max_drawdown == 1.0