Portföy Analizi Aracı Araçları
Aracı tarafından çalıştırılan kodla getiri hesaplama, Sharpe oranı ve düşüş analizi.
Portföy Analizi Aracı Araçları, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.
Aracı Araçları Olarak Portföy Analizi
Finansal analiz aracılarının, LLM'nin çağırabileceği bir hesaplama araçları grubuna ihtiyacı vardır: getiriler, risk ölçütleri, korelasyon ve yeniden dengeleme önerileri. Her araç, açık bir imzaya sahip bir Python işlevidir ve aracının üzerinde akıl yürütebileceği yapılandırılmış JSON döndürür.
Yüzde Getirileri Hesaplama
Portföy analizinin temelini oluşturur. pct_change(), günden güne getirileri hesaplar. Bu getirilerden analiz dönemi boyunca kümülatif getiriyi hesaplayın.
import pandas as pd
import yfinance as yf
def calculate_returns(ticker: str, period: str = '1y') -> dict:
hist = yf.Ticker(ticker).history(period=period)['Close']
if hist.empty:
return {'error': f'No data for {ticker}'}
daily_returns = hist.pct_change().dropna()
cumulative = (1 + daily_returns).cumprod() - 1
return {
'ticker': ticker,
'period': period,
'total_return_pct': round(float(cumulative.iloc[-1]) * 100, 2),
'avg_daily_return': round(float(daily_returns.mean()) * 100, 4),
'best_day_pct': round(float(daily_returns.max()) * 100, 2),
'worst_day_pct': round(float(daily_returns.min()) * 100, 2)
}Sharpe Oranı
Sharpe oranı, riske göre düzeltilmiş getiriyi ölçer: her bir risk birimi (oynaklık) karşılığında elde edilen fazla getiriyi gösterir. Yüksek olması daha iyidir. 1,0'ın üzerindeki Sharpe oranı iyi, 2,0'ın üzerindeki oran ise mükemmel kabul edilir.
import numpy as np
import yfinance as yf
def sharpe_ratio(ticker: str, period: str = '1y',
risk_free_annual: float = 0.05) -> dict:
hist = yf.Ticker(ticker).history(period=period)['Close']
daily_returns = hist.pct_change().dropna()
risk_free_daily = risk_free_annual / 252 # annualized to daily
excess_returns = daily_returns - risk_free_daily
if daily_returns.std() == 0:
return {'error': 'Zero volatility — cannot compute Sharpe ratio'}
sharpe = float(excess_returns.mean() / excess_returns.std() * np.sqrt(252))
return {
'ticker': ticker,
'sharpe_ratio': round(sharpe, 3),
'interpretation': 'excellent' if sharpe > 2 else 'good' if sharpe > 1 else 'acceptable' if sharpe > 0 else 'poor'
}Maksimum Gerileme
Maksimum gerileme (MDD), portföy değerindeki en büyük zirveden dibe düşüştür. Yatırımcının zirveden alıp dipten satması durumunda karşılaşacağı en kötü kaybı temsil eder.
import yfinance as yf
import numpy as np
def max_drawdown(ticker: str, period: str = '1y') -> dict:
hist = yf.Ticker(ticker).history(period=period)['Close']
if hist.empty:
return {'error': 'No data'}
rolling_max = hist.cummax()
drawdown = (hist - rolling_max) / rolling_max
mdd = float(drawdown.min())
mdd_date = str(drawdown.idxmin().date())
return {
'ticker': ticker,
'max_drawdown_pct': round(mdd * 100, 2),
'drawdown_date': mdd_date,
'interpretation': 'severe' if mdd < -0.30 else 'moderate' if mdd < -0.15 else 'mild'
}Korelasyon Matrisi
Korelasyon matrisi, varlıkların birlikte nasıl hareket ettiğini gösterir. Varlıklar arasındaki düşük veya negatif korelasyon çeşitlendirme avantajı sağlar; biri düşerken diğeri düşmeyebilir. Bu bilgi, varlık seçimine ve yeniden dengeleme kararlarına yön verir.
import pandas as pd
import yfinance as yf
def correlation_matrix(tickers: list[str], period: str = '1y') -> dict:
prices = yf.download(tickers, period=period)['Close']
returns = prices.pct_change().dropna()
corr = returns.corr().round(3)
# Convert to JSON-serializable format
result = {}
for t1 in tickers:
result[t1] = {}
for t2 in tickers:
if t1 in corr.columns and t2 in corr.index:
result[t1][t2] = float(corr.loc[t2, t1])
return {'correlation': result, 'period': period}Oynaklık ve Beta
Yıllıklandırılmış oynaklık (252 işlem gününe göre ölçeklendirilmiş standart sapma) mutlak riski ölçer. Beta, piyasaya göre riski ölçer (genellikle S&P 500): beta > 1, piyasanın daha oynak olduğu anlamına gelir.
import numpy as np
import yfinance as yf
def volatility_and_beta(ticker: str, benchmark: str = 'SPY',
period: str = '1y') -> dict:
data = yf.download([ticker, benchmark], period=period)['Close'].pct_change().dropna()
if ticker not in data.columns or benchmark not in data.columns:
return {'error': 'Insufficient data'}
t_ret = data[ticker]
b_ret = data[benchmark]
vol_annualized = float(t_ret.std() * np.sqrt(252))
cov = np.cov(t_ret, b_ret)
beta = float(cov[0][1] / cov[1][1]) if cov[1][1] != 0 else 0.0
return {
'ticker': ticker,
'annual_vol_pct': round(vol_annualized * 100, 2),
'beta': round(beta, 3),
'market_sensitivity': 'high' if beta > 1.3 else 'market' if beta > 0.7 else 'low'
}Portföy Düzeyinde Getiri ve Risk
Ağırlıklı getirileri ve oynaklığı hesaplayarak portföyün tamamını analiz edin. Çeşitlendirme sayesinde portföyün riski, tek tek varlıkların herhangi birinden daha düşük olabilir.
import pandas as pd, numpy as np
import yfinance as yf
def portfolio_metrics(holdings: dict, period: str = '1y') -> dict:
tickers = list(holdings.keys())
weights = np.array(list(holdings.values()))
weights /= weights.sum() # normalize to 1.0
prices = yf.download(tickers, period=period)['Close'].pct_change().dropna()
port_ret = (prices * weights).sum(axis=1)
cov_matrix = prices.cov() * 252 # annualized
port_return = float(port_ret.mean() * 252)
port_vol = float(np.sqrt(weights @ cov_matrix.values @ weights))
port_sharpe = port_return / port_vol if port_vol > 0 else 0
return {
'annual_return_pct': round(port_return * 100, 2),
'annual_vol_pct': round(port_vol * 100, 2),
'sharpe_ratio': round(port_sharpe, 3),
'holdings': {t: round(float(w), 3) for t, w in zip(tickers, weights)}
}Yeniden Dengeleme Önerisi
Farklı varlıklar farklı oranlarda büyüdükçe portföy dağılımı hedefinden sapar. Yeniden dengeleme aracı, mevcut ağırlıkları hedef ağırlıklarla karşılaştırır ve hedef dağılımı yeniden sağlamak için işlemler önerir.
def rebalancing_suggestion(current_values: dict, target_weights: dict) -> dict:
total_value = sum(current_values.values())
current_weights = {t: v / total_value for t, v in current_values.items()}
trades = {}
for ticker in target_weights:
current_w = current_weights.get(ticker, 0)
target_w = target_weights[ticker]
diff_w = target_w - current_w
diff_usd = diff_w * total_value
if abs(diff_w) > 0.01: # only suggest if drift > 1%
trades[ticker] = {
'action': 'BUY' if diff_usd > 0 else 'SELL',
'amount_usd': round(abs(diff_usd), 2),
'from_weight': round(current_w, 4),
'to_weight': round(target_w, 4)
}
return {'total_portfolio': round(total_value, 2), 'trades': trades}
if __name__ == '__main__':
current = {'AAPL': 6000, 'BND': 2000, 'VTI': 2000}
target = {'AAPL': 0.4, 'BND': 0.3, 'VTI': 0.3}
result = rebalancing_suggestion(current, target)
print('Total portfolio: $%s' % result['total_portfolio'])
for ticker, trade in result['trades'].items():
print(f" {ticker}: {trade['action']} ${trade['amount_usd']} "
f"(weight {trade['from_weight']} -> {trade['to_weight']})")
LLM İçin Analiz Araçlarını Kaydetme
Her analiz işlevini bir aracı aracı olarak kaydedin. LLM bunları sırayla çağırır: önce verileri alır, ardından ölçütleri hesaplar ve son olarak yeniden dengeleme önerisini oluşturur.
FINANCIAL_TOOLS = [
{
'type': 'function',
'function': {
'name': 'calculate_returns',
'description': 'Calculate total and daily returns for a ticker.',
'parameters': {'type': 'object',
'properties': {
'ticker': {'type': 'string'},
'period': {'type': 'string', 'default': '1y'}
}, 'required': ['ticker']}
}
},
{
'type': 'function',
'function': {
'name': 'sharpe_ratio',
'description': 'Compute the annualized Sharpe ratio.',
'parameters': {'type': 'object',
'properties': {
'ticker': {'type': 'string'},
'period': {'type': 'string', 'default': '1y'}
}, 'required': ['ticker']}
}
}
]
if __name__ == '__main__':
print('Registered financial tools for the LLM:')
for tool in FINANCIAL_TOOLS:
fn = tool['function']
print(f" {fn['name']}: {fn['description']}")
Sade Dilde Portföy Özeti Oluşturma
Ölçütleri hesapladıktan sonra LLM'nin sayıları uygulanabilir önerilere dönüştürmesini sağlayın. Ölçütler girdidir; nihai çıktı, nicel analiz uzmanı olmayan bir yatırımcının okuyabileceği şekilde olmalıdır.
import openai, json
client = openai.OpenAI(api_key='YOUR_OPENAI_KEY')
def portfolio_narrative(metrics: dict, holdings: dict) -> str:
prompt = (
f'Portfolio metrics:\n{json.dumps(metrics, indent=2)}\n\n'
f'Holdings: {json.dumps(holdings)}\n\n'
f'Write a 3-sentence plain-language portfolio assessment for a retail investor.\n'
f'Include: overall performance, main risk, and one recommendation.'
)
resp = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': prompt}]
)
return resp.choices[0].message.contentHesaplanan Ölçütleri Önbelleğe Alma
Aynı temel verilerden hesaplanan ölçütler aynı olacaktır. Her aracı turunda Sharpe oranlarını ve gerilemeleri yeniden hesaplamaktan kaçınmak için hesaplanan ölçütleri ham verilerin yanında önbelleğe alın.
import time, hashlib, json
metrics_cache = {}
def cached_metric(func, *args, ttl: int = 3600):
key = hashlib.md5(f'{func.__name__}:{args}'.encode()).hexdigest()
entry = metrics_cache.get(key)
if entry and time.time() - entry['ts'] < ttl:
return entry['data']
result = func(*args)
metrics_cache[key] = {'data': result, 'ts': time.time()}
return result
# Usage:
# sharpe = cached_metric(sharpe_ratio, 'AAPL', '1y')
if __name__ == '__main__':
def slow_average(*nums):
return sum(nums) / len(nums)
r1 = cached_metric(slow_average, 1, 2, 3)
r2 = cached_metric(slow_average, 1, 2, 3)
print('First call result:', r1)
print('Second call result (served from cache):', r2)
print('Cache entries:', len(metrics_cache))
2,0'ın üzerindeki Sharpe oranı neyi gösterir
Sharpe oranı, portföyler ve tek tek varlıklar arasındaki riske göre düzeltilmiş performansı karşılaştırmak için kullanılan standart bir ölçüttür.
Portföy Analizi Araçları Özeti
Bir finansal aracının araç seti şunları içerir: getiriler için pct_change(), riske göre düzeltilmiş performans için Sharpe oranı, en kötü durumdaki kayıp için maksimum gerileme, çeşitlendirme için korelasyon matrisi, piyasa duyarlılığı için beta ve portföy bakımı için yeniden dengeleme önerileri.
Her birini aracı aracı olarak kaydedin ve verimlilik için hesaplanan sonuçları önbelleğe alın.
Sıkça Sorulan Sorular
“Portföy Analizi Aracı Araçları” dersi ücretsiz mi?
Evet — “Portföy Analizi Aracı Araçları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.
“Portföy Analizi Aracı Araçları” dersinde ne öğreneceğim?
Aracı tarafından çalıştırılan kodla getiri hesaplama, Sharpe oranı ve düşüş analizi. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Agents öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Portföy Analizi Aracı Araçları” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Piyasa Verisi API Entegrasyonu
- Portföy Analizi Aracı Araçları
- Risk ve Uyumluluk Güvenlik Sınırları
- Aracı Kararlarını Geriye Dönük Test Etme