Garuda Alpha · Tesis Riset
EN ID

Garuda Alpha v2 — Tesis Komprehensif & Peta Jalan Implementasi

Dari satu pertanyaan tentang pola visual pada grafik IDX menjadi strategi momentum IDX yang tervalidasi secara walk-forward (validasi maju), terintegrasi dengan HPQuant, dilengkapi backfill perilaku MSCI, dan kerangka risiko yang siap diterapkan.

Jendela 2018–2026 · aman terhadap survivorship (bias bertahan-hidup) · net biaya IDX (0.46% RT) · parameter DITETAPKAN tetap di seluruh jendela (praktis seluruh periode bersifat out-of-sample) · 119/119 unit test hijau · tervalidasi walk-forward OOS 7-jendela
📌 Metrik utama adalah cuplikan dari run mesin kanonik — 16 Jun 2026, overlay BRF (data hingga 2026-06-02), diperbarui manual pada tiap revisi tesis. Untuk angka harian terkini lihat Garuda Alpha — Live State.

Tesis ini mendokumentasikan keseluruhan perjalanan riset hingga kini — setiap temuan yang jujur, termasuk yang negatif, dan bagaimana temuan-temuan negatif itu membentuk strategi kanonik. Bagian II kemudian memaparkan peta jalan implementasi untuk menerapkan Garuda Alpha sebagai operasi nyata (live). Setiap klaim didukung oleh skrip yang dapat direproduksi (§Reproduksibilitas); setiap angka empiris yang dikutip dapat direproduksi di dalam mesin pada direktori engine/.

CAGR (net)
+18.4%
net, parameter tetap, 8.3 thn
Sharpe
0.97
di bawah gate §3.7 1.4 — struktural untuk pasar IDX (tanpa short-selling)
Max DD
−15.3%
vs JCI −41% (memangkas separuh)
Profit Factor
1.91
win rate 43%
Worst 12M
−7.2%
gate ≥−8% ✓ ditahan oleh overlay BRF
Gate §3.7
5 / 7
+ OOS/IS 1.22 (ke-8, ✓)
Konfigurasi utama momtrend_quarterly_loose pada universe 173-tiker yang telah diperbarui (HP 150 ∪ histori likuid Garuda). vs JCI buy & hold −3.6% / Sharpe −0.26 / maxDD −41%. Batasan: dibangun secara native untuk mekanisme pasar IDX (tanpa short selling). Terverifikasi: backfill perilaku MSCI (59 peristiwa dari PDF sumber primer), CV 3-modul HPQuant (PBTS / Crash Radar / Haircut), dan refit walk-forward expanding 7-jendela (Sharpe OOS/IS 1.22, gate ≥0.7 ✓).

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.

IstilahPenjelasan (Bahasa Indonesia)
CAGRCompound Annual Growth Rate — tingkat pertumbuhan majemuk tahunan. Mengukur rata-rata pertumbuhan modal per tahun jika keuntungan terus diinvestasikan kembali secara konsisten.
Sharpe ratioRasio imbal-hasil terhadap risiko (volatilitas). Semakin tinggi, semakin besar keuntungan yang diperoleh untuk setiap unit gejolak harga yang ditanggung.
SortinoMirip 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 12MImbal-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 ratePersentase transaksi yang menghasilkan keuntungan. Win rate rendah bisa tetap profit selama transaksi menang jauh lebih besar daripada yang kalah.
ExpectancyEkspektasi 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 overlayLapisan 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-VolTrend = kekuatan arah harga; Quality = kesehatan fundamental perusahaan; Low-Vol = preferensi saham bergejolak rendah. Faktor-faktor ini digabung untuk menilai saham.
Composite scoreSkor gabungan tertimbang dari beberapa faktor (momentum, trend, quality, low-vol) untuk memberi satu peringkat tunggal per saham.
Top-N selectionMemilih N saham peringkat teratas berdasarkan composite score pada tiap rebalance (di sini N=12), bukan memakai ambang skor mutlak.
ATR & trailing stopATR (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.
UniverseKumpulan saham yang menjadi kandidat pilihan strategi. Di sini universe terdiri dari 173 tiker IDX.
Survivorship biasBias 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 biasBias 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-forwardValidasi 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.7Sekumpulan 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.
DecilePembagian 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).
BetaUkuran seberapa kuat sebuah saham atau portofolio ikut bergerak mengikuti pasar. Beta tinggi berarti naik-turun lebih tajam dari pasar.
MSCI rebalance / behavioral edgeMSCI 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.
HaircutPemotongan: 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-switchTombol 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.

Negatif #1 · pewaktuan

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.
Temuan · pivot ke momentum

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:

TuasAlasanLangkah 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
Sharpe kumulatif seiring tuas ditumpuk
v1 default spec
−0.97
+ seleksi top-N
−0.12
+ tilt momentum
+0.30
+ exit longgar + kuartalan
1.00
Kanonik · momtrend_quarterly_loose · net biaya · aman-survivorship · parameter tetap · seluruh jendela OOS · universe 173-tiker yang diperbarui
CAGR +18.4% · Sharpe 0.97 · maxDD −15.3% · PF 1.91 · win 43% · ~39 transaksi/thn · 5/7 gate §3.7

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.

