4.6 KiB
Trend Prediction Fix - Real Data vs Synthetic
Problem Discovered
The model's trend predictions were "way off" because training was using SYNTHETIC/FAKE trend data.
Before (Synthetic Data):
# ANNOTATE/core/real_training_adapter.py (lines 1622-1633)
if direction == 'LONG':
trend_angle = 0.785 # Fixed 45 degrees!
trend_direction = 1.0
elif direction == 'SHORT':
trend_angle = -0.785 # Fixed -45 degrees!
trend_direction = -1.0
else:
trend_angle = 0.0
trend_direction = 0.0
Problem: Model was trained on fixed angles (always ±45°) instead of learning actual price trends!
Root Cause
This violated the user's strict rule:
"NEVER USE SYNTHETIC/MOCK DATA. ONLY USE REAL DATA. REMOVE ALL MOCK DATA implementations"
The model was learning:
- ✗ "LONG trades = 45° angle"
- ✗ "SHORT trades = -45° angle"
- ✗ "HOLD = 0° angle"
Instead of learning:
- ✓ "This uptrend is steep (60°)"
- ✓ "This downtrend is shallow (-20°)"
- ✓ "This sideways move is flat (5°)"
Solution
Calculate REAL trend from actual price data (lines 1618-1652):
# Get last 10 candles
recent_closes = price_data[0, -10:, 3] # Last 10 close prices
# Calculate actual price change
price_start = recent_closes[0].item()
price_end = recent_closes[-1].item()
price_delta = price_end - price_start
time_delta = 9.0 # 10 candles = 9 intervals
# Calculate REAL angle using atan2
trend_angle = math.atan2(price_delta, time_delta * price_start / 100.0)
# Calculate REAL steepness (magnitude)
price_change_pct = abs(price_delta / price_start)
trend_steepness = min(price_change_pct * 100.0, 1.0)
# Calculate REAL direction
trend_direction = 1.0 if price_delta > 0 else -1.0
Impact
Before Fix:
- Trend predictions always showed ±45° angles
- Model couldn't distinguish steep vs shallow trends
- Yellow trend line was always wrong
- Trend accuracy: probably 0%
After Fix:
- Trend predictions will match actual price movement
- Model learns real market dynamics
- Yellow trend line will be accurate
- Trend accuracy should improve significantly
UI Improvements
Also fixed the yellow trend line zoom issue:
- Before: Projected 5 minutes ahead → threw off chart zoom
- After: Projects based on timeframe (1s: 30s, 1m: 2min, 1h: 30min)
Testing Instructions
-
Delete old checkpoints (they have synthetic trend training):
rm -rf models/checkpoints/transformer/* -
Restart training:
- Load Transformer model (fresh start)
- Start "Live Inference + Per-Candle Training"
-
Monitor trend predictions:
- Watch the yellow trend line on charts
- It should now match actual price movement direction
- Check console logs for
Trend lossandtrend_accuracy
-
Expected improvements:
- Trend line should point in correct direction
- Angle should match actual steepness
- After 5-10 epochs, trend accuracy should be 40-60%
Files Modified
-
/mnt/shared/DEV/repos/d-popov.com/gogo2/ANNOTATE/core/real_training_adapter.py- Lines 1618-1652: Calculate real trend from actual price data
-
/mnt/shared/DEV/repos/d-popov.com/gogo2/ANNOTATE/web/static/js/chart_manager.js- Lines 2749-2756: Adjusted trend line projection to avoid zoom issues
- Re-enabled trend line visualization (was temporarily disabled)
Technical Details
Trend Vector Components:
- angle: Calculated using
atan2(price_delta, time_delta)- ranges from -π to +π - steepness: Normalized price change percentage (0 to 1)
- direction: Sign of price movement (+1 up, -1 down, 0 flat)
Training Loss:
# NN/models/advanced_transformer_trading.py (line 1355)
total_loss = action_loss + 0.1 * price_loss + 0.05 * trend_loss + 0.15 * candle_loss
Trend loss weight is 0.05 (5% of total loss).
Accuracy Calculation:
# Lines 1484-1501
angle_accuracy = (1.0 - clamp(angle_error_deg / 180.0, 0, 1)).mean()
steepness_accuracy = (1.0 - clamp(steepness_error, 0, 1)).mean()
trend_accuracy = (angle_accuracy + steepness_accuracy) / 2
Why This Matters
Trend prediction is critical for:
- Trade timing: Knowing if trend is accelerating or decelerating
- Risk management: Steep trends are riskier
- Position sizing: Adjust size based on trend strength
- Signal confidence: Strong trends = higher confidence
With synthetic data, the model was blind to actual trend dynamics!
Status
✅ FIXED - Now using real trend data ⏳ PENDING - User needs to test with fresh training run 📊 EXPECTED - Trend accuracy should improve from 0% to 40-60% after training