← Back to Reviews
20260115_022920_btc_trend_exhaustion.md
# AI Review: btc_trend_exhaustion
**Date:** Thu Jan 15 02:29:20 CET 2026
**Strategy File:** /root/trade_rules/strategies/btc_trend_exhaustion.py
---
```json
{
"score": 72,
"flags": ["complexity", "overfitting"],
"review": "## Strategy Assessment: btc_trend_exhaustion\n\n### Strengths\n\n**Consistent Multi-Year Performance**\n- Returns distributed across all years (14-43%), not concentrated in one lucky period\n- Win rates consistently 60-74% across different market regimes\n- Sharpe ratios positive in all years (0.79-1.75), showing reliable risk-adjusted returns\n- Drawdowns remain controlled (10-19%), meeting mean_reversion role requirements\n\n**Execution Realism**\n- Trades on next bar (no same-candle execution)\n- Reasonable trade frequency (23-72 trades per year)\n- Well above minimum trade count requirement\n- Stop loss and take profit levels are realistic\n\n**Sound Core Concept**\n- Mean reversion after trend exhaustion is a universal market principle\n- Uses relative indicators (EMA ratios, RSI, percentage moves)\n- No specific price levels or dates referenced\n- Parameters are round, standard values (14, 20, 50, etc.)\n\n**Regime Awareness**\n- Smart asymmetry: allows longs in bull markets but filters shorts (only when EMA20 < EMA50)\n- This explains why strategy works across different years - adapts to regime\n\n### Concerns\n\n**1. Excessive Complexity (Primary Issue)**\n\nThe strategy violates the \"no more than 5-6 entry conditions\" guideline:\n\n**Long Entry Logic:**\n- Condition Set 1: 4 conditions (extended_down, rsi_oversold, rsi_turning, not_crash)\n- Condition Set 2: 5 conditions (strong_down, exhaustion, rsi_low, rsi_turning, not_crash)\n- **Total unique conditions: 8-9 different signals**\n\n**Short Entry Logic:**\n- Condition Set 1: 4 conditions + regime filter\n- Condition Set 2: 5 conditions + regime filter\n- **Total unique conditions: 7-8 different signals**\n\n**Exit Logic:**\n- 4 different exit conditions with sub-conditions\n- Profit lock has side-specific RSI thresholds\n\nThis creates **16+ total conditional branches** across entry/exit logic. The rules specify max 5-6 entry conditions to avoid overfitting.\n\n**2. Curve-Fitting Risk**\n\nMultiple threshold values appear optimized rather than principled:\n- Extended thresholds: 3% for longs, 4% for shorts (why different?)\n- RSI thresholds: 65/35 for extremes, 45-55 for normalized, 40/60 for alternative entries\n- Volume exhaustion: exactly 0.8x multiplier\n- Consecutive bars: exactly 3\n- Five-bar lookback: why 5 specifically?\n- EMA ratio thresholds: 0.90 and 1.02 (oddly specific)\n- Profit lock: exactly 3%\n\nWhile individually reasonable, the **combination of 10+ tuned thresholds** suggests parameter optimization on train data.\n\n**3. Alternative Entry Path Concerns**\n\nThe \"Set 2\" condition paths (strong_down/strong_up + exhaustion) appear added to capture additional trades:\n- Volume exhaustion (< 0.8x SMA) is redundant with RSI exhaustion signals\n- Consecutive bar counting adds complexity without clear edge\n- This feels like \"adding conditions until backtest improves\"\n\n### Minor Issues\n\n**Documentation vs Code Mismatch:**\n- Docstring claims \"Top 3 trades contribute 40% of PnL\" but no verification provided\n- Need to verify concentration risk independently\n\n**Parameter Count:**\n- 12 parameters in config (ema_fast, ema_slow, rsi_period, thresholds, etc.)\n- While using standard values, the sheer number increases overfitting surface area\n\n### Validation Performance\n\n**Validation: +9.62% return**\n- Passes mean_reversion gates (>-8% return, <25% DD)\n- Sharpe 1.27 exceeds minimum requirement\n- Performance degraded from train (average ~25% per half-year) but still positive\n- This degradation is **expected and healthy** - suggests strategy isn't perfectly fit\n\n### Risk Assessment\n\n**Overfitting Probability: Medium-High**\n- Complexity suggests optimization rather than principled design\n- Multiple thresholds likely tuned on train data\n- However, consistent multi-year performance reduces concern\n- Validation pass suggests some genuine edge remains\n\n**Robustness: Medium**\n- Core concept is sound and universal\n- Regime filter is smart defensive design\n- But will all 16 conditions remain relevant in new market structures?\n- Simpler version would likely perform similarly\n\n### Recommendation\n\n**Score: 72/100 - Acceptable with Concerns**\n\nThe strategy passes validation gates and shows consistent historical performance, but violates complexity guidelines designed to prevent overfitting. The excessive conditions and multiple tuned thresholds raise red flags.\n\n**This strategy can proceed but should be monitored closely** - if paper trading performance degrades significantly, complexity is likely the culprit.\n\n### What Would Improve This\n\n1. **Simplify to single entry path:** Choose either extended price OR strong move logic, not both\n2. **Reduce thresholds:** Consolidate RSI levels (use 30/70 extremes, 50 neutral)\n3. **Remove redundant signals:** Volume exhaustion OR consecutive bars, not both\n4. **Unified short/long thresholds:** Use same extension % for both directions\n5. **Target 4-5 entry conditions total,** not 8-9 per direction\n\nA simpler version would be more trustworthy and likely perform similarly.",
"rule_suggestion": "**Maximum Condition Complexity Limits:**\n\n- Total entry conditions per direction (long/short): Maximum 5 conditions\n- When using multiple condition sets (Set A OR Set B logic): Each set must share at least 50% of conditions with other sets\n- Total unique parameters/thresholds across strategy: Maximum 8\n- Exit logic: Maximum 3 independent exit conditions\n- Rationale: Each additional condition/threshold is an opportunity for curve-fitting. Strategies with >10 tunable values and >6 entry conditions per direction have high overfitting risk even if using round numbers.\n\n**Threshold Symmetry Requirement:**\n\n- When strategy trades both directions (long/short), symmetric conditions should use identical thresholds\n- Example: If long triggers at 3% below EMA, short should trigger at 3% above EMA (not 4%)\n- Asymmetry only allowed when justified by market structure (e.g., regime filters)\n- Rationale: Different thresholds for long/short suggest parameter optimization unless there's a principled reason"
}
```