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

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

Buy: SMA20 > SMA50 > SMA200 Sell: SMA20 < SMA50 < SMA200

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

Buy: Histogram > 0 dan meningkat Sell: Histogram < 0 dan menurun

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

Buy: RSI < 30 (oversold) Sell: RSI > 70 (overbought)

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)

Buy: Harga mendekati atau menyentuh Lower Band Sell: Harga mendekati atau menyentuh Upper Band
Pseudocode Pembentukan Rekomendasi Teknikal

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

X1: Working Capital / Total Assets
Bobot = abs(Working Capital / weightEquity) * weights_correlation['X1']
X2: Retained Earnings / Total Assets
Bobot = abs(Retained Earnings / weightEquity) * weights_correlation['X2']
X3: EBIT / Total Assets
Bobot = abs(EBIT / weightEquity) * weights_correlation['X3']
X4: Market Value of Equity / Total Liabilities
Bobot = abs(Market Cap / Total Liabilities) * weights_correlation['X4']
X5: Sales / Total Assets
Bobot = abs(Sales / weightEquity) * weights_correlation['X5']

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:

Kuartal 3, 2025
Pengumpulan dan Pembersihan Data

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.)
Kuartal 4, 2025
Implementasi Algoritma Backtesting

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
Kuartal 1, 2026
Backtesting In-Sample dan Kalibrasi

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
Kuartal 2, 2026
Backtesting Out-of-Sample

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
Kuartal 3, 2026
Analisis Mendalam dan Robustness Testing

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
Kuartal 4, 2026
Publikasi dan Dokumentasi

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
Kuartal 1-2, 2027
Implementasi Live Trading

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.