Konstruksi Portofolio Dengan CVaR. Because, Why Not?

Salah satu pertanyaan yang seringkali dihadapi oleh investor ketika akan mulai berinvestasi biasanya adalah: Ke mana saja saya harus menginvestasikan uang saya? Setelah itu, mereka akan berhadapan dengan pertanyaan lanjutan: aset apa yang harus saya beli? Berapa banyak jenis aset yang ideal dalam sebuah portofolio investasi? Berapa proporsi masing-masing aset tersebut?

Pertanyaan-pertanyaan seperti itu umum dilontarkan oleh para investor ketika akan membangun portofolio investasi mereka. Padahal, pertanyaan-pertanyaan tersebut kurang tepat diajukan ketika akan membangun portofolio investasi. Beberapa poin yang seharusnya dijawab terlebih dulu sebelum mulai membangun portofolio antara lain: tujuan berinvestasi, horizon waktu berinvestasi, dan seberapa besar toleransi risiko investor.

Jawaban dari tiga poin tersebut akan menentukan jenis aset yang akan diinvestasikan, seberapa variatif aset yang diinvestasikan (diversifikasi), sampai komposisi aset yang diinvestasikan. Metodenya pun beragam, mulai dari yang rumit seperti Black-Litterman model, sampai yang simpel dan praktis seperti menghitung dari umur si investor. Tujuannya adalah menentukan aset apa yang akan kita beli, dan berapa proporsinya dari keseluruhan modal kita. Sayangnya, di tulisan ini saya tidak akan membahas mengenai teori konstruksi portofolio ini lebih jauh lagi.

Hanya investor naif yang berpikir bahwa aktivitas investasi harus selalu menguntungkan. Oleh sebab itu, setelah portofolio terbentuk perlu ada pengukuran seberapa besar risiko kerugian dalam sebuah portofolio investasi tersebut. Metode yang umum dipakai untuk mengukur ini di antaranya yaitu Value at Risk (VaR) dan Conditional Value at Risk (CVaR). VaR mengukur estimasi kerugian maksimum pada suatu aset atau portofolio dalam periode tertentu, dan dengan tingkat kepercayaan tertentu, misal: “saya yakin 95% kerugian maksimum yang bisa dialami oleh portofolio saya dalam satu hari adalah sebesar Rp10 juta”. Seperti yang bisa dilihat, VaR berfungsi untuk menetapkan batas risiko, mengontrol eksposur, dan membandingkan risiko antar aset. VaR pertama kali diusulkan pada tahun 2004 dan menjadi standar di industri perbankan lewat Basel II.

Sementara itu, CVaR adalah nilai ekspektasi kerugian rata-rata dalam kondisi ketika kerugian sudah melampaui VaR pada tingkat kepercayaan tertentu. CVaR digunakan untuk melengkapi kelemahan VaR yang tidak memberikan informasi besarnya kerugian jika kerugian sudah melewati batas VaR. Singkatnya, CVaR menjawab pertanyaan ini: “jika kerugian portofolio saya melebihi Rp10 juta pada tingkat kepercayaan 95%, maka berapa rata-rata kerugiannya?”. CVaR ini berguna karena mampu memperhitungkan tail risk yang dapat menggerus investasi. Ada beberapa macam metode untuk menghitung VaR dan CVaR, seperti metode parametrik, simulasi data historis, sampai simulasi Monte Carlo. CVaR diperkenalkan lewat Basel III dan saat ini menjadi best practices di dunia manajemen risiko modern. Sayangnya lagi, saya tidak akan membahas lebih jauh lagi mengenai teori-teori tentang VaR dan CVaR di tulisan ini.

Tujuan saya menyusun apa yang akan saya paparkan setelah ini sebenarnya sederhana: saya ingin membangun sebuah portofolio investasi (dalam hal ini, saham) yang tidak perlu direpotkan dengan urusan kapan saya harus beli dan kapan saya harus jual, namun harus tetap menguntungkan. Setelah kontemplasi sejenak, saya menemukan jawaban sederhana: carilah saham yang rajin membagikan dividen dengan yield yang tinggi. Salah satu alasan utama mengapa saya menyukai saham sebagai investasi adalah karena instrumen ini menawarkan dua macam keuntungan, yaitu capital gain dan dividen. Jadi harapannya, ketika misalnya kita tidak dapat dividen dari saham yang kita investasikan, minimal kita bisa dapat capital gain dari saham tersebut, atau sebaliknya. Karena besar dividen tergantung dari seberapa banyak jumlah saham yang kita pegang, maka kita bisa menerapkan strategi buy the dip ketika pasar sedang koreksi, atau bahkan crash. Strategi ini tidak mungkin kita gunakan untuk aset-aset yang tidak memiliki fundamental (***uhuk*** kripto ***uhuk***), karena hal tersebut sama saja seperti kita menangkap pisau jatuh (catch the falling knives).