Pembaruan — pembaruan universe Jun 2026

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.

Negatif · vol-target

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).

Negatif · penjaga crash

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.

Pelajaran · ukur pada sumbu yang benar

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).

Pelajaran · audit PIT untuk setiap "alpha gratis" > 1pp

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:

  1. Pipeline sinyal PBTS (Wilder ATR per-saham + Guard Line + Phase 0–7 + Call)
  2. Crash Radar v3 (Stress Map 2D 5-domain 11-indikator)
  3. 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 CVMetrikTeramatiVonis
L1 matematikainvariansi-trunkasi + rekursi Wilder24/24 unit test lulus✓ LULUS
L2 kesepakatan sinyalrata-rata tumpang-tindih Garuda top-12 ∩ HP {Buy, Spec Buy}27%informatif ambang batas
L2 kesepakatan sinyalrata-rata korelasi peringkat Spearman+0.125lemah (diduga: lensa berbeda)
L3 sanity ekuitasHP Call → mesin Garuda, korelasi imbal-harian vs native+0.559beta pasar bersama moderat
L3 sanity ekuitasCAGR HP Call vs native, 5 thn+7.3% vs +21.6%sinyal HP jauh lebih lemah untuk portofolio
L3 sanity ekuitasJaccard tiker-transaksi60%nama sama, peringkat berbeda
Vonis · Modul 1

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.

Vonis · Modul 2

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):

ModeMekanismeEfek pada kanonik 2018–2026
halthanya eksklusi HALT; cap tak berubahCAGR 19.1% → 16.5%; tidak melakukan de-grossing
tiercap 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%)
hpsliteral 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):

VarianWorst-bear-DD RpSaldo akhir 8 thnVol hari-bear
native (tanpa haircut)Rp 35.4 BnRp 212 Bn13.2% (tanpa de-gross)
HALT-sajaRp 34.8 BnRp 178 Bn13.4%
TIERRp 21.6 Bn (−39%)Rp 131 Bn10.9%
HPS-ketatRp 17.2 Bn (−51%)Rp 108 Bn10.3%
Vonis · Modul 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 maksimumhaircut=False (native), saldo akhir Rp 212 Bn, terima derita worst-bear Rp 35 Bn.
  • Mandat pelestarian modalhaircut=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; modul behavioral.msci_flow kini LIVE

5.2 Temuan event-study (net biaya)

Legnrata-ratamedianhitt-statkumulatif
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%).

Temuan · sinyal MSCI

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.
Vonis · integrasi MSCI

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)

WFJendela OOSPemenang-ISSharpe IS (kanonik)Sharpe OOS (kanonik tetap)
WF12019kanonik+0.80−0.03
WF22020kanonik+0.55+1.86
WF32021kanonik+0.90+1.58
WF42022kanonik+1.06+1.76
WF52023kanonik+1.16−0.50
WF62024kanonik+0.96+0.70
WF72025–H1'26kanonik+0.92+2.40
Rata-ratakanonik (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)

WFJendela OOSPemenang-ISSharpe OOS (refit)Sharpe OOS (kanonik tetap)
WF12019trend_heavy−1.08−0.33
WF22020kanonik+0.70+0.70
WF32021momentum_heavy+1.58+1.62
WF42022momentum_heavy+1.84+1.52
WF52023momentum_heavy−0.64−0.17
WF62024momentum_heavy−1.04−0.20
WF72025–H1'26kanonik+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.

Sharpe OOS per WF pada universe yang diperbarui — kanonik 60/5/5/30 pemenang-IS 7/7
WF1 2019
−0.03
WF2 2020
+1.86
WF3 2021
+1.58
WF4 2022
+1.76
WF5 2023
−0.50
WF6 2024
+0.70
WF7 2025–H1'26
+2.40
Temuan · kanonik terkonfirmasi optimal secara struktural

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.parquet Garuda memiliki 159 tiker — seed warisan dari pengembangan awal.
  • tickers_seed.json HPQuant 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 hilangNamaMengapa kritis
BBRIBank Rakyat IndonesiaSalah satu Big-4 bank Indonesia — strategi sudah memegang BBCA, BMRI, BBNI tapi secara struktural kehilangan yang ke-4
SMGRSemen IndonesiaRaksasa semen — saham mapan kapitalisasi-besar yang tercatat terus-menerus
MDKAMerdeka Copper GoldRaksasa tambang; diuntungkan siklus komoditas 2020–2024
BRENBarito Renewables EnergyTop-10 kapitalisasi pasar sejak pencatatan 2023
BRISBank Syariah IndonesiaBank syariah terbesar di IDX
MBMAMerdeka Battery MaterialsEksposur logam-baterai
DSSADian Swastatika SentosaHoldco Sinar Mas — penambahan MSCI Nov 2025
...8 lagiSMRA, 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

