2026. július 29., szerda

Yahoo Finance

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.

Nincsenek megjegyzések:

Megjegyzés küldése