Lampiran
Lampiran
Bagian ini berisi detail teknis tambahan dan data pendukung yang relevan dengan penelitian CanonMR Integrated Valuation Model (CIVM). Tujuannya adalah memberikan penjelasan lebih mendalam tentang implementasi algoritma, komponen teknis, dan rencana penelitian lanjutan.
A.1. Pseudocode Detail Algoritma CIVM (Komponen Valuasi)
Bagian ini berisi pseudocode rinci untuk Komponen 1: Valuasi Fundamental CanonMR, seperti yang diinterpretasikan dari file hitunghargawajar.txt. Implementasi ini merupakan inti dari komponen valuasi CIVM yang menggabungkan metode Graham dengan pembobotan berbasis volatilitas (CV) dan penyesuaian DPR.
// Pseudocode Komponen Valuasi CIVM
function hitungNilaiWajar(saham, data_historis, currentBondYield) {
// 1. Ekstrak data kuartalan
income_q = data_historis.laba_bersih_kuartalan;
dividend_cash_q = data_historis.dividen_tunai_kuartalan;
dividend_stock_q = data_historis.dividen_saham_kuartalan;
equity = data_historis.ekuitas_kuartalan;
outstanding_shares = data_historis.jumlah_saham_beredar;
// 2. Hitung TTM dan metrik dasar
metrics = {};
metrics['ttmIncome'] = sum(income_q[-4:]);
metrics['ttmEPS'] = metrics['ttmIncome'] / outstanding_shares[-1];
metrics['bvps'] = equity[-1] / outstanding_shares[-1];
metrics['ttmROE'] = metrics['ttmIncome'] / equity[-1];
// 3. Hitung total dividen dan DPR
totalDividend = sum(dividend_cash_q[-4:]) + sum(dividend_stock_q[-4:]);
metrics['dividendPayoutRatio'] = totalDividend / metrics['ttmIncome'];
// 4. Hitung pertumbuhan dan CV
bvps_historical = [equity[i] / outstanding_shares[i] for i in range(len(equity))];
bvps_growth = [100*(bvps_historical[i]/bvps_historical[i-1]-1) for i in range(1, len(bvps_historical))];
metrics['ttmBookValueGrowth'] = mean(bvps_growth[-4:]);
// Hitung CV (Coefficient of Variation) untuk stabilitas
if mean(bvps_growth[-4:]) != 0:
metrics['ttmBookValueCV'] = stdev(bvps_growth[-4:]) / abs(mean(bvps_growth[-4:]));
else:
metrics['ttmBookValueCV'] = 999; // Nilai tinggi jika mean = 0
// Metrik ROE TTM dan CV
roe_historical = [income_q[i] / equity[i] for i in range(len(income_q))];
roe_growth = [100*(roe_historical[i]/roe_historical[i-1]-1) for i in range(1, len(roe_historical))];
metrics['ttmROEGrowth'] = mean(roe_growth[-4:]);
if mean(roe_growth[-4:]) != 0:
metrics['ttmROECV'] = stdev(roe_growth[-4:]) / abs(mean(roe_growth[-4:]));
else:
metrics['ttmROECV'] = 999;
// 5. Hitung Graham Number (GN)
metrics['grahamNumber'] = floor(sqrt(22.5 * max(0, metrics['ttmEPS']) * max(0, metrics['bvps'])));
// 6. Hitung Graham Formula Termodifikasi (CanonMR)
// Modifikasi pertumbuhan untuk mengatasi nilai negatif
G = metrics['ttmBookValueGrowth'];
if G >= 0:
G_adj = G;
else:
G_adj = max(exp(G) - 1, -0.1); // Transformasi logaritmik dibatasi -10%
metrics['grahamFormulaMod'] = floor(max(0, metrics['ttmEPS']) * (8.5 + 2*G_adj) * (4.4/currentBondYield));
// 7. Kombinasi Hibrida Graham dengan Pembobotan CV
// Bobot berdasarkan inverse dari CV (stabilitas lebih tinggi, bobot lebih tinggi)
if metrics['ttmBookValueCV'] + metrics['ttmROECV'] == 0:
GN_weight = 0.5; // Jika tidak ada variasi, bobot sama
else:
// Rumus pembobotan kompleks berdasarkan CV
// Semakin stabil BVPS, semakin besar bobot GN
GN_weight = metrics['ttmROECV'] / (metrics['ttmBookValueCV'] + metrics['ttmROECV']);
GF_weight = 1 - GN_weight;
metrics['combinedFairPriceRaw'] = floor(GN_weight * metrics['grahamNumber'] + GF_weight * metrics['grahamFormulaMod']);
// 8. Penyesuaian Berdasarkan DPR
dpr = metrics['dividendPayoutRatio'];
// Rentang DPR optimal (contoh: 28%-42%)
dpr_min = 0.28;
dpr_max = 0.42;
// Faktor penyesuaian DPR
if dpr < dpr_min:
// Penalti untuk DPR rendah
dpr_adjustment = 1 - (dpr_min - dpr) * 2;
else if dpr > dpr_max:
// Bonus terbatas untuk DPR tinggi
dpr_adjustment = 1 + min(0.1, (dpr - dpr_max) * 0.5);
else:
dpr_adjustment = 1.0; // Dalam rentang optimal
// Nilai wajar final
metrics['adjustedFairPrice'] = floor(metrics['combinedFairPriceRaw'] * dpr_adjustment);
return metrics;
}
Konsep Kunci dalam Algoritma Valuasi:
- TTM (Trailing Twelve Months): Menggunakan data 4 kuartal terakhir untuk mengurangi efek sesonalitas
- Coefficient of Variation (CV): Mengukur volatilitas relatif pertumbuhan untuk menentukan bobot Graham Number vs Graham Formula
- Transformasi Logaritmik Pertumbuhan Negatif: Mengatasi masalah pertumbuhan negatif dengan pendekatan matematika yang lebih nuansa
- Pembobotan Dinamis Berbasis CV: Memberikan preferensi pada metode valuasi yang lebih sesuai dengan karakteristik stabilitas perusahaan
- Penyesuaian DPR: Memperhitungkan aspek kebijakan dividen dengan memberikan preferensi pada rasio pembayaran yang optimal
A.2. Detail Indikator Teknikal dan Aturan Sinyal
Bagian ini menjelaskan perhitungan matematis dan aturan sinyal untuk indikator TA yang digunakan dalam analisisteknikal.txt. Indikator-indikator ini dievaluasi dengan bobot tertentu untuk menghasilkan rekomendasi yang digunakan sebagai filter keputusan dalam komponen pengelolaan dinamis CIVM.
Moving Averages (SMA, EMA)
Rata-rata pergerakan harga selama periode tertentu. Digunakan untuk mengidentifikasi tren dan sinyal crossover.
SMA(n) = (P1 + P2 + ... + Pn) / n
EMA(t) = (Pt × k) + (EMAt-1 × (1 - k))
dimana k = 2/(n+1)
MACD (Moving Average Convergence Divergence)
Indikator momentum yang menunjukkan hubungan antara dua EMA dari harga saham.
MACD Line = EMA(12) - EMA(26)
Signal Line = EMA(9) dari MACD Line
Histogram = MACD Line - Signal Line
RSI (Relative Strength Index)
Indikator momentum yang mengukur kecepatan dan perubahan pergerakan harga.
RSI = 100 - (100 / (1 + RS))
RS = Rata-rata Gain / Rata-rata Loss
Bollinger Bands
Pita volatilitas yang diplot pada beberapa deviasi standar di atas dan di bawah SMA.
Middle Band = SMA(20)
Upper Band = SMA(20) + (2 × StdDev)
Lower Band = SMA(20) - (2 × StdDev)
// Pseudocode Pembentukan Rekomendasi Teknikal
function generateRecommendation(data, optimizedWeights=null) {
// Menghitung indikator
sma20 = calculateSMA(data.close, 20);
sma50 = calculateSMA(data.close, 50);
sma200 = calculateSMA(data.close, 200);
ema9 = calculateEMA(data.close, 9);
ema20 = calculateEMA(data.close, 20);
ema50 = calculateEMA(data.close, 50);
macd = calculateMACD(data.close, 12, 26, 9); // Hasil berisi macd_line, signal_line, histogram
rsi = calculateRSI(data.close, 14);
bollinger = calculateBollingerBands(data.close, 20, 2); // Upper, Middle, Lower
// ...dan seterusnya untuk indikator lainnya...
// Default weights jika optimized weights tidak tersedia
weights = optimizedWeights || {
'sma_ema': 20,
'macd': 15,
'rsi': 15,
'bollinger': 10,
'ichimoku': 15,
'stochastic': 10,
'candlestick': 10,
'divergence': 5
};
// Inisialisasi kekuatan buy dan sell
buyStrength = 0;
sellStrength = 0;
totalWeight = 0;
// Evaluasi SMA/EMA
if (sma20[-1] > sma50[-1] && sma50[-1] > sma200[-1]) {
buyStrength += weights['sma_ema'];
} else if (sma20[-1] < sma50[-1] && sma50[-1] < sma200[-1]) {
sellStrength += weights['sma_ema'];
}
totalWeight += weights['sma_ema'];
// Evaluasi MACD
if (macd.histogram[-1] > 0 && macd.histogram[-1] > macd.histogram[-2]) {
buyStrength += weights['macd'];
} else if (macd.histogram[-1] < 0 && macd.histogram[-1] < macd.histogram[-2]) {
sellStrength += weights['macd'];
}
totalWeight += weights['macd'];
// Evaluasi RSI
if (rsi[-1] < 30) {
buyStrength += weights['rsi'];
} else if (rsi[-1] > 70) {
sellStrength += weights['rsi'];
}
totalWeight += weights['rsi'];
// ...dan seterusnya untuk indikator lainnya...
// Normalisasi kekuatan buy dan sell (persentase)
buyStrength = (buyStrength / totalWeight) * 100;
sellStrength = (sellStrength / totalWeight) * 100;
// Tentukan rekomendasi
if (buyStrength >= 60) {
return "BUY";
} else if (sellStrength >= 60) {
return "SELL";
} else {
return "HOLD";
}
}
Dalam CIVM, rekomendasi teknikal digunakan hanya sebagai filter untuk keputusan transaksi dalam komponen pengelolaan dinamis, bukan sebagai sinyal alokasi dasar. Misalnya, keputusan pembelian saham tertentu saat rebalancing hanya dieksekusi jika rekomendasi teknikalnya adalah 'BUY'.
A.3. Detail Adaptasi Z-Score
Bagian ini menjelaskan mekanisme adaptasi Z-Score yang digunakan dalam ZScoreUtilsv2.txt dan file kalkulator spesifik. Adaptasi dilakukan dalam dua dimensi: (1) threshold interpretasi yang spesifik per sektor, dan (2) bobot komponen rasio yang disesuaikan dengan struktur modal perusahaan.
Tabel A.3.1: Perbandingan Threshold Z-Score per Sektor
| Kalkulator | 'Safe' Threshold | 'Grey Zone' Threshold | 'Distress' Threshold |
|---|---|---|---|
| General (Default) | ≥ 2.99 | 1.81 - 2.98 | ≤ 1.80 |
| Bank | ≥ 2.60 | 1.10 - 2.59 | ≤ 1.09 |
| Consumer Non-Cyclicals | ≥ 2.75 | 1.50 - 2.74 | ≤ 1.49 |
Komponen Rasio Z-Score dan Adaptasi Bobot
Z-Score dalam CIVM menggunakan hingga 10 rasio keuangan (X1-X10) yang mencakup aspek likuiditas, profitabilitas, leverage, efisiensi, dan stabilitas. Rasio-rasio ini diberi bobot berbeda berdasarkan struktur modal perusahaan:
Variabel weightEquity biasanya adalah total ekuitas perusahaan, namun dapat berupa aset total atau liabilitas total tergantung pada konteks dan struktur modal perusahaan. Nilai weights_correlation adalah bobot dasar yang telah ditentukan untuk setiap rasio.
Keunggulan Adaptasi Z-Score dalam CIVM:
- Kontekstual Industri: Threshold yang disesuaikan mengakui perbedaan karakteristik risiko antar sektor (misalnya, bank secara inheren lebih leveraged)
- Personalisasi Struktur Modal: Bobot yang disesuaikan mengakui perbedaan signifikansi komponen rasio berdasarkan struktur modal spesifik perusahaan
- Sensitivitas Tepat Waktu: Perhitungan bobot yang dinamis memungkinkan adaptasi terhadap perubahan struktur modal perusahaan dari waktu ke waktu
- Filter Efektif: Status Z-Score ('Safe', 'Grey Zone', 'Distress') menjadi filter risiko kebangkrutan yang efektif dalam penghitungan CIVM Score
A.4. Rencana Timeline Penelitian Lanjutan
Berikut adalah timeline indikatif untuk penelitian validasi empiris CIVM, sebagai peta jalan pengembangan dan validasi kerangka kerja secara komprehensif:
Pengumpulan dan pembersihan data historis lengkap (BEI, 2015-2024), termasuk laporan keuangan, data harga, dan informasi korporasi lainnya.
- Ekstraksi data keuangan kuartalan dari BEI
- Standarisasi format data untuk analisis
- Pengisian nilai yang hilang dengan metode yang tepat
- Penyesuaian data untuk aksi korporasi (stock split, dll.)
Implementasi penuh algoritma CIVM dalam platform backtesting (Python), dengan fokus pada reproduksi akurat dari semua komponen CIVM.
- Implementasi kalkulator nilai wajar
- Implementasi kalkulator Z-Score adaptif
- Implementasi analisis teknikal
- Implementasi algoritma alokasi Sainte-Laguë
- Implementasi mekanisme rebalancing aktif
Pelaksanaan backtesting In-Sample untuk kalibrasi parameter, menggunakan data 2015-2020 untuk mengoptimalkan parameter CIVM.
- Kalibrasi parameter TA (optimizedWeights)
- Kalibrasi parameter HANYAJUALKETIKAPROFIT
- Kalibrasi threshold Z-Score per sektor
- Kalibrasi parameter rebalancing
Pelaksanaan backtesting Out-of-Sample/Walk-Forward dan analisis hasil kinerja awal, menggunakan data 2021-2024 untuk evaluasi kinerja yang objektif.
- Perhitungan metrik kinerja absolut dan relatif
- Evaluasi efektivitas filter transaksi
- Analisis statistik performa portofolio
- Dekonstruksi kontribusi komponen CIVM
Analisis sensitivitas/skenario dan analisis mendalam hasil backtesting, untuk menguji ketahanan model dalam berbagai kondisi pasar.
- Analisis sensitivitas parameter kunci
- Pengujian pada berbagai skenario pasar
- Analisis performa pada kondisi ekstrem
- Evaluasi robustness dan stabilitas model
Penulisan paper hasil empiris dan persiapan submission, dengan tujuan menyajikan temuan komprehensif dari pengujian CIVM.
- Penulisan paper akademis untuk publikasi
- Penyusunan dokumentasi teknis lengkap
- Pembuatan material presentasi
- Persiapan untuk peer review
Implementasi CIVM dalam platform live trading dengan monitoring real-time, sebagai tahap final validasi dalam lingkungan pasar nyata.
- Pengembangan sistem live trading
- Integrasi dengan broker atau API pasar
- Implementasi sistem monitoring
- Analisis kinerja dan penyesuaian real-time
Arah Potensial Penelitian Lanjutan:
Integrasi Machine Learning
Memanfaatkan algoritma machine learning untuk mengoptimalkan parameter CIVM, seperti bobot indikator TA atau threshold filter transaksi.
Ekspansi Multi-Aset
Adaptasi CIVM untuk kelas aset lain seperti obligasi, komoditas, atau aset kripto dengan penyesuaian yang sesuai.
Validasi Lintas Pasar
Menguji CIVM pada pasar saham negara berkembang lainnya untuk menilai universalitas dan adaptabilitas model.
Integrasi Faktor ESG
Memasukkan pertimbangan Environmental, Social, dan Governance ke dalam CIVM Score atau sebagai filter tambahan.