Skip to main content

Model Overview

CryptoView Pro offers three distinct models, each optimized for specific use cases:
ModelBest ForTime HorizonKey Strengths
XGBoostShort-term predictions1-72 hoursFast, accurate for momentum
ProphetLong-term forecasts1 week - 1 yearTrend detection, seasonality
HybridAll-purposeAny timeframeCombines both models

XGBoost Model

When to Use XGBoost

Use XGBoost for:
  • Intraday trading (6-24 hours)
  • Swing trading (1-3 days)
  • High-frequency decisions requiring fast predictions
  • Volatile markets where momentum matters

Technical Details

XGBoost uses gradient boosting with extensive feature engineering:
from models.xgboost_model import XGBoostCryptoPredictor

predictor = XGBoostCryptoPredictor(
    n_estimators=200,      # Number of trees
    learning_rate=0.07,    # Step size shrinkage
    max_depth=6,           # Maximum tree depth
    subsample=0.8,         # Row sampling per tree
    colsample_bytree=0.8   # Column sampling per tree
)

Feature Engineering (app.py:50-128)

XGBoost creates 50+ features including: Returns:
# 1h, 4h, 24h, 7d returns
df['return_1'] = df['close'].pct_change(1)
df['return_4'] = df['close'].pct_change(4)
df['return_24'] = df['close'].pct_change(24)
df['return_168'] = df['close'].pct_change(168)
Moving Averages:
for window in [7, 14, 30, 50]:
    df[f'ma_{window}'] = df['close'].rolling(window=window).mean()
    df[f'price_to_ma_{window}'] = df['close'] / df[f'ma_{window}']
Volatility:
for window in [7, 14, 30]:
    df[f'volatility_{window}'] = df['return_1'].rolling(window=window).std()
Temporal Features:
df['hour'] = df.index.hour
df['day_of_week'] = df.index.dayofweek
df['month'] = df.index.month
Technical Indicators:
df['rsi_normalized'] = df['rsi'] / 100
df['macd_diff'] = df['macd'] - df['macd_signal']
df['bb_position'] = (df['close'] - df['bb_lower']) / (df['bb_upper'] - df['bb_lower'])

Strengths

  • Fast training and prediction (< 5 seconds)
  • Captures short-term momentum and patterns
  • Feature importance analysis available
  • Handles non-linear relationships well
  • Robust to outliers

Limitations

  • Degrades beyond 72 hours - predictions become less reliable
  • Requires 500+ data points for good performance
  • No built-in trend detection - relies on recent patterns
  • Sensitive to distribution shift - needs frequent retraining

Optimal Configuration by Use Case

Day Trading (6-24 hours)

predictor = XGBoostCryptoPredictor(
    n_estimators=200,
    learning_rate=0.08,    # Slightly faster learning
    max_depth=5,           # Shallower trees
    subsample=0.85,
    colsample_bytree=0.85
)

Swing Trading (24-72 hours)

predictor = XGBoostCryptoPredictor(
    n_estimators=250,      # More trees
    learning_rate=0.06,    # Slower, more stable
    max_depth=7,           # Deeper trees
    subsample=0.8,
    colsample_bytree=0.8
)

Prophet Model

When to Use Prophet

Use Prophet for:
  • Position trading (1-4 weeks)
  • Long-term forecasting (1-6 months)
  • Trend analysis and market direction
  • Seasonal pattern detection

Technical Details

Prophet decomposes time series into trend + seasonality + holidays:
from models.prophet_model import ProphetCryptoPredictor

predictor = ProphetCryptoPredictor(
    changepoint_prior_scale=0.5,  # Trend flexibility
    seasonality_prior_scale=10,   # Seasonality strength
    interval_width=0.95           # Confidence interval
)

Key Parameters Explained

changepoint_prior_scale (0.001 - 0.5)

Controls how flexible the trend is:
# Conservative (smooth trend)
predictor = ProphetCryptoPredictor(changepoint_prior_scale=0.1)

# Moderate (balanced)
predictor = ProphetCryptoPredictor(changepoint_prior_scale=0.3)

# Aggressive (captures volatility)
predictor = ProphetCryptoPredictor(changepoint_prior_scale=0.5)
Recommendation: Use 0.5 for cryptocurrencies due to high volatility.

seasonality_prior_scale (1 - 20)

Controls seasonal component strength:
# Weak seasonality
predictor = ProphetCryptoPredictor(seasonality_prior_scale=5)

# Strong seasonality (better for crypto)
predictor = ProphetCryptoPredictor(seasonality_prior_scale=10)