Sebelum Anda memasuki bagian inti tulisan ini, ada disclaimer dulu:

Artikel ini disusun untuk tujuan edukasi dan tidak merupakan nasihat investasi, penawaran, atau ajakan untuk membeli maupun menjual instrumen keuangan apa pun. Setiap keputusan investasi sepenuhnya menjadi tanggung jawab pembaca. Penulis menyarankan pembaca untuk melakukan analisis mandiri dan/atau berkonsultasi dengan penasihat keuangan profesional sebelum mengambil keputusan investasi.

Oke, setelah saya tahu saham apa yang mau saya beli untuk portofolio saya itu, langkah selanjutnya adalah dengan menyusun stock universe yang berisi daftar saham di IHSG yang memenuhi kriteria tadi. Saya menggunakan bantuan fitur Screener pada aplikasi Stockbit kemudian mencari saham-saham dengan dua kriteria ini: saham dengan rata-rata dividend yield tiga tahun terakhir di atas 10%, dan saham dengan rekor pembayaran dividen berturut-turut terpanjang. Hasilnya, saya mendapatkan 50 saham yang rajin memberikan dividen dalam 17 tahun terakhir, atau dividend yield di atas 10% di tiga tahun terakhir. Kemudian, data tersebut saya rangkum ke dalam satu file berformat CSV dengan 3 kolom: code, 3y_avg_div_yield, & div_streak_in_years yang disimpan di dalam file dividen.csv.

Kemudian di sini lah letak keseruannya. Alih-alih menggunakan metode konvensional untuk konstruksi portofolio seperti yang saya sebutkan di atas, saya langsung menyerahkan proses pemilihan saham sepenuhnya pada proses perhitungan CVaR. Ada beberapa alasan yang mendasari ini:

  1. Portofolio ini–yang merupakan salah satu dari sekian portofolio yang–memang saya dedikasikan untuk aset investasi saham (bukan reksa dana, obligasi, maupun valas), jadi proses pemilihan aset berdasarkan tujuan, horizon, dan toleransi risiko saya lewati (cuz I know my own risk profile well).
  2. Misalkan saya memilih secara random (maupun secara sadar) saham yang akan masuk ke portofolio ini dari 50 saham tadi, pada akhirnya saya akan tetap melakukan proses perhitungan VaR dan CVaR. Jadi, mengapa tidak saya biarkan VaR dan CVaR saja yang “membantu” untuk memilihkan dari awal? Biar tidak dua kali kerja, kan?

Sebelum tahu saham mana saja yang harus dipilih, kita harus berhitung berapa jumlah saham optimal yang bisa dimasukkan ke dalam portofolio kita. Jika jumlahnya terlalu sedikit, akan meningkatkan paparan risiko karena kurangnya diversifikasi. Jika jumlahnya terlalu banyak, akan berpotensi menggerus return investasi. Untuk itu saya melakukan simulasi dengan data dummy untuk melihat berapa jumlah saham yang optimal berdasarkan rata-rata CVaR portofolio dan jumlah saham yang ada dalam portofolio (skenario jumlah saham maksimal 20).

Bisa dilihat dari grafik di atas, menurut saya 10 saham merupakan jumlah optimal. Tidak terlalu sedikit untuk dapat terekspos risiko, dan tidak terlalu banyak untuk bisa menggerus return. Metodologi yang dipakai di sini adalah dengan melakukan simulasi penyusunan berbagai kemungkinan portofolio. Untuk menyederhanakan, kita akan memfilter menjadi sekitar 20 dengan memilih saham dengan dividend yield tertinggi dan streak yang sama atau lebih dari 3 tahun.

import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt

df = pd.read_csv('dividend.csv')
df['yield_decimal'] = df['3y_avg_div_yield'].astype(str).str.rstrip('%').astype(float) / 100

universe = df[df['div_streak_in_years'] >= 3].sort_values('yield_decimal', ascending=False).head(20)
tickers = universe['code'].apply(lambda x: x + ".JK").tolist()
yield_map = dict(zip(tickers, universe['yield_decimal']))

