test_backtest.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. 80.0,
  6. 80.0,
  7. 80.0,
  8. 80.0,
  9. 80.0,
  10. 80.0,
  11. 80.0,
  12. 80.0,
  13. 80.0,
  14. 80.0,
  15. 80.0,
  16. 80.55555555555556,
  17. 81.11111111111111,
  18. 81.66666666666667,
  19. 82.22222222222223,
  20. 82.77777777777777,
  21. 83.33333333333333,
  22. 83.88888888888889,
  23. 84.44444444444444,
  24. 85.0,
  25. 85.0,
  26. 84.44444444444444,
  27. 83.88888888888889,
  28. 83.33333333333333,
  29. 82.77777777777777,
  30. 82.22222222222223,
  31. 81.66666666666667,
  32. 81.11111111111111,
  33. 80.55555555555556,
  34. 80.0,
  35. 80.0,
  36. 80.55555555555556,
  37. 81.11111111111111,
  38. 81.66666666666667,
  39. 82.22222222222223,
  40. 82.77777777777777,
  41. 83.33333333333333,
  42. 83.88888888888889,
  43. 84.44444444444444,
  44. 85.0,
  45. 85.0,
  46. 84.44444444444444,
  47. 83.88888888888889,
  48. 83.33333333333333,
  49. 82.77777777777777,
  50. 82.22222222222223,
  51. 81.66666666666667,
  52. 81.11111111111111,
  53. 80.55555555555556,
  54. 80.0,
  55. 80.0,
  56. 80.0,
  57. 80.0,
  58. 80.0,
  59. 80.0,
  60. 80.0,
  61. 80.0,
  62. ]
  63. opens = list(closes)
  64. opens[31] = 90.0
  65. opens[41] = 80.0
  66. opens[51] = 70.0
  67. candles = []
  68. for index, (open_price, close_price) in enumerate(zip(opens, closes)):
  69. high = max(open_price, close_price)
  70. low = min(open_price, close_price)
  71. candles.append(
  72. Candle(
  73. symbol="BTC-USDT-SWAP",
  74. ts=index,
  75. open=open_price,
  76. high=high,
  77. low=low,
  78. close=close_price,
  79. volume=1_000.0,
  80. )
  81. )
  82. return candles
  83. def test_backtest_runs_fixed_sma_crossover_series():
  84. candles = build_crossing_series()
  85. result = run_backtest(candles=candles, leverage=2)
  86. assert result.initial_equity == 10_000
  87. assert result.trade_count == 2
  88. assert result.trades[0].entry_price == candles[31].open
  89. assert result.trades[0].exit_price == candles[41].open
  90. assert result.trades[0].margin_used == 10_000
  91. assert result.trades[1].margin_used == result.trades[0].ending_equity
  92. assert result.trades[1].entry_price == candles[41].open
  93. assert result.trades[1].exit_price == candles[51].open
  94. assert result.ending_equity == result.trades[-1].ending_equity
  95. assert "total_return" in result.to_dict()
  96. assert "max_drawdown" in result.to_dict()
  97. assert result.win_rate == 0.5