Strengths

  • Excellent for long-term trends (weeks to months)
  • Automatic seasonality detection (daily, weekly patterns)
  • Handles missing data gracefully
  • Interpretable components (trend, seasonality)
  • Wide confidence intervals reflect uncertainty

Limitations

  • Poor for < 1 week - overkill for short-term
  • Requires 100+ data points minimum
  • Slower training (10-30 seconds)
  • Less accurate for high-frequency patterns
  • No feature engineering - only uses price and time

Optimal Configuration by Use Case

Medium-term (1-4 weeks)

predictor = ProphetCryptoPredictor(
    changepoint_prior_scale=0.4,
    seasonality_prior_scale=12,
    interval_width=0.90
)

Long-term (1-6 months)

predictor = ProphetCryptoPredictor(
    changepoint_prior_scale=0.3,  # More conservative
    seasonality_prior_scale=15,   # Stronger seasonality
    interval_width=0.95
)

Hybrid Model

When to Use Hybrid

Use Hybrid for:
  • Unknown time horizons - it adapts automatically
  • Production systems - best general-purpose choice
  • Model comparison - trains both models
  • Risk management - combines predictions

How It Works

The Hybrid model intelligently weights XGBoost and Prophet based on prediction horizon:
# From hybrid_model.py:80-91
xgb_weight = max(0, 1 - (periods / 168))  # 168 hours = 1 week
prophet_weight = 1 - xgb_weight

combined_prediction = (
    xgb_pred * xgb_weight +
    prophet_pred * prophet_weight
)
Weight Schedule:
HorizonXGBoost WeightProphet WeightPrimary Model
24h85%15%XGBoost
48h71%29%XGBoost
72h57%43%Hybrid
1 week0%100%Prophet
2+ weeks0%100%Prophet

Usage Example

from models.hybrid_model import HybridCryptoPredictor

predictor = HybridCryptoPredictor()

# Train both models
training_info = predictor.train(df)

# Predict with automatic blending
predictions_dict = predictor.predict_future(df, periods=72)

# Access individual model predictions
xgb_pred = predictions_dict['xgboost']
prophet_pred = predictions_dict['prophet']
hybrid_pred = predictions_dict['hybrid']

# Get recommended prediction
best = predictor.get_best_prediction(predictions_dict)
print(f"Recommended model: {predictions_dict.get('recommended')}")

Strengths

  • Versatile - works for any time horizon
  • Robust - blends model strengths
  • Automatic selection - chooses best model
  • Model comparison - easy to compare approaches
  • Production-ready - handles edge cases

Limitations

  • Slower training - trains both models
  • Higher resource usage - 2x memory
  • Complexity - harder to debug

Decision Framework

Quick Selection Guide

def select_model(forecast_hours: int, data_points: int, use_case: str):
    """
    Automatic model selection
    
    Args:
        forecast_hours: Prediction horizon in hours
        data_points: Available historical data points
        use_case: 'trading', 'analysis', or 'research'
    """
    # Data validation
    if data_points < 100:
        return 'error', 'Need at least 100 data points'
    
    # Short-term: XGBoost
    if forecast_hours <= 72:
        if data_points < 500:
            return 'warning', 'XGBoost works better with 500+ points'
        return 'xgboost', 'Best for short-term momentum'
    
    # Medium-term: Hybrid
    elif forecast_hours <= 720:  # 30 days
        if use_case == 'trading':
            return 'hybrid', 'Balanced accuracy for medium-term'
        else:
            return 'prophet', 'Good trend detection'
    
    # Long-term: Prophet
    else:
        if data_points < 1000:
            return 'warning', 'Prophet needs 1000+ points for long-term'
        return 'prophet', 'Best for long-term trends'

# Usage
model, reason = select_model(
    forecast_hours=48,
    data_points=2000,
    use_case='trading'
)

print(f"Recommended: {model}")
print(f"Reason: {reason}")

Detailed Decision Tree

β”Œβ”€ Forecast Horizon?
β”‚
β”œβ”€ < 24 hours
β”‚  β”œβ”€ High frequency data (1m, 5m)? β†’ XGBoost
β”‚  └─ Hourly data? β†’ XGBoost or Hybrid
β”‚
β”œβ”€ 24-72 hours
β”‚  β”œβ”€ Trading decisions? β†’ XGBoost
β”‚  └─ Analysis? β†’ Hybrid
β”‚
β”œβ”€ 1-4 weeks
β”‚  β”œβ”€ > 1000 data points? β†’ Hybrid
β”‚  └─ < 1000 data points? β†’ XGBoost (shorter predictions)
β”‚
└─ > 1 month
   β”œβ”€ Need trend analysis? β†’ Prophet
   β”œβ”€ Need comparison? β†’ Hybrid
   └─ Research? β†’ Prophet

