test_backtest.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. from okx_codex_trader.backtest import run_backtest
  2. from okx_codex_trader.models import Candle
  3. def build_crossing_series() -> list[Candle]:
  4. closes = [
  5. 40.0,
  6. 40.0,
  7. 40.0,
  8. 40.0,
  9. 40.0,
  10. 40.0,
  11. 40.0,
  12. 40.0,
  13. 40.0,
  14. 40.0,
  15. 40.0,
  16. 40.0,
  17. 40.0,
  18. 40.0,
  19. 40.0,
  20. 40.0,
  21. 40.0,
  22. 40.0,
  23. 40.0,
  24. 50.0,
  25. 40.0,
  26. 40.0,
  27. 40.0,
  28. 40.0,
  29. 40.0,
  30. 40.0,
  31. 40.0,
  32. 40.0,
  33. 40.0,
  34. 40.0,
  35. 40.0,
  36. 40.0,
  37. 40.0,
  38. 40.0,
  39. 40.0,
  40. 40.0,
  41. 40.0,
  42. 40.0,
  43. 40.0,
  44. 50.0,
  45. 50.0,
  46. 50.0,
  47. 50.0,
  48. 50.0,
  49. 50.0,
  50. ]
  51. opens = list(closes)
  52. opens[20] = 100.0
  53. opens[30] = 90.0
  54. opens[40] = 80.0
  55. candles = []
  56. for index, (open_price, close_price) in enumerate(zip(opens, closes)):
  57. high = max(open_price, close_price)
  58. low = min(open_price, close_price)
  59. candles.append(
  60. Candle(
  61. symbol="BTC-USDT-SWAP",
  62. ts=index,
  63. open=open_price,
  64. high=high,
  65. low=low,
  66. close=close_price,
  67. volume=1_000.0,
  68. )
  69. )
  70. return candles
  71. def test_backtest_runs_fixed_sma_crossover_series():
  72. candles = build_crossing_series()
  73. result = run_backtest(candles=candles, leverage=2)
  74. assert result.initial_equity == 10_000
  75. assert result.trade_count == 2
  76. assert result.trades[0].entry_price == candles[20].open
  77. assert result.trades[0].exit_price == candles[30].open
  78. assert result.trades[0].margin_used == 10_000
  79. assert result.trades[1].margin_used == result.trades[0].ending_equity
  80. assert result.ending_equity == result.trades[-1].ending_equity
  81. assert "total_return" in result.to_dict()
  82. assert "max_drawdown" in result.to_dict()
  83. assert result.win_rate == 0.5