rotation-risk-audit.json 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. {
  2. "audit_date": "2026-05-08",
  3. "verdict": "passed",
  4. "candidate": "trend_basket-1h-lb720-tr1440-bt2880-rb168-top2-mm0.000-bm0.000-vw336-vc0.0300-lev0.75-exp0.50-vt0.2000",
  5. "source": {
  6. "top_csv": "reports/strategy-expansion/rotation-risk-top.csv",
  7. "row": 1,
  8. "scripts_read": [
  9. "scripts/search_expansion_rotation.py",
  10. "scripts/refine_expansion_rotation_risk.py"
  11. ],
  12. "reports_read": [
  13. "reports/strategy-expansion/rotation-risk-total.csv",
  14. "reports/strategy-expansion/rotation-risk-top.csv",
  15. "reports/strategy-expansion/rotation-risk-horizons.csv",
  16. "reports/strategy-expansion/rotation-risk-monthly.csv",
  17. "reports/strategy-expansion/rotation-risk-report.md"
  18. ]
  19. },
  20. "decision_summary": "The prior trade_stats fee basis issue is fixed, regenerated reports match the repaired implementation, and the core equity curve remains free of same-row lookahead.",
  21. "checks": {
  22. "trade_stats_executed_weights": {
  23. "status": "passed",
  24. "evidence": "trade_stats computes executed = weights.shift(1).fillna(0.0), matching equity_curve."
  25. },
  26. "trade_stats_internal_vol_target_turnover": {
  27. "status": "passed",
  28. "internal_symbol_weight_turnover_accounted": 16.27442631232471,
  29. "evidence": "trade_stats subtracts turnover.loc[segment_index, symbol] * taker_fee * leverage for every active row, including volatility-target scale changes inside an active segment."
  30. },
  31. "trade_stats_close_turnover": {
  32. "status": "passed",
  33. "entry_turnover": 12.914991340355758,
  34. "internal_turnover": 16.27442631232471,
  35. "close_turnover": 9.128908313425487,
  36. "total_symbol_turnover_accounted": 38.318325966105995,
  37. "evidence": "When the row after an active segment is flat, trade_stats multiplies by the close-row turnover fee. No synthetic final liquidation is added because equity_curve also does not force final liquidation."
  38. },
  39. "generated_report_consistency": {
  40. "status": "passed",
  41. "top_rows_checked": 30,
  42. "unique_bases_checked": 10,
  43. "max_diffs": {
  44. "trades": 0,
  45. "win_rate": 0.0,
  46. "profit_factor": 8.881784197001252e-16,
  47. "total_return": 4.440892098500626e-16,
  48. "annualized_return": 8.326672684688674e-17,
  49. "max_drawdown": 9.71445146547012e-17,
  50. "calmar": 4.440892098500626e-16,
  51. "turnover_per_year": 8.881784197001252e-16
  52. },
  53. "report_file_mtimes": {
  54. "scripts/refine_expansion_rotation_risk.py": "2026-05-08 01:26:30 +0800",
  55. "reports/strategy-expansion/rotation-risk-total.csv": "2026-05-08 01:33:19 +0800",
  56. "reports/strategy-expansion/rotation-risk-top.csv": "2026-05-08 01:33:19 +0800",
  57. "reports/strategy-expansion/rotation-risk-horizons.csv": "2026-05-08 01:33:19 +0800",
  58. "reports/strategy-expansion/rotation-risk-monthly.csv": "2026-05-08 01:33:19 +0800",
  59. "reports/strategy-expansion/rotation-risk-report.md": "2026-05-08 01:33:19 +0800"
  60. }
  61. },
  62. "lookahead": {
  63. "status": "passed",
  64. "first_signal_index_utc": "2020-04-30 00:00:00+00:00",
  65. "first_executed_index_utc": "2020-04-30 01:00:00+00:00",
  66. "evidence": "Signals and volatility-target sizing are converted to returns only after equity_curve shifts weights by one row."
  67. },
  68. "return_slicing": {
  69. "status": "passed",
  70. "evidence": "Horizon returns are computed from slices of the already compounded equity series; monthly rows chain from previous month-end equity."
  71. }
  72. },
  73. "candidate_parameters": {
  74. "family": "trend_basket",
  75. "bar": "1h",
  76. "universe": "BTC-USDT-SWAP,ETH-USDT-SWAP",
  77. "lookback": 720,
  78. "trend": 1440,
  79. "btc_trend": 2880,
  80. "rebalance": 168,
  81. "top_n": 2,
  82. "min_momentum": 0.0,
  83. "btc_min_momentum": 0.0,
  84. "vol_lookback": 336,
  85. "max_vol": 0.03,
  86. "leverage": 0.75,
  87. "exposure": 0.5,
  88. "vol_target": 0.2
  89. },
  90. "recomputed_candidate_metrics": {
  91. "first_candle_utc": "2019-12-25 00:00:00+00:00",
  92. "last_candle_utc": "2026-05-03 15:00:00+00:00",
  93. "rows": 55720,
  94. "total_return": 1.520238100611786,
  95. "annualized_return": 0.1564147619507854,
  96. "max_drawdown": 0.07718283753429936,
  97. "calmar": 2.0265484782323027,
  98. "turnover_total": 38.31832596610607,
  99. "turnover_per_year": 6.024310117968542,
  100. "trades": 45,
  101. "win_rate": 0.5777777777777777,
  102. "profit_factor": 7.384619055503101,
  103. "old_entry_exit_only_profit_factor": 7.4386055102893875
  104. },
  105. "reported_metric_diffs": {
  106. "total_return": 0.0,
  107. "annualized_return": 0.0,
  108. "max_drawdown": 5.551115123125783e-17,
  109. "calmar": 0.0,
  110. "turnover_per_year": 0.0,
  111. "trades": 0,
  112. "win_rate": 0.0,
  113. "profit_factor": 0.0
  114. }
  115. }