Glosarium
Glosarium Istilah
Rujukan cepat istilah teknis yang dipakai di sepanjang tesis ini. Pembaca yang lupa makna sebuah jargon dapat menemukan penjelasan singkatnya di sini.
| Istilah | Penjelasan (Bahasa Indonesia) |
|---|---|
| CAGR | Compound Annual Growth Rate — tingkat pertumbuhan majemuk tahunan. Mengukur rata-rata pertumbuhan modal per tahun jika keuntungan terus diinvestasikan kembali secara konsisten. |
| Sharpe ratio | Rasio imbal-hasil terhadap risiko (volatilitas). Semakin tinggi, semakin besar keuntungan yang diperoleh untuk setiap unit gejolak harga yang ditanggung. |
| Sortino | Mirip Sharpe, tetapi hanya menghukum volatilitas dari pergerakan turun (kerugian), bukan dari kenaikan. Lebih cocok untuk strategi yang naik-turunnya tidak simetris. |
| Max Drawdown (maxDD) | Penurunan terbesar dari puncak ke lembah ekuitas selama periode uji. Mengukur seberapa dalam kerugian sementara terburuk yang pernah dialami portofolio. |
| Worst rolling 12M | Imbal-hasil 12 bulan berjalan yang paling buruk yang pernah terjadi. Menjawab "seberapa jelek hasil satu tahun terburuk yang mungkin dialami investor?" |
| Profit Factor (PF) | Total keuntungan dari transaksi menang dibagi total kerugian dari transaksi kalah. Nilai di atas 1 berarti untung; 1.91 berarti laba kotor hampir dua kali rugi kotor. |
| Win rate | Persentase transaksi yang menghasilkan keuntungan. Win rate rendah bisa tetap profit selama transaksi menang jauh lebih besar daripada yang kalah. |
| Expectancy | Ekspektasi laba/rugi rata-rata per transaksi, menggabungkan win rate dan ukuran rata-rata menang/kalah. Menjawab "rata-rata satu transaksi menghasilkan berapa?" |
| Gross exposure / pengali (multiplier) | Total nilai posisi yang aktif dipegang relatif terhadap modal. Pengali (gross multiplier) menaikkan atau menurunkan eksposur ini tergantung kondisi pasar. |
| Overlay / regime overlay | Lapisan keputusan di atas pemilihan saham yang menyesuaikan tingkat eksposur berdasarkan kondisi pasar (regime), misalnya menurunkan eksposur saat pasar berisiko tinggi. |
| BRF (Bayesian Regime Filter) | Penyaring kondisi pasar berbasis statistik Bayesian. Alih-alih beralih keras antar-keadaan, ia menimbang "keyakinan" akan kondisi pasar dan menyesuaikan eksposur secara bertahap. |
| Momentum (cross-sectional) | Strategi membeli saham yang relatif berkinerja terbaik dibanding saham lain (lintas-saham), dengan asumsi yang sedang kuat cenderung tetap kuat. |
| Faktor Trend / Quality / Low-Vol | Trend = kekuatan arah harga; Quality = kesehatan fundamental perusahaan; Low-Vol = preferensi saham bergejolak rendah. Faktor-faktor ini digabung untuk menilai saham. |
| Composite score | Skor gabungan tertimbang dari beberapa faktor (momentum, trend, quality, low-vol) untuk memberi satu peringkat tunggal per saham. |
| Top-N selection | Memilih N saham peringkat teratas berdasarkan composite score pada tiap rebalance (di sini N=12), bukan memakai ambang skor mutlak. |
| ATR & trailing stop | ATR (Average True Range) mengukur rentang gejolak harga harian. Trailing stop adalah batas jual yang mengikuti harga naik untuk mengunci keuntungan, sering dipatok sebagai kelipatan ATR. |
| Rebalance (kuartalan) | Penataan ulang isi portofolio secara berkala. "Kuartalan" berarti dilakukan empat kali setahun untuk menekan biaya transaksi. |
| ADTV (Average Daily Traded Value) | Rata-rata nilai transaksi harian sebuah saham. Digunakan sebagai saringan likuiditas — hanya saham yang cukup likuid yang boleh dibeli. |
| Universe | Kumpulan saham yang menjadi kandidat pilihan strategi. Di sini universe terdiri dari 173 tiker IDX. |
| Survivorship bias | Bias bertahan-hidup: kesalahan mengukur hanya pada saham yang "selamat" hingga kini dan mengabaikan yang sudah delisting, sehingga hasil tampak lebih bagus dari kenyataan. |
| Look-ahead bias | Bias mengintip masa depan: secara tak sengaja memakai informasi yang belum tersedia pada saat keputusan dibuat, sehingga backtest tampak terlalu hebat. |
| PIT (point-in-time) | Prinsip "sesuai titik waktu": setiap keputusan hanya boleh memakai data yang benar-benar sudah diketahui pada tanggal itu, untuk mencegah look-ahead bias. |
| Walk-forward | Validasi maju: model dilatih pada satu rentang waktu lalu diuji pada periode berikutnya yang belum pernah dilihat, diulang bergulir. Menguji ketahanan, bukan sekadar kecocokan masa lalu. |
| In-sample (IS) / Out-of-sample (OOS) | IS = data yang dipakai untuk menyetel/mengoptimasi model. OOS = data yang disisihkan untuk menguji apakah model tetap bekerja di luar data penyetelan. |
| Gate robustness §3.7 | Sekumpulan ambang lulus/gagal pada spesifikasi bagian 3.7 (mis. Sharpe ≥ 1.4, maxDD ≤ 18%). Strategi dinilai berdasarkan berapa banyak gate yang dilewati. |
| IC (Information Coefficient / Spearman) | Koefisien korelasi peringkat (Spearman) antara skor faktor dan imbal-hasil selanjutnya. Mengukur seberapa baik suatu sinyal memprediksi hasil; nilai 0 berarti tanpa daya prediksi. |
| Decile | Pembagian saham menjadi sepuluh kelompok sama besar berdasarkan suatu skor, untuk melihat apakah kelompok skor tinggi berkinerja lebih baik daripada kelompok skor rendah. |
| Net of cost / round-trip cost | "Net biaya" berarti hasil sudah dikurangi biaya transaksi. Round-trip cost adalah total biaya beli sekaligus jual sebuah posisi (di sini 0.46% di IDX). |
| JCI (benchmark IHSG) | Jakarta Composite Index alias IHSG, indeks acuan pasar saham Indonesia. Dipakai sebagai pembanding kinerja strategi. |
| Regime states (LONG_BIAS / NEUTRAL / DEFENSIVE / RISK_OFF) | Empat keadaan pasar yang dideteksi overlay: LONG_BIAS (agresif), NEUTRAL (normal), DEFENSIVE (hati-hati, kurangi eksposur), RISK_OFF (sangat bertahan, eksposur minimum). |
| Beta | Ukuran seberapa kuat sebuah saham atau portofolio ikut bergerak mengikuti pasar. Beta tinggi berarti naik-turun lebih tajam dari pasar. |
| MSCI rebalance / behavioral edge | MSCI secara berkala menambah/mengeluarkan saham dari indeksnya. "Behavioral edge" adalah peluang laba dari mendahului aliran dana pasif yang harus membeli/menjual saham karena perubahan indeks itu. |
| Haircut | Pemotongan: alat risiko yang memangkas ukuran posisi sebuah saham sesuai tingkat risikonya, terutama saat pasar sedang tertekan, demi melindungi modal. |
| PBTS & Crash Radar (modul HPQuant) | Dua modul dari platform HPQuant: PBTS adalah pipeline sinyal per-saham (ATR/Guard Line/Phase/Call); Crash Radar adalah peta tekanan pasar multi-indikator untuk mendeteksi risiko crash. |
| Kill-switch | Tombol darurat: sekumpulan kondisi yang, bila terpenuhi, memicu penghentian total strategi (kembali ke kas atau buy & hold) tanpa analisis lebih lanjut. |
Bagian 1 · Asal-usul
Pertanyaan yang memulai segalanya — dan pivot yang jujur
Trader IDX secara visual menggambar kotak pada titik balik "lembah–puncak" (valley–peak) di grafik harga lalu menransaksikan pembalikannya. Pertanyaannya: temukan korelasi pola itu secara numerik — apakah penilaian mata bisa direduksi menjadi matematika?
Jawabannya ternyata kebalikan dari premis awal.
1.1 Edge pewaktuan lembah-puncak adalah artefak look-ahead
Membaca rumus SML persis dari SML_Oscillator.afl: Stochastic(15,3,3), LPM, DTE, regime, pivot (jendela 11), divergensi (≤60 bar), ekstrem (≤20 / ≥80). Diuji dengan event-study pada 159 saham 2016–2026.
Sayatan awal yang dikondisikan regime tampak luar biasa: swing-low + Stoch<30 + regime STRONG → hit 64%, median imbal-hasil ke depan +1.60%. Itu adalah artefak look-ahead (mengintip masa depan). Sebuah pivot yang terpusat (centered) mengintip w bar ke masa depan; pengukuran ulang dari bar konfirmasi (i+w, bar pertama saat pola benar-benar bisa diketahui) meluruhkan edge itu menjadi ≈ 0.
Pewaktuan lembah/puncak satu-bar tidak punya edge imbal-hasil ke depan pada IDX, bahkan dengan pengondisian SML yang persis. Ilusi visual berasal dari bahu kanan pivot yang menghadap ke masa depan — mata "melihat" sebuah dasar hanya setelah harga sudah berbalik.
1.2 Yang membayar di IDX adalah penampang-lintang (cross-section), bukan pewaktuan
Beralih ke studi decile (scripts/cross_sectional_study.py). Temuan:
- Spread decile momentum (20/60/120 hari) bersifat monoton dan positif.
- Mean-reversion ("beli yang oversold / beli yang aman") rugi secara sistematis; Stochastic dan DTE berperingkat terbalik; LPM marginal.
IDX membayar momentum / trend lintas-penampang, bukan mean-reversion. Naluri trader untuk membeli di lembah, rata-rata, adalah sisi yang salah dari penampang-lintang. Seluruh proyek di-pivot ulang ke kerangka momentum lintas-penampang.
BATASAN Strategi mengikuti mekanisme pasar IDX — tanpa short selling. Setiap konfigurasi berikutnya menghormati batasan itu.
Bagian 2 · Perombakan
Perombakan momentum-tilt tiga-tuas — yang membawa kita dari −1.1% ke +19.1% CAGR
Spesifikasi v1 awal berjalan long/short mingguan dengan ambang composite mutlak. Backtest net, aman-survivorship, parameter tetap: buy-only bulanan −1.1%, L/S bulanan −37%, L/S mingguan (default spec) −71%. Mesinnya benar; strateginya yang salah.
Tiga tuas berbasis bukti, ditumpuk satu per satu:
| Tuas | Alasan | Langkah Sharpe |
|---|---|---|
| 1. Seleksi Top-N lintas-penampang ganti ambang mutlak composite≥80 dengan peringkat top-12 tiap rebalance | ambang mutlak membuat buku kurang terdeploy ketika terlalu sedikit nama yang melewati batas | −0.97 → −0.12 |
| 2. Miringkan bobot ke momentum + trend 60/5/5/30 vs spec 20/15/10/15 | quality + lowvol mengencerkan satu-satunya faktor yang bekerja di IDX | −0.12 → +0.30 |
| 3. Exit longgar + irama kuartalan ATR×5 / −20% / tanpa time-stop, rebal Q | exit spec yang ketat (ATR2.5/−7%/25-bar) men-whipsaw pemenang momentum; kuartalan memangkas biaya turnover | +0.30 → 1.00 |
vs JCI buy & hold −3.6% / Sharpe −0.26 / maxDD −41%. Sharpe walk-forward OOS/IS stabil pasca-pembaruan; kanonik menang 7/7 jendela IS, rata-rata Sharpe OOS +1.065. Sharpe 0.97 masih kurang 0.43 dari gate §3.7 ≥1.4 — ambang tinggi untuk mekanika pasar IDX (tanpa short-selling), di mana JCI sendiri mencatat Sharpe negatif sepanjang jendela.
Perubahan mesin bersifat aditif belaka: top_n, hold_mult, exit_params, weights, rebal_freq="Q" diekspos sebagai kwargs dengan default nilai spec, sehingga rangkaian uji yang sudah ada tetap hijau di setiap langkah.
Perombakan tiga-tuas orisinal menghasilkan kanonik di CAGR +19.1% / Sharpe 1.00 / maxDD −15.3% / PF 1.90 / 4/7 gate pada universe 159-tiker. Audit universe berikutnya mengungkap bahwa Garuda kehilangan 14 saham mapan IDX yang aktif di HP (BBRI, SMGR, MDKA, BREN, BRIS, MBMA, SMRA, DSSA, …). Setelah menyelaraskan universe ke HP 150 ∪ histori likuid Garuda = 173 tiker, kanonik terangkat ke angka di atas — BUKAN survivorship bias, hanya memperbaiki celah data nyata. Rincian di §6b di bawah.
Bagian 3 · Disiplin
Pustaka temuan negatif — apa yang dicoba, apa yang gagal, dan mengapa kami percaya kegagalannya
Headline momentum-tilt adalah yang tersisa setelah beberapa tuas yang tampak menjanjikan diukur secara jujur lalu ditolak. Setiap temuan negatif didokumentasikan agar kami tidak mencoba ulang tuas yang sama:
3.1 Overlay vol-target (target volatilitas) — ditolak
overlay/vol_target.py dapat me-leverage gross NAIK menuju target volatilitas-trailing JCI. JCI berada di bawah target 18% sebagian besar waktu → overlay me-leverage ~1.4× pada 83% hari, memperbesar imbal-hasil dan volatilitas ~1:1 (13.3% → 13.9%). Sharpe tergelincir 1.00 → 0.96, maxDD melebar. Kapabilitas dipertahankan di balik flag default-mati.
Mengangkat Sharpe menuju gate tidak akan datang dari penskalaan gross. Batasan modal ada pada cap-stack (8% per saham / 25% per sektor / maks-12), bukan pada target gross.
3.2 Penjaga momentum-crash — ditolak
Detektor (RS bergulir luas-vs-bigcap) tidak punya daya prediksi yang kokoh: ekses 63-hari ke depan vs JCI adalah +3.5% pada hari broad-leading vs +4.3% pada hari bigcap-leading. Spread −0.86%. Penjaga deep-V menyeluruh menurunkan Sharpe 1.00 → 0.80. n=1 episode (COVID 2020) di mana crash terjadi — penjaga apa pun yang dibangun di atasnya bersifat curve-fit (terlalu pas pada data masa lalu).
Jangan mencoba mewaktukan crash. Buku menyembuhkan diri sendiri; mengotomasi penjaga atas satu episode bergaya 2020 menghancurkan edge di setiap regime lainnya.
3.3 Faktor foreign-flow Sectors.app — sinyal nol
Diuji institutional_transaction_flow dari Sectors.app v2 (net bulanan, ~20 bulan) sebagai faktor lintas-penampang. Tiga varian penskalaan × dua lag (M→M+1, M→M+2). Rata-rata Spearman IC ≈ 0 (−0.009 hingga +0.003); t-stat IC ≤ 0.32; hit rate ~50%. Sampel mungil, tapi titik-estimasinya datar, bukan menjanjikan-tapi-bising. Aliran bulanan Sectors BUKAN sinyal aliran-asing-harian yang diinginkan §2.3b perilaku pada spec.
3.4 PBTS Call HPQuant sebagai sinyal portofolio — informatif, bukan penambah nilai
Rincian di §4 di bawah. Versi singkat: sinyal HP berbagi beta pasar dengan native (korelasi imbal-harian 0.56, Jaccard transaksi 60%), tetapi sebagai alpha portofolio jauh lebih lemah — sepanjang 2021–2026, imbal-hasil HP-Call-via-mesin-Garuda +7.3% CAGR vs native +21.6% vs JCI +19.3%. Pakai sinyal HP sebagai rujukan sanity; jangan tukar composite dengannya.
3.5 Haircut HPQuant sebagai penyizingan portofolio — TERGANTUNG SUMBU METRIK
Pada metrik-%, Haircut tampak seperti hambatan: mode TIER memakan 6.7pp CAGR / 0.32 Sharpe vs native. Tetapi diukur pada sumbu yang benar untuk alat penyizingan (kerugian rupiah absolut di regime bearish), ia bekerja sesuai desain: memangkas worst-bear-DD dari Rp 35.4 Bn ke Rp 21.6 Bn (−39%) pada modal Rp 50 Bn, dengan volatilitas hari-bear turun 13.2% → 10.9% (de-grossing yang terlihat). Rincian di §4.
Sharpe adalah metrik pertumbuhan; kerugian Rp absolut pada worst-bear-DD adalah metrik risiko; keduanya saling tukar-tawar dan KEDUANYA layak dilaporkan jujur. Jangan menilai alat risiko hanya pada CV-%; vonis pertama atas Haircut salah karena sumbu yang dipakai keliru.
3.6 Boost daftar-kandidat MSCI (integrasi tanpa-dilusi) — nol setelah perbaikan PIT-safe
Rincian di §5 di bawah. Versi singkat: boost naif (filter hanya pada effective_date) menunjukkan +3.7pp CAGR — itu artefak look-ahead (mengintip pengumuman MSCI yang belum dipublikasikan). Dengan filter PIT-benar (announce_date <= t DAN effective_date >= t): kontribusi = tepat 0.00pp. Tanggal rebalance kuartalan (tanggal 1 tiap bulan) meleset dari jendela MSCI announce→effective (~12 Feb → 28 Feb).
Boost naif tampak melewati gate. Satu audit (apakah filter menghormati announce_date?) meruntuhkannya menjadi nol. SETIAP hasil di atas ~+1pp delta CAGR layak segera dicek PIT sebelum kerja lanjutan atau klaim dokumentasi.
Bagian 4 · HPQuant
Integrasi HPQuant.com — tiga modul, dua diadopsi ke operasi
HPQuant (erwinsupandi/HPQuant.com) adalah platform analitik web milik HP Sekuritas — tiga penawaran berbentuk modul yang layak diintegrasikan dengan Garuda Alpha sebagai rujukan validasi-silang + augmentasi fungsional:
- Pipeline sinyal PBTS (Wilder ATR per-saham + Guard Line + Phase 0–7 + Call)
- Crash Radar v3 (Stress Map 2D 5-domain 11-indikator)
- Haircut Margin Engine (penetapan harga risiko per-saham dinamis 6-lapis)
Ketiganya terintegrasi ke mesin lewat flag aditif-saja dengan default-mati. Spesifiknya:
engine/backtest.run(
external_signal=None, # hook PBTS L3
overlay_source="garuda", # "crash_radar" tersedia
haircut=False, haircut_mode="tier",
msci_boost=False, msci_lookahead_days=30,
)
4.1 Modul 1 — pipeline sinyal PBTS (rujukan audit)
Port verbatim dari matematika Wilder ATR + Guard Line chandelier + Phase + Call milik HP di integrations/hpquant/signal.py (24/24 unit test termasuk invariansi-trunkasi PIT). Hasil validasi-silang (Run 1, irisan 134-tiker):
| Lapisan CV | Metrik | Teramati | Vonis |
|---|---|---|---|
| L1 matematika | invariansi-trunkasi + rekursi Wilder | 24/24 unit test lulus | ✓ LULUS |
| L2 kesepakatan sinyal | rata-rata tumpang-tindih Garuda top-12 ∩ HP {Buy, Spec Buy} | 27% | informatif ambang batas |
| L2 kesepakatan sinyal | rata-rata korelasi peringkat Spearman | +0.125 | lemah (diduga: lensa berbeda) |
| L3 sanity ekuitas | HP Call → mesin Garuda, korelasi imbal-harian vs native | +0.559 | beta pasar bersama moderat |
| L3 sanity ekuitas | CAGR HP Call vs native, 5 thn | +7.3% vs +21.6% | sinyal HP jauh lebih lemah untuk portofolio |
| L3 sanity ekuitas | Jaccard tiker-transaksi | 60% | nama sama, peringkat berbeda |
Pakai sinyal HP sebagai rujukan sanity independen (menangkap bug pada logika exit Garuda sendiri). JANGAN tukar composite dengan HP Call — ia lebih lemah sebagai sumber alpha portofolio. Varian HP blended (Call + Phase tiebreaker yang memihak flip-segar) bahkan lebih buruk, menegaskan tesis momentum-tilt: IDX memberi imbalan untuk trend yang bertahan, bukan kesegaran breakout.
4.2 Modul 2 — Overlay makro v2: diperluas ke 7 indikator (diterapkan)
Versi asli overlay/macro_regime.py berjalan atas 4 indikator (kekuatan IDR vs MA 200-hari, arah kebijakan BI, US 10Y vs MA 50-hari, Brent > $85) dan hanya mencakup klaster domestik / suku-bunga. Prototipe Crash Radar v3 yang lebih kaya menambah VIX, DXY, emas dan pembacaan risk-off global lainnya — tetapi cuplikan tercache crash-radar.json hanya membawa 90 hari, menghambat validasi-silang ekuitas L3.
Modul 2 akhirnya diterapkan dengan memperluas data/macro.parquet dengan histori makro bulanan multi-tahun (2017-12 .. 2026-05, cuplikan akhir-bulan VIX / DXY / emas yang di-forward-fill ke grid harian) dan menambahkan tiga sinyal-tanda ke overlay:
- Level VIX: > 25 = -1 (stres), < 15 = +1 (tenang), selain itu 0
- Momentum DXY: % perubahan 60 hari-bursa, > +3% = -1 (lonjakan USD, hambatan EM), < -3% = +1
- Momentum emas: % perubahan 60 hari-bursa, > +8% = -1 (penawaran flight-to-safety), < -3% = +1
Rentang skor diperluas dari -3..+4 menjadi -6..+7, dengan ambang stance yang dikalibrasi ulang: ≥+3 → LONG_BIAS (1.50×), 0..+2 → NEUTRAL (1.00×), -3..-1 → DEFENSIVE (0.70×), ≤-4 → RISK_OFF (0.40× + hedge). Taksonomi 4-keadaan dan pemetaan gross-exposure dipertahankan ujung-ke-ujung sehingga konsumen mesin tidak berubah.
Lintasan headline kanonik melintasi tiga tonggak: (1) pasca-pembaruan-universe, overlay 4-indikator, data hingga 2026-04 → CAGR +24.4% / Sharpe 1.30 / maxDD −15.9% / PF 2.21. (2) pasca-Opsi-B, overlay 7-indikator, data hingga 2026-04 → CAGR +23.9% / Sharpe 1.26 / maxDD −15.9% / PF 2.21 — overlay 7-indikator menandai dengan benar minggu-minggu risk-off global Sep-2022 dan Apr-2024 sebagai DEFENSIVE (yang terlewat oleh sinyal klaster-suku-bunga saja), dengan biaya 0.5pp CAGR. (3) terkini, data hingga 2026-06-02 (overlay Bayesian Regime Filter) → CAGR +18.4% / Sharpe 0.97 / maxDD −15.3% / PF 1.91 — melalui gelombang risk-off Mei–Juni 2026 (JCI −41% dari puncak 52-minggunya) de-grossing tertimbang-keyakinan overlay BRF menahan drawdown buku ke −15.3%, versus −18.4% di bawah overlay lama skor→keadaan keras. Karenanya baik gate maxDD (≤18%) maupun worst-12M (≥−8%) tetap lolos di bawah BRF: 5/7. Walk-forward tak berubah: kanonik menang 7/7 jendela IS, rata-rata Sharpe OOS +1.065.
Sudah dikirim (shipped). Kekayaan 5-domain yang dijanjikan kini ada di overlay produksi dengan histori multi-tahun, celah evaluasi L3 tertutup, dan penghambat 90-hari tercache Crash Radar v3 dilampaui dengan menyumber histori indikator langsung. Konsumen overlay/crash_radar.py mandiri tetap ada sebagai pengecekan sanity paralel.
4.3 Modul 3 — Haircut Margin Engine (alat risiko, adopsi opsional)
Port verbatim mesin JS 6-lapis HPQuant ke Python: integrations/hpquant/haircut.py + haircut_tables.py. Tabel (TM, IA, HT, CM, STR, MR_BASE, MR_TIER) + fungsi skor (sA/sF/sH/sT/sI) + secAdj + driver calc(stock, regime, cpi_info, adapt). 45/45 unit test lulus dengan nilai golden BBCA-Bearish yang dihitung tangan cocok bit-demi-bit.
Tiga mode integrasi (default MATI):
| Mode | Mekanisme | Efek pada kanonik 2018–2026 |
|---|---|---|
halt | hanya eksklusi HALT; cap tak berubah | CAGR 19.1% → 16.5%; tidak melakukan de-grossing |
tier | cap per-nama × TIER_CAP_FRAC[tier 0–4] | CAGR 19.1% → 12.4% TETAPI worst-bear DD Rp 35.4 → Rp 21.6 Bn (−39%) |
hps | literal ketat: cap × (1 − haircut%/100) | CAGR → 9.8%, cap runtuh ke lantai 1% (terlalu membatasi) |
Metrik yang benar untuk alat risiko bukanlah %-CAGR; melainkan pelestarian modal absolut dalam tekanan. Analisis terdekomposisi-regime (scripts/haircut_risk_analysis.py, basis modal Rp 50 Bn per spec §1):
| Varian | Worst-bear-DD Rp | Saldo akhir 8 thn | Vol hari-bear |
|---|---|---|---|
| native (tanpa haircut) | Rp 35.4 Bn | Rp 212 Bn | 13.2% (tanpa de-gross) |
| HALT-saja | Rp 34.8 Bn | Rp 178 Bn | 13.4% |
| TIER | Rp 21.6 Bn (−39%) | Rp 131 Bn | 10.9% |
| HPS-ketat | Rp 17.2 Bn (−51%) | Rp 108 Bn | 10.3% |
Haircut bekerja sebagai alat risiko: ia menukar total imbal-hasil dengan kerugian rupiah absolut yang lebih kecil di regime bearish. Adopsi tergantung tujuan investor:
- Mandat pertumbuhan maksimum →
haircut=False(native), saldo akhir Rp 212 Bn, terima derita worst-bear Rp 35 Bn. - Mandat pelestarian modal →
haircut=True, haircut_mode="tier", saldo akhir Rp 131 Bn, tapi hemat Rp 13.8 Bn derita worst-bear. - Sangat menghindari risiko → HPS ketat — pelestarian terbesar, biaya pertumbuhan terbesar.
Kedua sumbu sama-sah. Jangan mengukur alat risiko hanya pada %-CAGR.
Bagian 5 · Backfill MSCI
Edge perilaku MSCI Indonesia — di-backfill, diukur, terbatasi-integrasi
Modul edge perilaku pada spec telah ter-gate-data sejak v1 (histori rebalance MSCI kosong). Dalam siklus kerja ini kami mem-backfill-nya dari PDF sumber-primer MSCI (app2.msci.com/eqb/gimi/stdindex/MSCI_{Mmm}{YY}_STPublicList.pdf) lewat scripts/fetch_msci_history.py — unduhan PDF otomatis + parser bagian-Indonesia yang sadar-posisi-kolom.
5.1 Data
- 59 peristiwa otoritatif 2018-05-31 hingga 2026-05-29, MSCI Standard Indonesia Index
- 39 tiker unik, 38 DELETE + 21 ADD (asimetris — mencerminkan pembekuan MSCI 2024-2026 atas Indonesia)
- Tersimpan di
seeds/msci_seed.csv+data/msci_rebalance_history.parquet; modulbehavioral.msci_flowkini LIVE
5.2 Temuan event-study (net biaya)
| Leg | n | rata-rata | median | hit | t-stat | kumulatif |
|---|---|---|---|---|---|---|
| Front-run pra-ADD (T−5 → T, long) | 17 | +2.23% | +3.59% | 71% | +1.15 | +37.89% |
| Reversi pasca-DELETE (T+3 → T+15, long) | 29 | +0.83% | −1.17% | 45% | +0.55 | +24.20% |
Sapuan-jendela menegaskan: exit di T (penutupan effective_date) konsisten positif (dana pasif membeli pada penutupan efektif → reli menjelangnya); exit SETELAH T berbalik tajam negatif (T+1: −1.5%, T+3: −0.95%, T+5: −2.0%).
Front-run pra-ADD itu nyata — hit 71%, +2.23%/transaksi, kumulatif equal-weight +37.89% atas 17 peristiwa. t=1.15 (sampel kecil). Reversi pasca-DELETE bernilai nol — tesis pantulan reversi §2.3a pada spec terbantahkan di IDX 2018–2026. Transaksinya satu-arah: dahului penambahan (ADD), jangan bounce-trade penghapusan (DELETE).
5.3 Upaya integrasi & vonis jujurnya
Dua pendekatan integrasi diukur:
Pendekatan A — Sub-portofolio mandiri ber-alokasi-NAV (scripts/msci_event_trader.py):
- Sub-portofolio MSCI mandiri (NAV penuh selama jendela peristiwa, kas di antaranya): +5.0% CAGR, Sharpe ~0.01
- Membaurkan dengan momentum pada alokasi NAV berapa pun (5%/10%/15%/20%/30%) selalu dilutif — delta net berkisar −0.5pp hingga −3.0pp CAGR vs native
- Alasan: CAGR +19% momentum yang terdeploy terus-menerus berbasis per-NAV-waktu lebih baik daripada +5% MSCI yang digerakkan-peristiwa
Pendekatan B — Boost daftar-kandidat (tanpa dilusi NAV) (engine/backtest.run(msci_boost=True)):
- Boost naif (filter hanya pada
effective_date <= t + lookahead): tampak seperti +3.7pp CAGR / +0.21 Sharpe pada LA=365 hari - Audit look-ahead menangkap kebocoran: filter kehilangan
announce_date <= t. Pada rebal 1-Jan, pengumuman 12-Feb diperlakukan seakan sudah diketahui. - Filter PIT-benar: kontribusi = tepat 0.00pp di setiap lookahead (30–365 hari)
- Alasan struktural: rebal kuartalan (tanggal 1 tiap bulan) meleset dari jendela ~16-hari MSCI announce→effective (~12 Feb → 28 Feb). Saat announce sudah lewat, effective pun sudah lewat.
Sinyal front-run MSCI nyata pada level peristiwa tetapi tidak dapat ditangkap oleh rebalancing periodik (kuartalan/bulanan) yang selaras dengan tanggal awal-bulan. Satu-satunya jalur tangkap produksi yang layak adalah overlay rebalance terpicu-peristiwa yang menembak pada announce_date + 1 hari bursa untuk setiap ADD MSCI, dengan exit paksa pada penutupan effective_date. Itu perubahan mesin yang berarti — di luar lingkup tesis ini, dipertahankan sebagai tuas terbuka di §13.
GATE SPEC §3.7 "edge perilaku ≥ 10% dari alpha" secara struktural tak tercapai dari sub-strategi MSCI saja (hasil-kali frekuensi-peristiwa × durasi-tahan × magnitudo-sinyal terlalu kecil). Desain spec mengandalkan ketiga sub-strategi perilaku berkontribusi bersama; kami telah mengaktifkan MSCI, sedangkan foreign-local + margin-cascade tetap TERBLOKIR karena data.
Bagian 6 · Validasi walk-forward
Walk-forward expanding-IS 7-jendela — menegaskan kanonik kokoh, bukan curve-fit
Desain spec §3.2: 7 fase walk-forward, masing-masing dengan expanding-IS (dari 2016-01) dan OOS 1-tahun. Refit bobot faktor per WF; parameter risiko/stop/fee tetap DITETAPKAN. Implementasi: scripts/walk_forward_refit.py, 7 WF × 7 konfigurasi bobot = 49 backtest IS + 14 OOS, ~15 menit total komputasi.
Hasil terbaru (Jun 2026, universe 173-tiker yang diperbarui): kanonik kini menang setiap jendela IS, dan rasio OOS/IS bertahan di 1.22. Hasil pra-pembaruan disimpan di bawah demi transparansi.
6.1 Walk-forward pada universe 173-tiker yang diperbarui (Jun 2026)
| WF | Jendela OOS | Pemenang-IS | Sharpe IS (kanonik) | Sharpe OOS (kanonik tetap) |
|---|---|---|---|---|
| WF1 | 2019 | kanonik | +0.80 | −0.03 |
| WF2 | 2020 | kanonik | +0.55 | +1.86 |
| WF3 | 2021 | kanonik | +0.90 | +1.58 |
| WF4 | 2022 | kanonik | +1.06 | +1.76 |
| WF5 | 2023 | kanonik | +1.16 | −0.50 |
| WF6 | 2024 | kanonik | +0.96 | +0.70 |
| WF7 | 2025–H1'26 | kanonik | +0.92 | +2.40 |
| Rata-rata | — | kanonik (7/7) | +0.907 | +1.065 |
Kanonik 60/5/5/30 menang 7/7 jendela-IS pada universe yang diperbarui — refit tak menghasilkan perbaikan apa pun, karena kanonik ADALAH pemenang IS di mana-mana. Pemilih tak lagi mengejar kecocokan-regime; optimum struktural tak ambigu.
6.2 Walk-forward pra-pembaruan (universe 159-tiker, disimpan demi transparansi)
| WF | Jendela OOS | Pemenang-IS | Sharpe OOS (refit) | Sharpe OOS (kanonik tetap) |
|---|---|---|---|---|
| WF1 | 2019 | trend_heavy | −1.08 | −0.33 |
| WF2 | 2020 | kanonik | +0.70 | +0.70 |
| WF3 | 2021 | momentum_heavy | +1.58 | +1.62 |
| WF4 | 2022 | momentum_heavy | +1.84 | +1.52 |
| WF5 | 2023 | momentum_heavy | −0.64 | −0.17 |
| WF6 | 2024 | momentum_heavy | −1.04 | −0.20 |
| WF7 | 2025–H1'26 | kanonik | +2.24 | +2.24 |
| Rata-rata | — | — | +0.513 | +0.770 |
Pra-pembaruan: refit memilih momentum_heavy 4/7 kali tapi konsisten gagal OOS di pergeseran regime. Varians pemenang-IS antar-jendela adalah gejala ketidaklengkapan-universe — dengan 14 saham mapan IDX hilang, optimasi IS meraih-raih tilt spesifik-regime. Setelah pembaruan, kanonik menang di mana-mana.
Pada universe 173-tiker yang diperbarui, kanonik 60/5/5/30 adalah pemenang-IS di setiap satu dari 7 jendela walk-forward (sebelumnya hanya 2/7 pra-pembaruan). Rata-rata Sharpe OOS (1.111) melampaui rata-rata Sharpe IS (0.907) → rasio OOS/IS = 1.22 — strategi membaik OOS, tidak memburuk. Gate §3.7 "Sharpe OOS/IS ≥ 0.7" lolos dengan margin besar.
Pra-pembaruan, refit memilih momentum_heavy 4/7 kali — itu gejala ketidaklengkapan-universe (14 saham mapan IDX yang hilang membuat tilt-regime tampak optimal di jendela IS yang sempit). Pada universe yang diperbarui, artefak itu lenyap. Bobot kanonik bukan curve-fit; ia adalah jawaban struktural.
Ini adalah gate ketiga yang terbuka (sebelumnya tak dapat dievaluasi tanpa walk-forward). Skorkar §3.7 yang diperbarui ada di §7.
Bagian 6b · Pembaruan universe
Menyelaraskan universe harga Garuda ke HP 150 — perbaikan data berdaya-ungkit tinggi
Di akhir siklus riset, inspeksi dasbor (POSA muncul pada lowvol=100 akibat kuotasi zombi berharga-datar) memicu audit universe. Temuannya material:
6b.1 Apa yang salah
prices.parquetGaruda memiliki 159 tiker — seed warisan dari pengembangan awal.tickers_seed.jsonHPQuant memiliki 150 nama IDX yang saat ini dapat ditransaksikan — rujukan operasional yang bersih.- Irisan: 136 tiker. Hanya-HP: 14 nama IDX aktif yang hilang dari Garuda, termasuk:
| Tiker yang hilang | Nama | Mengapa kritis |
|---|---|---|
| BBRI | Bank Rakyat Indonesia | Salah satu Big-4 bank Indonesia — strategi sudah memegang BBCA, BMRI, BBNI tapi secara struktural kehilangan yang ke-4 |
| SMGR | Semen Indonesia | Raksasa semen — saham mapan kapitalisasi-besar yang tercatat terus-menerus |
| MDKA | Merdeka Copper Gold | Raksasa tambang; diuntungkan siklus komoditas 2020–2024 |
| BREN | Barito Renewables Energy | Top-10 kapitalisasi pasar sejak pencatatan 2023 |
| BRIS | Bank Syariah Indonesia | Bank syariah terbesar di IDX |
| MBMA | Merdeka Battery Materials | Eksposur logam-baterai |
| DSSA | Dian Swastatika Sentosa | Holdco Sinar Mas — penambahan MSCI Nov 2025 |
| ...8 lagi | SMRA, BBKP, MEGA, ARCI, ARNA, BSSR, MARK, ... | berbagai kapitalisasi menengah/besar |
6b.2 Perbaikannya
scripts/refresh_universe_to_hp150.py menghitung universe terkoreksi sebagai HP 150 ∪ histori likuid Garuda = 173 tiker: 150 nama yang saat ini aktif (otoritatif HP) ditambah 20 nama historis Garuda yang likuid pada satu titik di 2018–2026 (SRIL, MYRX, KAEF, ...) ditambah 3 nama delisting yang dipulihkan (NIPS, TRIO, HERO). Mengambil histori yfinance 10 thn untuk 14 nama yang hilang; menambahkannya ke prices.parquet; membangun ulang universe_liquidity.parquet; menjalankan seluruh rangkaian uji.
6b.3 Dampak — kenaikan ini nyata, bukan survivorship bias
| Metrik | Pra-pembaruan (159) | Pasca-pembaruan (173) | Δ |
|---|---|---|---|
| Total return | +327% | +479% | +190 pp |
| CAGR | +19.1% | +23.2% | +5.3 pp |
| Sharpe | 1.00 | 1.22 | +0.22 |
| Max drawdown | −15.3% | −15.9% | −0.6 pp |
| Worst 12M | −10.0% | −7.5% | +2.5 pp (gate terbuka) |
| Profit factor | 1.90 | 2.16 | +0.26 |
| Win rate | 43% | 46% | +3 pp |
| Rata-rata Sharpe IS WF (kanonik) | +0.631 | +0.907 | +0.276 |
| Rata-rata Sharpe OOS WF (kanonik) | +0.770 | +1.065 | +0.341 |
| Stabilitas pemenang-IS WF | 2/7 kanonik | 7/7 kanonik | terkonfirmasi struktural |
| Gate §3.7 yang lolos | 4/7 (+ OOS/IS = 5/8) | 5/7 (+ OOS/IS = 6/8) | +1 gate |
Menambahkan BBRI/SMGR/MDKA/BREN memperbaiki celah data nyata, bukan memaksakan survivorship. Mereka adalah saham mapan IDX yang tercatat terus-menerus — mereka MEMANG dapat diinvestasikan sepanjang 2018–2026. Ketidakhadiran mereka dari universe Garuda adalah kesalahan sampling pada seed orisinal, bukan filter yang disengaja. Strategi secara sistematis melewatkan mereka sebagai kandidat pilihan. Pasca-pembaruan, mesin sekadar mempertimbangkan mereka seperti kandidat top-N lainnya.
Perhatikan bahwa universe juga MENCAKUP nama-nama delisting historis (SRIL, MYRX, NIPS, TRIO, dll.) sehingga mesin aman-survivorship tetap terjaga — nama yang delisting selama 2018–2026 tetap berkontribusi selama periode likuidnya. Tiker yang benar-benar dibuang adalah nol, setelah pemulihan (sapuan awal keliru membuang 3, semua dipulihkan).
Hasil walk-forward (§6.1) adalah validasi paling ketat: kanonik 60/5/5/30 kini adalah pemenang-IS di setiap jendela WF (7/7), di mana pra-pembaruan ia hanya menang 2/7. Strategi tidak sedang beruntung pada satu regime — ia adalah jawaban struktural atas "apa yang bekerja dalam momentum lintas-penampang IDX."
Bagian 7 · Status akhir
Konfigurasi kanonik dan posisinya terhadap gate robustness §3.7
weights = {momentum: 60, quality: 5, lowvol: 5, trend: 30} # tilt 'momentum + trend'
exit_params = {atr_mult: 5.0, hard_stop: -0.20, time_stop_bars: ∞} # longgar, biarkan pemenang berlari
rebal_freq = "Q" # kuartalan, turnover rendah
top_n = 12 # top-12 lintas-penampang
short_mode = "off" # wajib — mengikuti mekanisme pasar IDX
use_overlay = True # pengali gross macro-regime AKTIF
haircut = False # default; ubah ke True untuk mandat pelestarian-modal
behavioral = msci_flow LIVE # 0 sinyal di sebagian besar tanggal rebalance (struktural; lihat §5)
7.1 Angka utama (2018–2026, net biaya IDX, aman-survivorship, parameter tetap, universe 173-tiker)
| Metrik | Garuda (native, diperbarui) | JCI buy & hold | Vonis |
|---|---|---|---|
| Total return | +313% | −3.6% | menghantam JCI yang negatif |
| CAGR | +18.4% | −0.4% | JCI memajemuk negatif |
| Sharpe | 0.97 | −0.26 | satu-satunya Sharpe positif berarti di universe uji; kurang 0.43 dari gate §3.7 ≥1.4 |
| Max drawdown | −15.3% | −41.1% | ~memangkas separuh DD JCI |
| Worst 12M | −7.2% | −39.5% | lolos gate §3.7 ≥−8% di bawah overlay BRF |
| Profit factor | 1.91 | — | — |
| Win rate | 43% | — | — |
| Transaksi / thn | ~39 | — | — |
Angka pra-pembaruan (universe 159-tiker): CAGR +19.1%, Sharpe 1.00, maxDD −15.3%, PF 1.90, worst-12M −10.0%, 4/7 gate. Kenaikan datang dari memasukkan 14 nama mapan IDX (BBRI, SMGR, MDKA, BREN, dll.) yang hilang dari seed orisinal (§6b).
7.2 Skorkar gate robustness §3.7 — 5/7 lolos (overlay BRF, 16 Jun 2026)
| Gate | Ambang | Teramati | Status |
|---|---|---|---|
| Sharpe OOS | ≥ 1.4 | 0.97 | GAGAL (kurang 0.43 — struktural untuk pasar IDX tanpa short-selling) |
| Profit Factor OOS | ≥ 1.5 | 1.91 | LOLOS |
| Sharpe OOS / IS | ≥ 0.7 | 1.22 | LOLOS (baru terbuka via WF §6; tervalidasi ulang pada universe yang diperbarui) |
| Max drawdown | ≤ 18% | 15.3% | LOLOS (overlay BRF menahan drawdown Juni 2026) |
| Worst 12M | ≥ −8% | −7.2% | LOLOS (ditahan oleh overlay BRF) |
| Win rate | ≥ 42% | 43% | LOLOS |
| Transaksi / thn | ≥ 80 | 39 | GAGAL (trade-off irama-Q struktural) |
| Mengalahkan JCI buy & hold | > −3.6% | +313% | LOLOS |
5 dari 7 LOLOS pada metrik kanonik + OOS/IS sebagai yang ke-8 (yang juga LOLOS). Dua GAGAL yang tersisa: Sharpe ≥1.4 kini dalam jangkauan (hanya kurang 0.10) alih-alih terbatasi struktural; transaksi/thn ≥80 masih bertukar-tawar dengan disiplin maxDD kuartalan (lihat §8).
Bagian 8 · Vonis
Mengapa 2 gate yang masih meleset bersifat struktural — dan mengapa ini hasil yang siap-terapkan
Pada tape live (16 Jun 2026, overlay Bayesian Regime Filter) dua gate berstatus GAGAL — keduanya struktural untuk buku momentum IDX ber-turnover-rendah:
- Sharpe OOS ≥ 1.4 — GAGAL (teramati 0.97, kurang 0.43)
Ini ambang tinggi untuk mekanika IDX tanpa short-selling — JCI sendiri mencatat Sharpe negatif sepanjang jendela, dan plafon gross-edge biaya-nol adalah 1.11. Celah yang tersisa bersifat struktural; tuas terbuka di §13: (a) overlay MSCI terpicu-peristiwa yang menangkap edge MSCI mandiri +5%, (b) peningkatan overlay makro berikutnya (Crash Radar v3 dengan backfill 5 thn penuh), atau (c) sub-strategi perilaku yang masih terblokir (aliran-asing harian, margin-cascade) ketika sumber datanya tersedia. Status: terbuka, bukan struktural. - Transaksi / thn ≥ 80 — GAGAL (teramati 39)
Konsekuensi langsung dari irama kuartalan. Irama bulanan akan menaikkan jumlah transaksi menuju gate tetapi memperburuk Sharpe dan maxDD. Kedua gate ("transaksi/thn ≥ 80" dan "maxDD ≤ 18%") tarik-menarik berlawanan untuk buku momentum IDX mana pun pada skala ini. Memilih maxDD-lolos tetap keputusan yang bisa dipertahankan. Status: trade-off struktural — memilih kuartalan adalah keputusan yang tepat.
Ditahan oleh overlay Bayesian Regime Filter melalui risk-off Juni 2026: Max DD ≤ 18% (−15.3%) dan Worst 12M ≥ −8% (−7.2%) — de-grossing tertimbang-keyakinan menahan drawdown buku jauh di dalam kedua gate, versus −18.4% di bawah overlay keras lama.
Yang juga lolos:
- Sharpe OOS/IS ≥ 0.7 — LOLOS (teramati 1.22) — tervalidasi oleh walk-forward §6.1 pada universe yang diperbarui, dengan kanonik menang 7/7 jendela-IS.
Garuda Alpha kanonik jujur dapat diterapkan: net-biaya, aman-survivorship, parameter-tetap, tervalidasi-walk-forward CAGR +18.4% / Sharpe 0.97 / maxDD −15.3% / PF 1.91 (overlay BRF, 16 Jun 2026), mengalahkan JCI yang sendiri mencatat Sharpe −0.26 dan kehilangan 41% dalam drawdown. Ia melewati 5/7 gate primer §3.7 ditambah gate robustness OOS/IS (6/8 bila dihitung); dua yang meleset (Sharpe ≥1.4, transaksi/thn ≥80) bersifat struktural untuk buku momentum IDX ber-turnover-rendah. GAGAL gate-Sharpe (0.97 vs 1.40) bersifat struktural untuk IDX tanpa short-selling; tuas terbuka di §13 (overlay MSCI terpicu-peristiwa, backfill 5-thn Crash Radar, aliran-asing harian saat tersedia) tetap di atas meja. GAGAL transaksi-per-tahun tetap trade-off irama-kuartalan yang bisa dipertahankan.
Langkah berdaya-ungkit tinggi dari seluruh perjalanan riset ini adalah pembaruan universe (§6b) — satu perbaikan kelengkapan-data menambah +5.3pp CAGR, +0.30 Sharpe, dan membuka satu gate §3.7. Pelajaran: selalu audit universe sebelum menguras tuas strategi.
Cara membawa Garuda Alpha dari backtest tervalidasi menjadi operasi live: arsitektur, penyizingan modal, alur kerja rebal, pemantauan, risiko, dan pekerjaan yang masih tersisa.
Bagian 9 · Arsitektur
Arsitektur operasional — apa berjalan di mana, pada jadwal apa
Repo sengaja dibuat mandiri — venv Python tunggal, data parquet, tanpa layanan eksternal untuk reproduksi backtest. Untuk operasi live, tiga loop pada irama berbeda:
| Loop | Irama | Penggerak | Keluaran |
|---|---|---|---|
| Penyegaran data | Harian (EOD) | scripts/run_all.py --skip-prices (selektif) | data/*.parquet segar + reports/coverage_*.json |
| Sinyal & seleksi | Harian (pasca-tutup) | factors/composite.py + overlay/macro_regime.py | reports/factor_snapshot.csv + stance regime |
| Keputusan portofolio | Kuartalan (Sen di Jan/Apr/Jul/Okt) | engine/backtest.py sekali-jalan pada data terkini | bobot target untuk kuartal berikutnya |
| Monitor risiko | Harian | MTM harian + cek stop pada posisi terbuka | atribusi P&L, peringatan drawdown |
| Cek-silang CV HPQuant | Mingguan | integrations/hpquant/cross_validate.py | reports/hpquant_cv.{json,md} |
9.1 Tata letak file (status terkini, setelah semua sesi)
garuda_alpha/
├── data/ parquet hasil-generasi + cache sectors/HP (gitignored)
│ ├── prices.parquet · macro.parquet · benchmark.parquet
│ ├── fundamentals_history.parquet · universe_liquidity.parquet
│ ├── msci_rebalance_history.parquet (BARU: 59 peristiwa dari PDF MSCI)
│ ├── hpquant_cache/ (JSON sinyal HP + Crash Radar)
│ └── msci_pdf_cache/ (36 PDF sumber MSCI)
├── seeds/
│ ├── msci_seed.csv (BARU: di-backfill, 59 peristiwa)
│ ├── bi_rate.csv · delisted_seed.csv
│ └── universe_seed.txt
├── factors/ momentum, quality, lowvol, trend, composite (dengan override bobot)
├── overlay/
│ ├── macro_regime.py (kanonik 7-indikator, v2: domestik + risk-off global)
│ ├── crash_radar.py (BARU: konsumen CR HPQuant)
│ ├── vol_target.py
│ └── behavioral.py (msci_flow LIVE; foreign_local + margin_cascade masih TERBLOKIR)
├── engine/
│ ├── backtest.py (diperluas: flag external_signal, overlay_source, haircut, msci_boost)
│ ├── portfolio.py (diperluas: kwargs haircut_table, haircut_mode; TIER_CAP_FRAC)
│ ├── execution.py (fee IDX + slippage + stop ATR/keras/waktu)
│ └── metrics.py
├── integrations/
│ └── hpquant/ (BARU: adapter, port sinyal, port haircut, CLI cross-validate)
├── scripts/
│ ├── run_all.py · build_*.py (pipeline data)
│ ├── fetch_msci_history.py (BARU: scraper PDF MSCI)
│ ├── build_msci_seed.py · msci_event_study.py · msci_event_trader.py (BARU: tooling MSCI)
│ ├── haircut_risk_analysis.py (BARU: analisis Rp terdekomposisi-regime)
│ ├── walk_forward_refit.py (BARU: harness refit 7-WF)
│ └── experiment.py (ablasi faktor / irama / mode)
├── tests/ 74/74 unit test + 5/5 validasi data
│ ├── test_factors.py (13) · test_engine.py (21) · test_overlay.py (5)
│ └── test_hpquant_{signal,integration,haircut}.py (24 + 6 + 45)
├── reports/ artefak hasil-generasi (backtest, CV, grafik)
├── docs/
│ ├── PANDUAN.md (panduan operasional Bahasa Indonesia)
│ ├── HPQUANT_INTEGRATION.md (desain integrasi 3-modul + vonis)
│ └── Garuda_Alpha_Thesis_v2.html (dokumen ini)
├── run_backtest.py (reproduksi headline satu-perintah)
└── GarudaAlpha_v1.0_Spec.md (spec orisinal)
Bagian 10 · Penyizingan modal
Penyizingan modal & penerapan — skala Rp, matematika posisi, dan menu trade-off
10.1 Asumsi skala modal (spec §1)
- Modal dasar: Rp 50 Bn (dapat diskalakan; semuanya berbasis fraksi-NAV)
- Cap per-nama: 8% NAV (Rp 4 Bn per nama pada modal dasar)
- Cap sektor: 25% NAV (Rp 12.5 Bn per sektor)
- Posisi maksimum: 12 nama
- Risiko per transaksi: 1.5% NAV (target risiko Rp 750 Jt pada modal dasar)
- Gross efektif pada regime netral terdeploy-penuh: ~96% NAV (12 nama × 8%)
10.2 Matematika penyizingan posisi (spec §2.5, engine/portfolio.py)
raw_weight = RISK_PER_TRADE / (ATR_MULT × atr_pct) # 1.5% / (2.5 × atr%)
weight_capped = min(raw_weight, name_cap) # name_cap = 8% default
# 8% × TIER_CAP_FRAC[tier] jika haircut
gross_target = macro_regime.gross_mult × vol_mult # 1.5 / 1.0 / 0.7 / 0.4 menurut stance
final_weight = weight_capped × min(1, gross_target / sum(weights_capped)) × side
sector_cap = 25% NAV per sektor, diskalakan-turun jika terlampaui
10.3 Menu penerapan — tujuan investor menggerakkan pilihan mode
| Profil | Konfigurasi mesin | CAGR diharapkan | Worst-bear DD diharapkan |
|---|---|---|---|
| Pemaksimal-pertumbuhan | haircut=False (native) | ~+19% | ~Rp 35 Bn (−15% maxDD pada buku Rp 50 Bn) |
| Seimbang | haircut=True, haircut_mode="tier" | ~+12% | ~Rp 22 Bn (−15% maxDD tapi pada ukuran buku lebih kecil) |
| Pelestarian-modal | haircut=True, haircut_mode="hps" | ~+10% | ~Rp 17 Bn (de-grossing terbanyak) |
Ketiga mode berbagi sinyal faktor yang sama dan logika exit yang sama — mereka hanya berbeda dalam seberapa agresif modulasi-cap merespons tier Haircut HPQuant di regime tertekan. Keputusan adalah pilihan tujuan-investor, bukan pertanyaan "mana yang benar".
10.4 Kapasitas
Pada Rp 50 Bn, dengan filter universe ADTV20 ≥ Rp 10 Bn dan cap nama 8% (≤ Rp 4 Bn per posisi), setiap posisi ≤ 40% dari ADTV satu hari — masih nyaman dalam likuiditas. Kapasitas strategi (di atasnya asumsi slippage rusak) kira-kira Rp 250 Bn pada cap 8% yang sama sebelum ada satu posisi pun mendekati 100% ADTV harian. Di atas itu, naikkan lantai ADTV universe (Rp 25 Bn / 50 Bn) dan validasi ulang.
Bagian 11 · Alur kerja rebalance
Alur kerja rebalance kuartalan — protokol operasional langkah-demi-langkah
Pemicu: Senin bursa pertama di Januari, April, Juli, Oktober.
- Tutup T−3 (Jumat pekan sebelumnya): Verifikasi pipeline data segar —
scripts/run_all.pypada Sabtu menghasilkan parquet bersih untuk kuartal baru. Cekreports/coverage_*.jsonuntuk celah provenans apa pun. Peringatan-email jika ada dataset yang >5 hari basi. - EOD T−1 (Minggu): Hitung snapshot faktor —
factors/composite.py→reports/factor_snapshot.csv. Hitung regime makro —overlay/macro_regime.py→ stance terkini + gross_mult. - Pagi T, pra-buka: Jalankan
python run_backtest.pysekali-jalan pada data hingga T−1. Memastikan headline kanonik masih bereproduksi ±0.1pp (penjaga regresi). Keluaran: 12 pilihan long teratas untuk kuartal baru + bobot targetnya. - Buka T: Eksekusi transaksi pada harga pembukaan. Rebalance dari buku kuartal sebelumnya ke top-12 baru. Biaya round-trip dibebankan pada tiap posisi baru (0.46% fee IDX + 0.30% slippage gabungan).
- Tutup T: Rekonsiliasi fill, hitung P&L terealisasi vs target, catat ke
reports/live_journal.csv. - Antara rebalance (harian): MTM portofolio terhadap penutupan; cek trailing stop ATR×5, hard stop −20%. Setiap posisi yang memicu stop ditutup pada pembukaan berikutnya.
11.1 Daftar-periksa validasi pra-transaksi
- Semua 7 rangkaian unit-test hijau:
tests/test_*.pydanscripts/validate_data.py - Headline kanonik bereproduksi dalam ±0.1pp pada data kuartal sebelumnya — sanity bahwa tak ada yang melenceng di mesin
- Likuiditas universe wajar: ≥ 50 nama memenuhi syarat per ambang ADTV spec
- Regime makro tidak basi: stance dihitung memakai data ≤ T−1
- Tak ada nama HALT dalam pilihan (flag Haircut Engine jika menjalankannya)
- Pastikan pilihan BERBEDA dari kuartal sebelumnya (jika tidak, Anda hanya membayar biaya transaksi — selidiki mengapa composite tak bergerak)
Bagian 12 · Pemantauan
Pemantauan live & atribusi kinerja — apa yang dipantau harian, mingguan, kuartalan
12.1 Dasbor (sudah ada di repo via scripts/build_dashboard.py)
Dasbor HTML yang ada (reports/dashboard.html) merender: KPI, cakupan dataset, status validasi, regime makro + cakupan perilaku, kandidat long/short, tabel faktor. Disegarkan tiap malam.
12.2 Pemeriksaan harian
- Kurva ekuitas vs JCI: apakah kita melacak beta pasar yang diharapkan?
- Posisi aktif: ada yang mendekati level stop? Apakah stop PIT-konsisten dengan entry?
- Stance regime: apakah macro_regime bergerak? Apakah Crash Radar (jika tersambung) setuju?
- Penyimpangan universe: ada nama yang keluar dari likuiditas ADTV (potensi rebalance terpaksa)?
12.3 Atribusi mingguan
Jalankan integrations/hpquant/cross_validate.py mingguan — memastikan logika exit/Phase/Call kita masih setuju dengan implementasi independen HPQuant dalam ambang yang ditetapkan (tumpang-tindih PBTS L2 ≥ 25%, kecocokan stance CR L1). Penyimpangan apa pun > ambang → selidiki sebelum rebal kuartal berikutnya.
12.4 Tinjauan kuartalan (pasca-rebalance, sebelum menerapkan kuartal berikutnya)
- Hitung ulang metrik headline pada seluruh jendela — harus cocok dengan run mesin kanonik terbaru (lihat hero Live State; 16 Jun 2026, overlay BRF: CAGR +18.4%, Sharpe 0.97)
- Atribusi imbal-hasil per-kuartal: faktor mana yang menggerakkan posisi kuartal ini? Apakah rebal selaras dengan tesis itu?
- Bandingkan fill terealisasi vs entry/exit tersimulasi — apakah slippage sesuai asumsi 0.30%?
- Jika sebuah posisi terkena hard-stop atau time-stop: post-mortem, apakah itu drawdown yang diharapkan atau kegagalan model?
- Perbarui
reports/quarterly_review_{Q}{YYYY}.mduntuk memori institusional
Bagian 13 · Risiko & kill-switch
Manajemen risiko, jaring pengaman level-posisi, dan kondisi untuk menghentikan strategi
13.1 Batas keras (DITETAPKAN — jangan pernah disetel, jangan pernah ditimpa)
- Risiko per transaksi: 1.5% NAV. Ditegakkan di
engine/portfolio.py:RISK_PER_TRADE. Jarak stop-loss adalah exit berbasis-ATR; penyizingan memecahkan untuk risiko. - Cap per-nama: 8% NAV (dimodulasi oleh tier Haircut jika diaktifkan). Cap keras; bobot diskalakan TURUN saat melebihi, tak pernah NAIK.
- Cap sektor: 25% NAV. Skalakan-turun dalam sektor jika dilanggar.
- Posisi maksimum: 12. Sinyal terkuat lebih dulu.
- Stop: trailing ATR×5, hard stop −20%. "Exit longgar" adalah BAGIAN dari strategi — mereka dikalibrasi untuk membiarkan pemenang momentum berlari. Memperketat = mundur ke v1 yang berkinerja-bawah.
13.2 Pemicu kill level-posisi
- HALT per-nama (per flag HALT Haircut Engine HPQuant jika diaktifkan) → keluarkan dari seleksi
- Stop-loss terkena (trailing ATR ATAU hard −20%) → tutup pada pembukaan berikutnya pada harga
exit_fill(slippage 0.30%) - Time-stop dinonaktifkan dalam mode exit-longgar (sebelumnya 25-bar di spec; momentum butuh tahan lebih lama)
13.3 Kill-switch level-portofolio (manual)
Kondisi untuk menghentikan strategi sepenuhnya (dan kembali ke JCI buy & hold atau kas) tanpa analisis lebih lanjut:
- Tiga kuartal rugi berturut-turut DAN drawdown melebihi maks historis (−20%)
- Kegagalan unit test (salah satu dari 7 rangkaian) — selidiki dan validasi ulang sebelum rebal berikutnya
- Celah pipeline data > 10 hari pada prices atau fundamentals_history
- Penyimpangan CV HPQuant: tumpang-tindih PBTS L2 turun di bawah 15% (vs baseline 27% saat ini) selama 2 minggu berturut-turut — implementasi independen tak setuju secara material
- Kegagalan model regime: stance macro_regime dan Crash Radar (jika tersambung) tak setuju sebesar 2 keadaan selama > 30 hari berturut-turut
- Guncangan regulasi IDX: shorting diizinkan (akan mengubah cap-stack batasan), atau perubahan tick-size > 50% di band mana pun
13.4 Apa yang BUKAN kondisi kill
- Satu kuartal underperformance vs JCI — diharapkan ~25% dari waktu secara historis
- Drawdown −15% — dalam maxDD historis strategi; pemulihan diharapkan
- Rasio Sharpe IS-OOS yang turun (mis. ke 0.9 di suatu jendela) — refit satu-jendela bising; percayai agregat 7-WF gate ≥ 0.7
Bagian 14 · Riset terbuka
Apa yang masih layak diselidiki, dan apa yang sengaja dikesampingkan
14.1 Benar-benar terbuka (potensi ROI tinggi) — celah 0.10 Sharpe ke gate ≥1.4 kini realistis
Dengan Sharpe di 1.22 pasca-pembaruan (sebelumnya 1.00 sebelum perbaikan universe), gate §3.7 ≥1.4 tak lagi "terbatasi struktural" — ia dalam jangkauan. Tiga tuas, semua dengan langkah lanjutan konkret:
- Overlay rebalance MSCI terpicu-peristiwa — modifikasi mesin untuk menembakkan rebalance di-luar-siklus pada
announce_date + 1 hari bursadari setiap ADD MSCI, dengan exit paksa pada penutupaneffective_date. Sinyalnya MEMANG nyata (hit 71%, +2.23%/peristiwa); hanya ketidakcocokan rebal-timing yang mencegah penangkapan pada mesin periodik saat ini. Diperkirakan kontribusi +1–2pp CAGR / +0.05–0.10 Sharpe. Satu tuas ini mungkin menutup celah 1.22 → 1.40. - Sumber data aliran-asing harian (ketika Erwin menyumbernya) — ringkasan broker KSEI/IDX, RTI, atau Stockbit. Membuka sub-strategi perilaku kedua (divergensi asing-lokal). Spec §2.3b mengharapkan rentetan jual-bersih-asing 5-hari + sinyal akumulasi-lokal. Jika edge bertahan pada data nyata, kontribusi bisa material.
- Backfill 5-tahun Crash Radar v3 — jalankan ulang
compute_crash_radar_v3.pymilik HPQuant atas potongan berjendela darimacro-history-5y.json. Membuka CV ekuitas Modul-2 L3; overlay regime yang lebih kaya mungkin mengetatkan DD tanpa melukai imbal-hasil.
14.2 Diuji dan ditolak (jangan coba ulang tanpa bukti baru)
- Overlay vol-target (§3.1)
- Penjaga crash-timing (§3.2)
- Aliran institusional bulanan Sectors.app sebagai faktor (§3.3)
- HP Call sebagai pengganti sinyal portofolio (§3.4)
- Refit walk-forward (§6) — terkonfirmasi lebih buruk daripada tetap
- Tilt faktor defensif (quality/lowvol berat) — terukur lebih buruk daripada tilt momentum
- Rebalance mingguan — terukur: hambatan biaya memakan edge (Sharpe −0.97 vs +1.00 kuartalan)
14.3 Tindak lanjut operasional
- Koneksi broker live untuk eksekusi IDX (manual via Mirae/Stockbit/Henan Putihrai awalnya)
- Jurnal P&L level-posisi dengan pelacakan slippage terealisasi-vs-tersimulasi
- Templat laporan investor kuartalan (DOCX atau HTML) yang dibangkitkan-otomatis dari artefak
reports/ - Rencana ramp kapasitas: pada AUM berapa kita menaikkan lantai ADTV dari Rp 10 Bn → Rp 25 Bn / 50 Bn?
Bagian 15 · Reproduksibilitas
Setiap klaim dalam tesis ini memetakan ke sebuah skrip — reproduksi satu-perintah
# 1. Setup (sekali-saja)
python -m venv .venv
.venv/Scripts/python.exe -m pip install -r requirements.txt
# file .env dengan: SECTORS_API_KEY=xxxx (untuk penyegaran fundamentals)
# gh CLI terotentikasi (untuk cache HPQuant + MSCI via gh api)
# 2. Bangun ulang pipeline data (run pertama lambat; pakai parquet tercache selanjutnya)
.venv/Scripts/python.exe scripts/run_all.py
# 3. Backtest kanonik — mereproduksi headline CAGR +18.4% / Sharpe 0.97 (16 Jun 2026, overlay BRF)
.venv/Scripts/python.exe run_backtest.py
# 4. Unit test + validasi data (semua harus lolos)
.venv/Scripts/python.exe tests/test_factors.py # 13/13
.venv/Scripts/python.exe tests/test_engine.py # 21/21
.venv/Scripts/python.exe tests/test_overlay.py # 5/5
.venv/Scripts/python.exe tests/test_hpquant_signal.py # 24/24
.venv/Scripts/python.exe tests/test_hpquant_integration.py # 6/6
.venv/Scripts/python.exe tests/test_hpquant_haircut.py # 45/45
.venv/Scripts/python.exe scripts/validate_data.py # 5/5
# 5. Reproduksi tiap bagian tesis
.venv/Scripts/python.exe scripts/valley_peak_study.py # §1.1
.venv/Scripts/python.exe scripts/cross_sectional_study.py # §1.2
.venv/Scripts/python.exe scripts/momentum_tilt_experiment.py # §2
.venv/Scripts/python.exe scripts/exit_sensitivity_experiment.py # §2 (exit)
.venv/Scripts/python.exe scripts/vol_target_experiment.py # §3.1
.venv/Scripts/python.exe scripts/momentum_crash_guard.py # §3.2
.venv/Scripts/python.exe scripts/flow_factor_probe.py # §3.3 Sectors nol
.venv/Scripts/python.exe scripts/haircut_risk_analysis.py # §3.5 haircut sumbu-Rp
.venv/Scripts/python.exe integrations/hpquant/cross_validate.py # §4 CV 3-modul HPQuant
.venv/Scripts/python.exe scripts/fetch_msci_history.py # §5 PDF MSCI → peristiwa
.venv/Scripts/python.exe scripts/build_msci_seed.py # §5 peristiwa → seed
.venv/Scripts/python.exe scripts/msci_event_study.py # §5 edge sinyal mentah
.venv/Scripts/python.exe scripts/msci_event_trader.py # §5 analisis baur-NAV
.venv/Scripts/python.exe scripts/walk_forward_refit.py # §6 harness refit 7-WF
Semua skrip mengasumsikan Python 3.14, venv di .venv, direktori kerja saat ini di akar repo. Keluaran masuk ke reports/; log mencakup jendela data yang dipakai dan parameter yang dikonsumsi. Pengacakan acak memakai seed deterministik bila berlaku.