pivot: rewrite as BTC accumulation signal optimizer

Replace day-trading bot with long-term accumulation signal model.
Predicts optimal BUY times using forward return analysis at 7d/30d/90d
horizons, scoring each candle 0-100. Primary metric is now
cost_basis_improvement_pct (model buy price vs DCA).

- train_and_backtest.py: regression models (XGBoost/LSTM hybrid),
  accumulation-focused features (price position, momentum, volatility,
  volume, cycle), forward return targets, signal quality backtesting
- orchestrator.py: cost improvement scoring, signal count validation
- analyzer.py: accumulation-focused LLM system prompt
- dashboard: cost improvement display, signal metrics table
- config: new accumulation-focused parameters

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
BizzleBot
2026-03-19 23:51:43 +00:00
co-authored by Claude Opus 4.6
parent a21e635d9f
commit 560863fa0d
5 changed files with 829 additions and 797 deletions
+24 -33
View File
@@ -1,62 +1,53 @@
{
"model_type": "hybrid",
"features": {
"technical_indicators": ["RSI_14", "RSI_7", "MACD_line", "MACD_signal", "MACD_hist", "BB_upper", "BB_lower", "BB_width", "ATR_14", "SMA_20", "SMA_50", "EMA_10", "EMA_20", "OBV", "stoch_k", "stoch_d", "williams_r", "CCI_20", "ROC_10"],
"lookback_periods": [3, 5, 10, 20],
"use_volume_features": true,
"use_volatility_features": true,
"use_candle_patterns": false,
"use_lag_features": true,
"lag_periods": [1, 2, 3, 5],
"use_price_position": true,
"use_momentum": true,
"use_volatility": true,
"use_volume": true,
"use_cycle": true,
"use_pca": true,
"pca_variance": 0.95,
"use_scaler": true
},
"target": {
"type": "classification",
"direction": "both",
"horizon_candles": 8,
"threshold_pct": 1.5
"type": "regression",
"forward_periods_1h": [168, 720, 2160],
"forward_periods_4h": [42, 180, 540],
"weights": [0.2, 0.3, 0.5],
"score_range": [0, 100]
},
"hyperparameters": {
"learning_rate": 0.001,
"learning_rate": 0.01,
"max_depth": 5,
"n_estimators": 300,
"n_estimators": 500,
"subsample": 0.8,
"colsample_bytree": 0.8,
"min_child_weight": 5,
"min_child_weight": 10,
"gamma": 0.3,
"reg_alpha": 0.1,
"reg_lambda": 2.0,
"reg_alpha": 0.5,
"reg_lambda": 3.0,
"lstm_hidden_size": 128,
"lstm_num_layers": 2,
"lstm_dropout": 0.3,
"lstm_epochs": 100,
"lstm_batch_size": 64,
"lstm_sequence_length": 20,
"lstm_sequence_length": 30,
"lstm_patience": 10
},
"strategy": {
"entry_threshold": 0.60,
"exit_type": "trailing_stop",
"stop_loss_pct": 2.0,
"take_profit_pct": 4.0,
"trailing_stop_pct": 1.5,
"position_sizing": "confidence_scaled",
"max_position_pct": 100,
"min_confidence_to_trade": 0.55,
"dynamic_sl_tp": true,
"atr_sl_multiplier": 1.5,
"atr_tp_multiplier": 3.0
"strong_buy_threshold": 80,
"good_buy_threshold": 70,
"poor_threshold": 30
},
"training": {
"rolling_window": true,
"rolling_train_size": 2500,
"rolling_test_size": 300,
"walk_forward_windows": 5,
"train_pct": 0.7,
"validation_pct": 0.15,
"test_pct": 0.15,
"rolling_window": true,
"rolling_train_size": 2000,
"rolling_test_size": 200
"test_pct": 0.15
},
"timeframe": "4h"
}
}