Finans Mühendisliği & Veri
Bloomberg Terminaline 30 Bin Dolar Ödemeden: Açık Kaynak Finansal Veri ve Quant Analiz Altyapısı
Finansal piyasaları analiz etmek, algoritmik stratejiler geliştirmek veya AI ajanlarına canlı piyasa verisi beslemek için yıllık 30 bin dolarlık terminallere mahkûm değilsiniz. Veri sağlayıcı soyutlama katmanı, Python quant kütüphaneleri ve standart veri hatları kurma rehberi.
Finans sektöründe uzun yıllardır süregelen bir kabulleniş vardır: Ciddi bir piyasa araştırması yapmak, hisse senetleri veya türev ürünler üzerinde kantitatif (quant) modelleme çalıştırmak istiyorsanız masanızda bir Bloomberg Terminali ya da Refinitiv Eikon bulunmalıdır. Ancak bu sistemlerin kullanıcı başına yıllık lisans maliyeti 25.000 ile 32.000 dolar arasındadır. Bireysel bir geliştirici, bağımsız araştırmacı ya da tohum aşamasındaki bir fintech girişimi için bu maliyet imkânsız bir giriş bariyeridir.
Peki sorun gerçekten verinin bulunamaması mıdır? Kesinlikle hayır. FED'in makroekonomik veritabanı (FRED), Amerikan Sermaye Piyasası Kurulu'nun şirket bilançolarını sunduğu SEC EDGAR, kripto para borsalarının WebSocket akışları ve onlarca ticari finans API'si (FMP, Tiingo, Polygon, yfinance) internette herkese açık olarak duruyor. Asıl problem veri eksikliği değil, veri fragmantasyonudur.
Modern Çözüm: Veri Sağlayıcı Soyutlama Katmanı (Provider Abstraction)
Açık kaynak dünyasında Bloomberg tekeline karşı doğan en güçlü yaklaşım (OpenBB mimarisinin de temelini oluşturan felsefe), tüm harici veri kaynaklarının önüne bir soyutlama katmanı yerleştirmektir. Bu mimaride analiz kodunuz doğrudan Polygon veya Yahoo Finance ile konuşmaz; standart bir veri kontratına (Data Contract) istek atar. Soyutlama motoru arka planda hangi sağlayıcının ücretsiz veya aktif olduğunu kontrol eder, veriyi çeker ve tek bir normalize pandas/polars DataFrame'i olarak teslim eder.
import pandas as pd
import numpy as np
# Standartlaştırılmış finansal veri tüketim deseni
# Harici kütüphane veya sağlayıcı değişse bile analiz arayüzü sabit kalır.
class FinancialDataPipeline:
def __init__(self, provider_client=None):
self.client = provider_client
def get_historical_closes(self, symbol: str, start_date: str) -> pd.Series:
"""Farklı sağlayıcılardan gelen kapanış fiyatlarını standart Series formatına indirger."""
raw_data = self._fetch_from_active_source(symbol, start_date)
# Tarih indeksini normalize et ve sadece düzeltilmiş kapanışı döndür
prices = pd.Series(raw_data["close"].values, index=pd.to_datetime(raw_data["date"]))
return prices.sort_index()
def _fetch_from_active_source(self, symbol: str, start_date: str):
# Örnek: OpenBB Platform, yfinance veya Tiingo adaptörü
# Burada sağlayıcı değiştirildiğinde üst katman hiçbir şey fark etmez
import yfinance as yf
df = yf.download(symbol, start=start_date, progress=False)
df.reset_index(inplace=True)
return df.rename(columns={"Date": "date", "Close": "close"})
pipeline = FinancialDataPipeline()
prices = pipeline.get_historical_closes("NVDA", start_date="2025-01-01")
print(f"Toplam Veri Noktası: {len(prices)} gün")Quant Analiz: Sharpe Oranı ve Riske Maruz Değer (VaR) Hesabı
Elinizde normalize edilmiş temiz bir fiyat serisi olduğunda, artık kurumsal terminallerin sunduğu karmaşık risk metriklerini birkaç satır Python koduyla hesaplayabilirsiniz. Örneğin portföy yöneticilerinin en çok baktığı iki temel gösterge: Birim risk başına ne kadar getiri elde edildiğini gösteren Sharpe Oranı ve %95 güven aralığında bir günde yaşanabilecek maksimum kaybı gösteren Tarihsel VaR (Value at Risk).
def calculate_risk_metrics(price_series: pd.Series, risk_free_rate: float = 0.04):
"""Günlük logaritmik getirilerden Sharpe ve Parametrik VaR hesaplar."""
returns = np.log(price_series / price_series.shift(1)).dropna()
# Yıllıklandırılmış getiri ve volatilite (252 işlem günü)
annualized_return = returns.mean() * 252
annualized_volatility = returns.std() * np.sqrt(252)
# Sharpe Oranı
sharpe_ratio = (annualized_return - risk_free_rate) / annualized_volatility
# %95 Güven Aralığında 1 Günlük Tarihsel Riske Maruz Değer (VaR)
var_95 = np.percentile(returns, 5)
return {
"Yıllık Getiri": f"{annualized_return:.2%}",
"Yıllık Oynaklık": f"{annualized_volatility:.2%}",
"Sharpe Oranı": round(sharpe_ratio, 2),
"Günlük %95 VaR": f"{var_95:.2%}"
}
metrics = calculate_risk_metrics(prices)
for k, v in metrics.items():
print(f"{k}: {v}")Finansal AI Ajanları İçin Deterministik Tool Calling
Günümüzde finansal analiz süreçleri hızla otonom LLM ajanlarına devrediliyor. Ancak büyük dil modellerinin en tehlikeli zaafı sayısal halüsinasyondur; bir modele 'Microsoft'un son F/K oranı kaç?' diye sorarsanız eğitim verisinden uydurma bir rakam üretebilir. Bu yüzden AI ajanlarına ham metin yerine doğrulanmış deterministik araçlar (Function Calling / Tool Calling) tanımlanmalıdır.
Standartlaştırılmış açık veri platformları tam bu noktada bir köprü görevi görür: Model, kullanıcı isteğini anlar -> get_financial_ratios(ticker='MSFT') fonksiyonunu çağırır -> Python motoru canlı normalize veriyi çeker -> LLM sadece gelen kesin sayıları yorumlayarak kullanıcıya analitik bir özet sunar.
Kendi Finansal Veri Hattınızı Kurarken 4 Kritik Prensip
- Sağlayıcı Bağımlılığından Kaçının: Kodunuzda tek bir sağlayıcının SDK'sına doğrudan bağlanmayın. Her zaman araya bir adaptör sınıfı yazın.
- Yerel Önbellekleme (Caching) Kurun: Finansal API'lerin dakikalık sorgu limitleri düşüktür. Günlük kapanışları ve geçmiş bilançoları SQLite veya Parquet dosyalarında önbelleğe alarak gereksiz API harcamasını engelleyin.
- Hayatta Kalma Yanlılığına (Survivorship Bias) Dikkat Edin: Geçmişe dönük strateji testlerinde (backtesting) sadece bugün borsada işlem gören şirketleri dahil ederseniz iflas edenleri gözden kaçırır ve kurgusal başarı elde edersiniz.
- Makro Verilerle Şirket Verilerini Eşleştirin: Yalnızca hisse fiyatına değil, FED faiz oranlarına (FRED API) ve sektör enflasyon dinamiklerine aynı boru hattı üzerinden erişin.