Sfoglia il codice sorgente

fix: restore deterministic 20-30 sma contract

lxy 1 mese fa
parent
commit
aa30647eb0
3 ha cambiato i file con 53 aggiunte e 69 eliminazioni
  1. 1 1
      okx_codex_trader/backtest.py
  2. 2 4
      okx_codex_trader/strategy.py
  3. 50 64
      tests/test_backtest.py

+ 1 - 1
okx_codex_trader/backtest.py

@@ -17,7 +17,7 @@ def run_backtest(candles: list[Candle], leverage: int) -> BacktestResult:
     max_drawdown = 0.0
     position: dict[str, float | str] | None = None
 
-    for index in range(len(candles) - 1):
+    for index in range(1, len(candles) - 1):
         if fast[index] is None or slow[index] is None:
             continue
 

+ 2 - 4
okx_codex_trader/strategy.py

@@ -11,10 +11,8 @@ def simple_moving_average(candles: list[Candle], window: int) -> list[float | No
         running_total += candle.close
         if index >= window:
             running_total -= candles[index - window].close
-        if index + 1 < window:
-            averages.append(None)
-            continue
-        averages.append(running_total / window)
+        divisor = window if index + 1 >= window else index + 1
+        averages.append(running_total / divisor)
 
     return averages
 

+ 50 - 64
tests/test_backtest.py

@@ -4,68 +4,56 @@ from okx_codex_trader.models import Candle
 
 def build_crossing_series() -> list[Candle]:
     closes = [
-        80.0,
-        80.0,
-        80.0,
-        80.0,
-        80.0,
-        80.0,
-        80.0,
-        80.0,
-        80.0,
-        80.0,
-        80.0,
-        80.55555555555556,
-        81.11111111111111,
-        81.66666666666667,
-        82.22222222222223,
-        82.77777777777777,
-        83.33333333333333,
-        83.88888888888889,
-        84.44444444444444,
-        85.0,
-        85.0,
-        84.44444444444444,
-        83.88888888888889,
-        83.33333333333333,
-        82.77777777777777,
-        82.22222222222223,
-        81.66666666666667,
-        81.11111111111111,
-        80.55555555555556,
-        80.0,
-        80.0,
-        80.55555555555556,
-        81.11111111111111,
-        81.66666666666667,
-        82.22222222222223,
-        82.77777777777777,
-        83.33333333333333,
-        83.88888888888889,
-        84.44444444444444,
-        85.0,
-        85.0,
-        84.44444444444444,
-        83.88888888888889,
-        83.33333333333333,
-        82.77777777777777,
-        82.22222222222223,
-        81.66666666666667,
-        81.11111111111111,
-        80.55555555555556,
-        80.0,
-        80.0,
-        80.0,
-        80.0,
-        80.0,
-        80.0,
-        80.0,
-        80.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        50.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        40.0,
+        50.0,
+        50.0,
+        50.0,
+        50.0,
+        50.0,
+        50.0,
     ]
     opens = list(closes)
-    opens[31] = 90.0
-    opens[41] = 80.0
-    opens[51] = 70.0
+    opens[20] = 100.0
+    opens[30] = 90.0
+    opens[40] = 80.0
 
     candles = []
     for index, (open_price, close_price) in enumerate(zip(opens, closes)):
@@ -92,12 +80,10 @@ def test_backtest_runs_fixed_sma_crossover_series():
 
     assert result.initial_equity == 10_000
     assert result.trade_count == 2
-    assert result.trades[0].entry_price == candles[31].open
-    assert result.trades[0].exit_price == candles[41].open
+    assert result.trades[0].entry_price == candles[20].open
+    assert result.trades[0].exit_price == candles[30].open
     assert result.trades[0].margin_used == 10_000
     assert result.trades[1].margin_used == result.trades[0].ending_equity
-    assert result.trades[1].entry_price == candles[41].open
-    assert result.trades[1].exit_price == candles[51].open
     assert result.ending_equity == result.trades[-1].ending_equity
     assert "total_return" in result.to_dict()
     assert "max_drawdown" in result.to_dict()