Az alábbi program:
* letölti a megadott **16 amerikai részvény** napi árfolyamát a Yahoo Finance-ról;
* kiszámítja a napi hozamokat;
* meghatározza a várható éves hozamot;
* kiszámítja a kovariancia-mátrixot;
* **10 000 véletlen portfóliót** generál;
* minden portfólióra kiszámolja
* várható éves hozamot,
* kockázatot (szórást),
* Sharpe-mutatót;
* kiválasztja a **legjobb (maximális Sharpe-rátájú) portfóliót**;
* kirajzolja a **Markowitz-hatékony határ** közelítését.
Ehhez telepíteni kell:
```bash
pip install yfinance pandas numpy matplotlib scipy
```
A teljes program:
```python
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# -----------------------------------------------------
# Részvények
# -----------------------------------------------------
stocks = [
'AAPL','MSFT','AMZN','GOOGL',
'META','TSLA','JNJ','PFE',
'PG','KO','PEP','NKE',
'XOM','CVX','JPM','C'
]
# -----------------------------------------------------
# Időszak
# -----------------------------------------------------
start_date = "2026-01-01"
end_date = "2026-07-28"
print("Adatok letöltése...")
data = yf.download(
stocks,
start=start_date,
end=end_date,
auto_adjust=True,
progress=True
)
prices = data["Close"]
print(prices.tail())
# -----------------------------------------------------
# Hiányzó adatok törlése
# -----------------------------------------------------
prices = prices.dropna(axis=0)
# -----------------------------------------------------
# Napi hozamok
# -----------------------------------------------------
returns = prices.pct_change().dropna()
# -----------------------------------------------------
# Évesített várható hozam
# -----------------------------------------------------
mean_returns = returns.mean() * 252
# -----------------------------------------------------
# Kovariancia
# -----------------------------------------------------
cov_matrix = returns.cov() * 252
# -----------------------------------------------------
# Monte-Carlo Markowitz
# -----------------------------------------------------
num_portfolios = 10000
results = np.zeros((3, num_portfolios))
weights_record = []
for i in range(num_portfolios):
weights = np.random.random(len(stocks))
weights /= np.sum(weights)
weights_record.append(weights)
portfolio_return = np.sum(mean_returns * weights)
portfolio_std = np.sqrt(
np.dot(weights.T,
np.dot(cov_matrix, weights))
)
sharpe = portfolio_return / portfolio_std
results[0, i] = portfolio_std
results[1, i] = portfolio_return
results[2, i] = sharpe
# -----------------------------------------------------
# Legjobb Sharpe-portfólió
# -----------------------------------------------------
best = np.argmax(results[2])
best_weights = weights_record[best]
print("\n==============================")
print("Optimális portfólió")
print("==============================\n")
for stock, weight in zip(stocks, best_weights):
print(f"{stock:6s}: {weight*100:6.2f}%")
print()
print(f"Éves várható hozam : {results[1,best]*100:.2f}%")
print(f"Éves kockázat : {results[0,best]*100:.2f}%")
print(f"Sharpe mutató : {results[2,best]:.3f}")
# -----------------------------------------------------
# Hatékony határ (Monte Carlo)
# -----------------------------------------------------
plt.figure(figsize=(12,8))
scatter = plt.scatter(
results[0],
results[1],
c=results[2],
cmap="viridis",
s=6
)
plt.colorbar(scatter,label="Sharpe")
plt.scatter(
results[0,best],
results[1,best],
color="red",
s=220,
marker="*",
label="Optimális portfólió"
)
plt.xlabel("Éves kockázat (szórás)")
plt.ylabel("Éves várható hozam")
plt.title("Markowitz-portfólióoptimalizálás")
plt.grid(True)
plt.legend()
plt.show()
# -----------------------------------------------------
# Korrelációs mátrix
# -----------------------------------------------------
print("\nKorreláció:")
print(returns.corr().round(2))
```
## Mit csinál ez a program?
A program a klasszikus **Markowitz-portfólióoptimalizálás** egy egyszerű Monte Carlo-megközelítését valósítja meg:
1. letölti a történelmi árfolyamokat;
2. kiszámolja a napi hozamokat;
3. évesíti a várható hozamot és a kockázatot;
4. 10 000 véletlen súlyozású portfóliót állít elő;
5. mindegyikre kiszámolja a várható hozamot, a szórást és a Sharpe-mutatót;
6. kiválasztja azt a portfóliót, amelynek a legmagasabb a Sharpe-mutató;
7. grafikusan megjeleníti a lehetséges portfóliókat, valamint az optimális portfóliót.
### Fontos megjegyzés az időszakról
A kódban szereplő:
```python
start_date = "2026-01-01"
end_date = "2026-07-28"
```
csak akkor működik, ha a Yahoo Finance adatbázisában ezek az adatok már elérhetők. Ha ezt a programot egy korábbi időpontban futtatják, a letöltés üres adathalmazt eredményezhet. Ilyenkor érdemes egy már lezárt történelmi időszakot megadni, vagy az aktuális napig letölteni az adatokat.
Ez a program jó alap egy professzionális portfólióelemző rendszerhez. Továbbfejleszthető például a valódi Markowitz-hatékony határ numerikus optimalizálásával (`scipy.optimize`), osztalékok figyelembevételével, kockázatmentes kamatlábbal számított Sharpe-mutatóval, Value at Risk (VaR), CVaR, valamint Black–Litterman vagy gépi tanulási alapú portfólióoptimalizálási módszerekkel.

