Optimizing portfolio allocation across Stocks, Crypto, and Mutual Funds (Reksadana) using a custom Genetic Algorithm (GA) approach.
Proyek ini bertujuan mencari komposisi portofolio optimal dengan menyeimbangkan antara return dan risk. Dengan pendekatan Algoritma Genetika (Genetic Algorithm), sistem akan:
- Membentuk populasi acak portofolio,
- Mengevaluasi berdasarkan fungsi fitness,
- Melakukan seleksi, crossover, dan mutasi, hingga menemukan kombinasi bobot terbaik.
- ✅ Mengunduh data historis otomatis (via
yfinance) - ✅ Menghitung return dan kovarians tahunan
- ✅ Menjalankan optimasi berbasis Genetic Algorithm
- ✅ Visualisasi hasil (fitness history, efficient frontier, pie chart)
- ✅ Dapat digunakan untuk Saham, Crypto, dan Reksadana
git clone https://github.com/yuriya-dev/portfolio_optimization_genetic_algorithm.git
cd portfolio_optimization_genetic_algorithmpip install -r requirements.txtBuka file:
portfolio_optimization_ga.ipynb
di Jupyter Notebook atau VS Code (Jupyter extension).
-
Ticker format:
'BBCA.JK','ADRO.JK', dst -
Tahun bursa: 252 hari
-
Risk Aversion: 0.5 – 1.0
-
Contoh:
TICKERS = ['BBCA.JK', 'ADRO.JK', 'PTBA.JK'] RISK_AVERSION = 0.5
-
Ticker format:
'BTC-USD','ETH-USD','BNB-USD','SOL-USD' -
Pasar 24/7: gunakan 365 hari
-
Risk Aversion: 1.0 – 1.5
-
Saran: tambahkan batas maksimum per aset (misal max 50%)
-
Contoh:
TICKERS = ['BTC-USD', 'ETH-USD', 'BNB-USD', 'SOL-USD'] RISK_AVERSION = 1.2
-
Data: gunakan file CSV NAV (Nilai Aktiva Bersih) harian/bulanan
-
Risk Aversion: 0.7 – 1.2
-
Contoh:
data = pd.read_csv('nav_reksadana.csv', index_col='Date', parse_dates=True) returns_daily = data.pct_change().dropna()
-
Atur parameter utama
TICKERS = ['BTC-USD', 'ETH-USD', 'BNB-USD'] START_DATE = '2022-01-01' RISK_AVERSION = 1.0 POP_SIZE = 100 GENERATIONS = 300
-
Jalankan semua cell di notebook
-
Lihat hasil akhir
-
Bobot terbaik disimpan di:
outputs/best_portfolio_weights.csv
-
-
Visualisasi hasil di:
outputs/fitness_plot.pngoutputs/portfolio_pie.pngoutputs/efficient_frontier.pngoutputs/best_portfolio_weights.csv
| Visualisasi | Deskripsi |
|---|---|
![]() |
Evolusi fitness tiap generasi |
![]() |
Perbandingan GA optimal vs portofolio acak |
![]() |
Distribusi bobot tiap aset |
| best_portfolio_weights.csv | Bobot optimal tiap saham (file CSV) |
Kami menyediakan penjelasan lengkap untuk setiap cell dalam notebook!
📋 Apa yang akan Anda pelajari:
- 🧬 Algoritma Genetika - Bagaimana GA mencari portofolio optimal
- 📈 Return & Risk - Rumus perhitungan ekspektasi return dan volatilitas
- 🎯 Fungsi Fitness - Objektif optimasi dengan risk aversion
- 🔄 Evolusi - Proses seleksi, crossover, dan mutasi
- 📊 Visualisasi - Interpretasi efficient frontier dan komposisi portofolio
🔍 Preview Konten
| Cell | Topik | Deskripsi |
|---|---|---|
| 1-3 | Setup | Import library & konfigurasi parameter |
| 4-7 | Data | Download & preprocessing data historis |
| 8-11 | Core GA | Inisialisasi & fungsi fitness |
| 12-15 | Evolution | Seleksi, crossover, mutasi & iterasi |
| 16-22 | Results | Portofolio optimal & visualisasi |
💡 Pro Tip: Buka dokumentasi di tab terpisah sambil menjalankan notebook untuk pengalaman belajar yang optimal!
✨ Versi selanjutnya dapat menambahkan:
- Constraint tambahan (min/max bobot per aset)
- Integrasi biaya transaksi & pajak
- Rolling window (optimasi dinamis)
- Auto-update data real-time via API Binance / Yahoo
- Dashboard interaktif dengan Streamlit
- Multi-objective GA (NSGA-II) untuk memisahkan risiko & return
numpy
pandas
matplotlib
yfinance
tqdm
yuriya-dev 🌐 GitHub | 💼 LinkedIn
Proyek ini dilisensikan di bawah MIT License. Silakan gunakan dan modifikasi dengan tetap mencantumkan atribusi.
“Optimization is not about perfection, but finding balance between risk and reward.” — Portfolio GA Project


