Methodology Whitepaper
StockPredictor AI Signal — Dokumentasi Metodologi
Dokumen ini menjelaskan bagaimana StockPredictor AI Signal di-train, di-validate, dan di-deploy. Tujuannya: trader retail BEI dapat verifikasi independent metodologi sebelum mengandalkan signal untuk decision. Semua angka di dokumen ini bersumber dari artifact training v6 yang tersimpan di repository.
1. Arsitektur Ensemble
AI Signal StockPredictor menggunakan arsitektur weighted ensemble dari 4 model member independen. Output masing-masing member digabung via weighted average untuk menghasilkan composite_score, yang kemudian dikonversi ke kelas signal.
┌─────────────┐ ┌─────────────┐ ┌──────────────────┐ ┌─────────────┐
│ XGBoost │ │ LightGBM │ │ Bandarmologi │ │ Transformer │
│ (37 feat) │ │ (37 feat) │ │ (smart money) │ │ (seq model) │
│ w = 0.40 │ │ w = 0.20 │ │ w = 0.10 │ │ w = 0.30 │
└──────┬──────┘ └──────┬──────┘ └────────┬─────────┘ └──────┬──────┘
│ │ │ │
└────────────────┴──────────────────┴────────────────────┘
│
Weighted Average
│
composite_score
│
┌──────────────────────────────────────────────────────┐
│ STRONG_BUY │ BUY │ HOLD │ SELL │ STRONG_SELL │
└──────────────────────────────────────────────────────┘2. Ensemble Weights
v4 weights ditemukan via grid search 21,667 sample (Feb–May 2026). v5 dan v6 adalah re-validation runs yang mengkonfirmasi weights v4 tetap optimal — weights tidak berubah antar versi tersebut.
| Member | Weight (v4/v5/v6) | Catatan |
|---|---|---|
| XGBoost | 0.40 | Gradient boosting pada 37 tabular feature |
| LightGBM | 0.20 | GBM variant yang lebih cepat, komplementer XGB |
| Bandarmologi | 0.10 | Smart-money flow score (volume anomaly + broker pattern) |
| Transformer | 0.30 | 2-layer 4-head sequence model (OHLCV temporal) |
Baseline (deprecated): XGB=0.30, LGBM=0.25, Bandar=0.30, TF=0.15. Delta objective vs baseline: +0.0307 (+7.7% accuracy).
3. Feature Engineering (37 Features)
Model menggunakan 37 feature yang dibagi dalam 5 kategori. Semua feature dinormalisasi per-ticker menggunakan rolling z-score (window 252 hari trading) sebelum masuk ke model.
- Teknikal (18)
ret_1d,ret_3d,ret_5d,ret_10d,ret_20d,ema9_above_ema21,ema21_above_ema50,ema50_above_ema200,rsi_14,rsi_zone,macd_hist,macd_bullish_cross,bb_pct_b,bb_squeeze,volume_ratio,atr_norm,atr_break_ratio,stoch_k- Fundamental (9)
fundamental_score,per,pbv,roe,roa,net_margin,revenue_growth_1y,earnings_growth_1y,der- Bandarmologi (4)
bandar_score,bandar_vol_score,bandar_dir_score,bandar_reversal_score- Market & Makro (3)
calendar_effect_score,event_proximity_score,market_news_sentiment_score- Size & Lainnya (3)
dividend_yield,log_market_cap,has_fundamental
4. Walk-Forward Cross-Validation
Untuk menghindari look-ahead bias, validasi menggunakan 15-fold walk-forward CV: setiap fold melatih model pada data historis yang lebih tua, lalu mengevaluasi pada periode berikutnya yang tidak terlihat saat training. Urutan temporal dipertahankan — tidak ada shuffle random seperti pada k-fold standard. Window: 3 bulan training, 1 bulan test per fold.
| Fold | Accuracy | N Train | N Test |
|---|---|---|---|
| Fold 0 | 0.6529 | 41,705 | 13,274 |
| Fold 1 | 0.6005 | 54,979 | 12,589 |
| Fold 2 | 0.6959 | 67,568 | 13,516 |
| Fold 3 | 0.7110 | 81,084 | 14,387 |
| Fold 4 | 0.7039 | 95,471 | 15,848 |
| Fold 5 | 0.6704 | 111,319 | 16,840 |
| Fold 6 | 0.6908 | 128,159 | 16,383 |
| Fold 7 | 0.6355 | 144,542 | 16,682 |
| Fold 8 | 0.7090 | 161,224 | 17,759 |
| Fold 9 | 0.6844 | 178,983 | 14,428 |
| Fold 10 | 0.5893 | 193,411 | 16,767 |
| Fold 11 | 0.7038 | 210,178 | 14,789 |
| Fold 12 | 0.6677 | 224,967 | 14,014 |
| Fold 13 | 0.5884 | 238,981 | 15,685 |
| Fold 14 | 0.6464 | 254,666 | 14,857 |
| Average | 0.6633 | — | — |
Data diperbarui: Invalid Date | Versi: v9
5. Performance Metrics
Holdout evaluation dilakukan pada periode yang tidak terlihat saat optimisasi weight. Dataset: 2026-02-01 s/d 2026-05-02 (n_samples=21,667, n_tickers=872).
| Metric | v6 (current) | Baseline | Delta |
|---|---|---|---|
| Accuracy | 77.35% | 69.65% | +7.70% |
| AUC-ROC | 0.7454 | 0.7428 | +0.0026 |
| F1 Score | 0.5321 | 0.5046 | +0.0275 |
| Precision | 50.02% | 40.04% | +9.98% |
| Recall | 56.83% | 68.22% | -11.39% |
| Top Decile Precision | 71.34% | 71.62% | -0.28% |
Untuk hasil live out-of-sample, lihat Track Record / Scoreboard yang diperbarui setiap market close.
6. Top Feature Importances (XGBoost)
Feature importance dari XGBoost member (gain-based). Nilai mewakili kontribusi rata-rata feature terhadap keputusan model.
atr_norm— 0.081 (Volatility normalized ATR)market_news_sentiment_score— 0.066 (NLP sentiment pasar)ema21_above_ema50— 0.047 (Trend medium-term signal)ret_10d— 0.042 (Return 10 hari)dividend_yield— 0.040 (Dividend yield tahunan)
7. Drift Detection
Drift detection memantau apakah distribusi feature input untuk ticker tertentu masih konsisten dengan distribusi yang dilihat model saat training. Metodologi:
- Setiap feature dinormalisasi menggunakan mean dan std dari training distribution.
- Z-score dihitung:
z = (x - μ_train) / σ_train - Feature dengan
|z| > 3.0diklasifikasikan sebagai outlier. - Warning (kuning): drift_score ≥ 1.5σ dari rata-rata per ticker.
- Critical (merah): drift_score ≥ 2.5σ.
Drift badge adalah warning informational, bukan blokir signal. Signal tetap ditampilkan dan tetap valid — drift hanya mengindikasikan bahwa ticker ini berada di kondisi distribusi yang berbeda dari rata-rata training data.
8. Disclaimer
AI signal adalah analisis statistik berbasis data historis, bukan rekomendasi investasi pasti. Model dapat salah, terutama dalam kondisi pasar yang tidak pernah terjadi sebelumnya (black swan events, kebijakan mendadak, suspensi saham).
Pasar BEI memiliki risiko inheren. Kinerja historis tidak menjamin kinerja masa depan. Selalu lakukan due diligence independen sebelum mengambil keputusan investasi. StockPredictor tidak bertanggung jawab atas kerugian yang timbul dari penggunaan signal ini.
Terakhir diperbarui: 2026-05-14 | Artifact: backend/ml/artifacts/cv_report.json