▶️ Senaryo: 3 Fonu Karşılaştırma Sayfasına Ekledim — Ne Olur?
/fonlar/karsilastirma + 40 field per fon + risk metrikleri
- UI: /fonlar/karsilastirma sayfası açılır
- Önceki seçim restore:
localStorage: fvt-compare-funds = ["AAL", "AAV", "TI2"] - Initial fetch (3 fon birden):
GET /api/funds/compare?fonKodlari=AAL&fonKodlari=AAV&fonKodlari=TI2 ⚠️ KRİTİK: Query format = repeat param ❌ ?codes=AAL,AAV,TI2 (400 error) ❌ ?fonKodlari[]=AAL (browser blocked) ✅ ?fonKodlari=AAL&fonKodlari=AAV (repeat) - Backend response (40+ field per fon):
{ "funds": [ { "id": 88, "varlikId": 1, "islem": 1, "kategoriId": 35, "katilim": 0, "hisse": 0, "bes": 0, "stopaj": "17.50", "ustId": 5, "yabanci": 0, "fonKodu": "AAL", "fonAdi": "ATA PORTFÖY PARA PİYASASI...", "getiri": "0.1029", "fiyat": "3.257185", "kategori": "Para Piyasası Fonu", "fonTipi": "Para Piyasası Şemsiye Fonu", "paraBirimi": "TL", "dolulukOrani": "9.18", "toplamDeger": "2991520577.15", "yatirimci": "4860", "risk": "1", "yonetimUcret": "1.00", // Risk metrics (10+) "sharpe": "25.1066", "beta": "0.6731", "sortino": "0.0000", "maximumKayip": "0.0000", "duzeltilmisSharpe": "215.1668", "alpha": "0.0600", "treynor": "62.8157", "rmd": "0.5519", "downside": "0.0000", "degisimKatsayi": "0.0398", "isinKodu": "TRMAALWWWWW5", "kurulusTarihi": "1999-02-17", "alisValor": "0", "satisValor": "0" }, { fonKodu: "AAV", ... }, { fonKodu: "TI2", ... } ] } - UI render (yan yana 3 sütun): Her fon için tüm 40 field tablo'da gösterilir.
- Kullanıcı 4. fon eklerse:
localStorage update: ["AAL", "AAV", "TI2", "BTJ"] GET /api/funds/compare?fonKodlari=AAL&fonKodlari=AAV&fonKodlari=TI2&fonKodlari=BTJ - Risk grafiği çizilir: Recharts ile 3 fon Sharpe/Sortino/Alpha bar chart
- Fiyat tarihçesi karşılaştırma:
GET /api/funds/compare-prices?fonKodlari=AAL&fonKodlari=AAV&fonKodlari=TI2&aralik=1Y
📊 Risk Metrikleri (10+)
| Metric | Anlam | AAL Örnek |
|---|---|---|
| Sharpe | Risk-ayarlı getiri | 25.11 (çok yüksek) |
| Düzeltilmiş Sharpe | Modified version | 215.17 |
| Beta | Pazar duyarlılığı | 0.67 |
| Sortino | Downside-only Sharpe | 0.00 (PP için) |
| Alpha | Ekstra getiri | 0.06 |
| Treynor | Sistematik risk getirisi | 62.82 |
| RMD | Risk Maliyet Düşüklüğü | 0.55 |
| Downside | Aşağı oynaklık | 0.00 |
| Maks Kayıp | Max drawdown | 0.00 |
| Değişim Katsayı | Coefficient of Variation | 0.04 (düşük) |
🏷️ 3-Katmanlı Sınıflandırma
varlikId (Asset Class) ustId (Üst Kategori) kategoriId (Alt Kategori)
───────────────── ───────────────── ─────────────────
1 = TL 1 = Hisse 35 = Para Piyasası Fonu
2 = USD 2 = Karma (61 alt kategori)
3 = EUR 3 = Tahvil
4 = BES
5 = Para Piyasası
🎯 Flags (8 boolean)
katilim | Katılım (faizsiz) fonu |
hisse | Hisse senedi yoğun (HSYF — min %80) |
bes | BES (Bireysel Emeklilik) |
yabanci | Yabancı varlık ağırlıklı |
serbest | Serbest fon |
doviz | Döviz cinsi |
avantaj | Vergi avantajlı |
islem | Alım-satıma açık |
💾 localStorage State
fvt-compare-funds = ["AAL", "AAV", "TI2"] // max 3? veya 5?
🔄 Diğer Fon Araçları
| Araç | Endpoint | Use Case |
|---|---|---|
| Karşılaştırma | /api/funds/compare | 40 field yan yana |
| Çakışma Analizi | /api/funds/overlap | Aynı hisseyi tutan fonlar |
| Simülasyon | POST /api/funds/simulation/calculate | Geçmiş dönem backtest |
| Smart Money | /api/funds/smart-money | Kurumsal akış |
| Ters Arama | /api/funds/reverse-lookup/{hisse} | Hisseyi tutan fonlar |
| Sektör Rotasyonu | /api/funds/sector-rotation | Sektör değişim trendi |
⚡ Performans
Tek istek 3-5 fonun 40+ field'ını birden döndürür → frontend render hızlı.
🗄️ DB Tabloları (Sorgulanan)
| Tablo | Kolonlar |
|---|---|
funds | fon_kodu, ad, sirket_id, kategori_id, varlik_buyuklugu, yatirimci_sayisi |
fund_prices | fon_kodu, tarih, fiyat, getiri_1g, getiri_30g, getiri_1y |
fund_fvt_scores | fon_kodu, getiri_skor, risk_skor, buyukluk_skor, aktiflik_skor, nakit_skor, toplam |
fund_holdings | fon_kodu, sembol, oran, miktar — çakışma analizi için |