MetrikPra-pembaruan (159)Pasca-pembaruan (173)Δ
Total return+327%+479%+190 pp
CAGR+19.1%+23.2%+5.3 pp
Sharpe1.001.22+0.22
Max drawdown−15.3%−15.9%−0.6 pp
Worst 12M−10.0%−7.5%+2.5 pp (gate terbuka)
Profit factor1.902.16+0.26
Win rate43%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 WF2/7 kanonik7/7 kanonikterkonfirmasi struktural
Gate §3.7 yang lolos4/7 (+ OOS/IS = 5/8)5/7 (+ OOS/IS = 6/8)+1 gate
Mengapa ini bukan survivorship bias

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

Konfigurasi kanonik (siap-produksi per Juni 2026)
momtrend_quarterly_loose
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)

MetrikGaruda (native, diperbarui)JCI buy & holdVonis
Total return+313%−3.6%menghantam JCI yang negatif
CAGR+18.4%−0.4%JCI memajemuk negatif
Sharpe0.97−0.26satu-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 factor1.91
Win rate43%
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)

GateAmbangTeramatiStatus
Sharpe OOS≥ 1.40.97GAGAL (kurang 0.43 — struktural untuk pasar IDX tanpa short-selling)
Profit Factor OOS≥ 1.51.91LOLOS
Sharpe OOS / IS≥ 0.71.22LOLOS (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≥ 8039GAGAL (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:

  1. 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.
  2. 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.
Vonis riset akhir

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.

Bagian II
Peta jalan implementasi

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:

LoopIramaPenggerakKeluaran
Penyegaran dataHarian (EOD)scripts/run_all.py --skip-prices (selektif)data/*.parquet segar + reports/coverage_*.json
Sinyal & seleksiHarian (pasca-tutup)factors/composite.py + overlay/macro_regime.pyreports/factor_snapshot.csv + stance regime
Keputusan portofolioKuartalan (Sen di Jan/Apr/Jul/Okt)engine/backtest.py sekali-jalan pada data terkinibobot target untuk kuartal berikutnya
Monitor risikoHarianMTM harian + cek stop pada posisi terbukaatribusi P&L, peringatan drawdown
Cek-silang CV HPQuantMingguanintegrations/hpquant/cross_validate.pyreports/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

ProfilKonfigurasi mesinCAGR diharapkanWorst-bear DD diharapkan
Pemaksimal-pertumbuhanhaircut=False (native)~+19%~Rp 35 Bn (−15% maxDD pada buku Rp 50 Bn)
Seimbanghaircut=True, haircut_mode="tier"~+12%~Rp 22 Bn (−15% maxDD tapi pada ukuran buku lebih kecil)
Pelestarian-modalhaircut=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.

  1. Tutup T−3 (Jumat pekan sebelumnya): Verifikasi pipeline data segar — scripts/run_all.py pada Sabtu menghasilkan parquet bersih untuk kuartal baru. Cek reports/coverage_*.json untuk celah provenans apa pun. Peringatan-email jika ada dataset yang >5 hari basi.
  2. EOD T−1 (Minggu): Hitung snapshot faktor — factors/composite.pyreports/factor_snapshot.csv. Hitung regime makro — overlay/macro_regime.py → stance terkini + gross_mult.
  3. Pagi T, pra-buka: Jalankan python run_backtest.py sekali-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.
  4. 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).
  5. Tutup T: Rekonsiliasi fill, hitung P&L terealisasi vs target, catat ke reports/live_journal.csv.
  6. 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_*.py dan scripts/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)

  1. 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)
  2. Atribusi imbal-hasil per-kuartal: faktor mana yang menggerakkan posisi kuartal ini? Apakah rebal selaras dengan tesis itu?
  3. Bandingkan fill terealisasi vs entry/exit tersimulasi — apakah slippage sesuai asumsi 0.30%?
  4. Jika sebuah posisi terkena hard-stop atau time-stop: post-mortem, apakah itu drawdown yang diharapkan atau kegagalan model?
  5. Perbarui reports/quarterly_review_{Q}{YYYY}.md untuk 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:

  1. Tiga kuartal rugi berturut-turut DAN drawdown melebihi maks historis (−20%)
  2. Kegagalan unit test (salah satu dari 7 rangkaian) — selidiki dan validasi ulang sebelum rebal berikutnya
  3. Celah pipeline data > 10 hari pada prices atau fundamentals_history
  4. 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
  5. Kegagalan model regime: stance macro_regime dan Crash Radar (jika tersambung) tak setuju sebesar 2 keadaan selama > 30 hari berturut-turut
  6. 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:

  1. Overlay rebalance MSCI terpicu-peristiwa — modifikasi mesin untuk menembakkan rebalance di-luar-siklus pada announce_date + 1 hari bursa dari setiap ADD MSCI, dengan exit paksa pada penutupan effective_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.
  2. 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.
  3. Backfill 5-tahun Crash Radar v3 — jalankan ulang compute_crash_radar_v3.py milik HPQuant atas potongan berjendela dari macro-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.