▶️ Senaryo: 3 Fonu Karşılaştırma Sayfasına Ekledim — Ne Olur?

/fonlar/karsilastirma + 40 field per fon + risk metrikleri

  1. UI: /fonlar/karsilastirma sayfası açılır
  2. Önceki seçim restore:
    localStorage: fvt-compare-funds = ["AAL", "AAV", "TI2"]
  3. 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)
  4. 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", ... }
      ]
    }
  5. UI render (yan yana 3 sütun): Her fon için tüm 40 field tablo'da gösterilir.
  6. Kullanıcı 4. fon eklerse:
    localStorage update: ["AAL", "AAV", "TI2", "BTJ"]
    GET /api/funds/compare?fonKodlari=AAL&fonKodlari=AAV&fonKodlari=TI2&fonKodlari=BTJ
  7. Risk grafiği çizilir: Recharts ile 3 fon Sharpe/Sortino/Alpha bar chart
  8. Fiyat tarihçesi karşılaştırma:
    GET /api/funds/compare-prices?fonKodlari=AAL&fonKodlari=AAV&fonKodlari=TI2&aralik=1Y

📊 Risk Metrikleri (10+)

MetricAnlamAAL Örnek
SharpeRisk-ayarlı getiri25.11 (çok yüksek)
Düzeltilmiş SharpeModified version215.17
BetaPazar duyarlılığı0.67
SortinoDownside-only Sharpe0.00 (PP için)
AlphaEkstra getiri0.06
TreynorSistematik risk getirisi62.82
RMDRisk Maliyet Düşüklüğü0.55
DownsideAşağı oynaklık0.00
Maks KayıpMax drawdown0.00
Değişim KatsayıCoefficient of Variation0.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)

katilimKatılım (faizsiz) fonu
hisseHisse senedi yoğun (HSYF — min %80)
besBES (Bireysel Emeklilik)
yabanciYabancı varlık ağırlıklı
serbestSerbest fon
dovizDöviz cinsi
avantajVergi avantajlı
islemAlım-satıma açık

💾 localStorage State

fvt-compare-funds = ["AAL", "AAV", "TI2"]  // max 3? veya 5?

🔄 Diğer Fon Araçları

AraçEndpointUse Case
Karşılaştırma/api/funds/compare40 field yan yana
Çakışma Analizi/api/funds/overlapAynı hisseyi tutan fonlar
SimülasyonPOST /api/funds/simulation/calculateGeçmiş dönem backtest
Smart Money/api/funds/smart-moneyKurumsal akış
Ters Arama/api/funds/reverse-lookup/{hisse}Hisseyi tutan fonlar
Sektör Rotasyonu/api/funds/sector-rotationSektö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)

TabloKolonlar
fundsfon_kodu, ad, sirket_id, kategori_id, varlik_buyuklugu, yatirimci_sayisi
fund_pricesfon_kodu, tarih, fiyat, getiri_1g, getiri_30g, getiri_1y
fund_fvt_scoresfon_kodu, getiri_skor, risk_skor, buyukluk_skor, aktiflik_skor, nakit_skor, toplam
fund_holdingsfon_kodu, sembol, oran, miktar — çakışma analizi için

📖 Fon tabloları → · ⚠️ FVT skor normalize bug →