Kemudian, kita download data perdagangan harian untuk saham-saham yang terpilih dan kita hitung return hariannya.

data = yf.download(tickers, period="2y")['Adj Close']
returns = data.pct_change().dropna()

Dengan data return historis harian kita bisa menghitung VaR dan CVaR masing-masing saham dengan metode parametrik.

def calculate_risk(weights, returns_df, confidence=0.95):
    # 1. Hitung Return Harian Gabungan Portofolio
    portfolio_returns = returns_df.dot(weights)
    
    # 2. Cari Batas VaR (Persentil ke-5)
    alpha = 1 - confidence # Hasilnya 0.05 (5%)
    var = np.percentile(portfolio_returns, alpha * 100)
    
    # 3. Hitung CVaR (Rata-rata kerugian di bawah batas VaR)
    cvar = portfolio_returns[portfolio_returns <= var].mean()
    
    return -cvar

Lalu di sini intinya, saya membuat simulasi dengan melakukan percobaan acak dalam menyusun portofolio berisi 20 saham tadi sebanyak 50.000 kali.

num_portfolios = 50000
results = []
all_weights = []
 
for i in range(num_portfolios):
    # Generatebobot acak
    weights = np.random.random(len(tickers))
    weights /= np.sum(weights) # Normalisasi supaya total 100%

    # Hitung Yield Portofolio (Weighted Average)
    # Asumsi: Yield saham individual tetap (berdasarkan data CSV terakhir)
    p_yield = sum(weights[k] * yield_map[ticker] for k, ticker in enumerate(tickers))

    # Hitung Risiko (CVaR)
    p_risk = calculate_risk(weights, returns)

    results.append([p_yield, p_risk])
    all_weights.append(weights)

results = np.array(results)

Di tiap percobaan, kita akan menghitung rasio Yield-to-Risk yang diperoleh dari formula ini:

Yield−to−Risk=Y/CVaRYield-to-Risk=Y/CVaR

dengan Y merupakan dividend yield yang diperoleh oleh portofolio tersebut, dan CVaR adalah nilai CVaR dari portofolio tersebut. Semakin tinggi rasionya, maka performa portofolio tersebut semakin bagus. Dalam simulasi ini, kita melakukan 50.000 kali percobaan.

Kemudian kita cari portofolio pemenangnya, yaitu portofolio dengan rasio yield-to-risk tertinggi.

ratios = results[:, 0] / results[:, 1] # Yield dibagi Risiko
best_idx = np.argmax(ratios)

Kemudian, kita visualisasikan hasil simulasinya.

Dan kemudian, inilah portofolio pemenangnya:

Bisa dilihat ada 14 saham terpilih beserta alokasi masing-masing berturut-turut mulai dari alokasi yang tertinggi. Sebenarnya ada lebih dari 14 saham tapi karena keterbatasan screenshot jadi hanya segitu yang ditampilkan. 😂

Portofolio terpilih itu mencatatkan dividend yield sebesar 16.14% per tahunnya dengan CVaR sebesar 1.75%. Itu adalah return yang cukup besar dengan risiko yang relatif minimum (bisa diadu dengan hedge fund yang ada di Wall Street).

Ada banyak sekali improvisasi yang bisa dilakukan untuk membuat proses dan hasilnya lebih robust, seperti memfilter saham yang akan disimulasikan dengan pembobotan dividen yield vs dividend payment streak, menghitung VaR dan CVaR dengan simulasi Monte Carlo, menggunakan formula Rockafellar-Uryasev untuk CVaR Optimization, dan lain sebagainya. Untuk sekarang, saya rasa proses yang telah kita lakukan cukup untuk memberikan gambaran secara garis besar.

Perlu diingat, karena proses kontruksi portofolio ini menggunakan simulasi yang melibatkan nilai acak (random number), maka tiap eksekusi simulasi bisa menghasilkan hasil yang berbeda. Apalagi, percobaan yang digunakan dalam sampel ini hanya berjumlah 50.000, yang mana menurut saya relatif kecil (biasanya minimal 1 juta percobaan untuk production-grade portfolio design).

Anda bisa lihat source code lengkapnya di sini. Anda bisa salin dan replikasi prosesnya dengan stock universe versi Anda sendiri. Cheers!

Leave a Reply

Your email address will not be published. Required fields are marked *