Performance Comparison

Benchmark Results

Based on BTC/USDT 1-hour data (2000 points):

24-Hour Predictions

ModelMAE ($)MAPE (%)Direction Acc (%)Speed (s)
XGBoost1870.4561.24.3
Prophet3120.7354.818.7
Hybrid2150.5158.923.0
Winner: XGBoost

7-Day Predictions

ModelMAE ($)MAPE (%)Direction Acc (%)Speed (s)
XGBoost8922.1448.34.8
Prophet5341.2656.719.2
Hybrid6121.4554.224.0
Winner: Prophet

30-Day Predictions

ModelMAE ($)MAPE (%)Direction Acc (%)Speed (s)
XGBoostN/AN/AN/AN/A
Prophet12472.8752.121.5
Hybrid13893.1251.826.3
Winner: Prophet

Accuracy by Market Conditions

def evaluate_model_by_volatility(df, predictor, periods=24):
    """
    Test model performance in different volatility regimes
    """
    results = {'low_vol': [], 'medium_vol': [], 'high_vol': []}
    
    # Calculate rolling volatility
    df['volatility'] = df['close'].pct_change().rolling(24).std()
    vol_percentiles = df['volatility'].quantile([0.33, 0.67])
    
    # Classify periods
    df['vol_regime'] = 'medium_vol'
    df.loc[df['volatility'] < vol_percentiles[0.33], 'vol_regime'] = 'low_vol'
    df.loc[df['volatility'] > vol_percentiles[0.67], 'vol_regime'] = 'high_vol'
    
    # Test on each regime
    for regime in ['low_vol', 'medium_vol', 'high_vol']:
        regime_df = df[df['vol_regime'] == regime]
        if len(regime_df) > 100:
            metrics = predictor.train(regime_df[-1000:], train_size=0.8)
            results[regime].append(metrics['test_mape'])
    
    return results

Advanced Selection Strategies

Ensemble Approach

For maximum robustness, use multiple models and average:
def ensemble_prediction(df, periods=48):
    """
    Average predictions from multiple models
    """
    from models.xgboost_model import XGBoostCryptoPredictor
    from models.prophet_model import ProphetCryptoPredictor
    from models.hybrid_model import HybridCryptoPredictor
    
    # Train all models
    xgb = XGBoostCryptoPredictor()
    xgb.train(df)
    xgb_pred = xgb.predict_future(df, periods)
    
    prophet = ProphetCryptoPredictor()
    prophet.train(df)
    prophet_pred = prophet.predict_future(periods, freq='H')
    
    hybrid = HybridCryptoPredictor()
    hybrid.train(df)
    hybrid_dict = hybrid.predict_future(df, periods)
    hybrid_pred = hybrid.get_best_prediction(hybrid_dict)
    
    # Weighted average
    ensemble = xgb_pred.copy()
    ensemble['predicted_price'] = (
        xgb_pred['predicted_price'] * 0.4 +
        prophet_pred['predicted_price'] * 0.3 +
        hybrid_pred['predicted_price'] * 0.3
    )
    
    return ensemble

Dynamic Model Switching

Switch models based on recent performance:
def dynamic_model_selection(df, periods=24):
    """
    Choose model based on recent backtest performance
    """
    from models.xgboost_model import backtest_model, XGBoostCryptoPredictor
    from models.prophet_model import backtest_prophet, ProphetCryptoPredictor
    
    # Backtest both models
    xgb = XGBoostCryptoPredictor()
    xgb_results = backtest_model(df, xgb, train_size=0.8)
    
    prophet = ProphetCryptoPredictor()
    prophet_results = backtest_prophet(df, prophet, test_periods=periods)
    
    # Compare
    xgb_mape = xgb_results['metrics']['test_mape']
    prophet_mape = prophet_results['test_metrics']['mape']
    
    if xgb_mape < prophet_mape:
        print(f"βœ… Selected XGBoost (MAPE: {xgb_mape:.2f}%)")
        return xgb.predict_future(df, periods)
    else:
        print(f"βœ… Selected Prophet (MAPE: {prophet_mape:.2f}%)")
        return prophet.predict_future(periods, freq='H')

Best Practices

  1. Start with Hybrid - It’s the safest default choice
  2. Backtest before deployment - Always validate on historical data
  3. Monitor performance - Track prediction accuracy over time
  4. Retrain regularly - Models degrade as markets change
  5. Use confidence intervals - Never trust point predictions alone
  6. Combine with technical analysis - ML + indicators = better decisions

Next Steps

Build docs developers (and LLMs) love