A svájci frankban (CHF) jegyzett vagy a svájci részvénypiacon elérhető részvények (mint a Nestlé, Novartis vagy a Roche) globális szinten a legbiztonságosabbak közé tartoznak, árfolyamuk a stabil gazdasági környezet és a nemzeti valuta miatt védelmet nyújt a piaci turbulenciák ellen.A legfontosabb svájci részvények és piacokA svájci tőzsde (SIX Swiss Exchange) legjelentősebb vállalatai az SMI (Swiss Market Index) részét képezik, amely a 20 legnagyobb és leglikvidabb svájci "blue chip" vállalatot tömöríti. A főbb szektorok és a legismertebb cégek:Egészségügy és Gyógyszeripar: Novartis, Roche, Lonza Group.Élelmiszeripar: Nestlé.Pénzügyi szektor: UBS Group, Zurich Insurance.Ipar és Technológia: ABB, Holcim, Geberit.Hogyan érhetők el a CHF részvények?A svájci részvények közvetlenül vagy befektetési alapokon/ETF-eken keresztül vásárolhatók meg. A program a Sharpe-szám alapján javasol, ami a legelfogadottabb mutató a kockázatos befektetések összehasonlítására – figyelembe veszi mind a hozamot, mind a kockázatot .http://slpython.blogspot.com/2016/09/10-modulok-csomagok.html https://www.agt.bme.hu/gis/python/python3_oktato.pdf
Mit csinál a program:
Funkció Leírás
Adatlekérdezés Letölti az elmúlt 1 év napi záróárfolyamát a 3 részvényről
📈 Hozamszámítás Számolja a teljes hozamot, átlagos napi hozamot
📉 Volatilitás Mértéke a kockázatot (árfolyamingadozást)
📊 Sharpe-szám Kockázat-kihozatali arány (minél magasabb, annál jobb)
🏆 Javaslat A legmagasabb Sharpe-számú részvényt ajánlja
📊 Grafikon Létrehoz vizualizációt a teljesítményről
----------------
pip install yfinance pandas numpy matplotlib
--------------
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
# Define the tickers for the companies (US markets)
tickers = {
"Nestlé": "NSRGY", # Nestlé OTC
"Novartis": "NVS", # Novartis NYSE
"Roche": "RHHBY" # Roche OTC
}
# Get data for the past year
end_date = datetime.now()
start_date = end_date - timedelta(days=365)
print("=== Letöltöm a részvényadatokat az elmúlt évből... ===\n")
# Download historical data
data = {}
for name, ticker in tickers.items():
try:
df = yf.download(ticker, start=start_date, end=end_date, progress=False)
if not df.empty:
# Handle multi-level columns if present
if isinstance(df.columns, pd.MultiIndex):
df = df[('Close', '')]
data[name] = df
print(f"✓ {name} ({ticker}) adatok letöltve")
else:
print(f"✗ Nincs adat {name} számára ({ticker})")
except Exception as e:
print(f"✗ Hiba {name} lekérésekor: {e}")
if not data:
print("\nNincs elérhető részvényadat. Nem folytatható az elemzés.")
else:
# Create a combined DataFrame
df_combined = pd.DataFrame(data)
# Calculate daily returns
daily_returns = df_combined.pct_change().dropna()
# Calculate key metrics
metrics = pd.DataFrame({
'Átlagos Napi hozam (%)': (daily_returns.mean() * 252 * 100).round(2), # Annualized
'Volatilitás (%)': (daily_returns.std() * np.sqrt(252) * 100).round(2), # Annualized volatility
'Teljes Hozam (%)': ((df_combined.iloc[-1] / df_combined.iloc[0]) - 1) * 100,
'Maximális Visszahúzás (%)': pd.DataFrame({
name: ((df_combined[name] - df_combined[name].cummax()) / df_combined[name].cummax() * 100).min()
for name in df_combined.columns
})['Maximális Visszahúzás (%)'].round(2)
})
# Calculate Sharpe Ratio (assuming risk-free rate of 4% annually)
risk_free_rate = 0.04
metrics['Sharpe-Szám'] = (metrics['Átlagos Napi hozam (%)'] / 100 - risk_free_rate) / (metrics['Volatilitás (%)'] / 100)
metrics['Sharpe-Szám'] = metrics['Sharpe-Szám'].round(2)
# Make a recommendation based on Sharpe Ratio
best_sharpe_ticker = metrics['Sharpe-Szám'].idxmax()
best_sharpe_value = metrics.loc[best_sharpe_ticker, 'Sharpe-Szám']
# Print results
print("\n" + "="*70)
print("=== RÉSZVÉNYHOZAM ÖSSZEHASONLÍTÁS (Elmúlt 1 év) ===")
print("="*70)
print(metrics.to_string())
print("\n" + "="*70)
print("AJÁNLÁS:")
print("="*70)
print(f"🏆 {best_sharpe_ticker} érdemesebb megvenni!")
print(f" Indoklás: Legmagasabb Sharpe-szám ({best_sharpe_value}), ami a legjobb")
print(f" kockázat-kihozatali arányt jelenti az elmúlt évben.")
print("\n📊 Részletes magyarázat:")
print(f" • {best_sharpe_ticker} hozama: {metrics.loc[best_sharpe_ticker, 'Teljes Hozam (%)']:.2f}%")
print(f" • Volatilitása: {metrics.loc[best_sharpe_ticker, 'Volatilitás (%)']:.2f}%")
print(f" • Maximális veszteség: {metrics.loc[best_sharpe_ticker, 'Maximális Visszahúzás (%)']:.2f}%")
# Create visualization
plt.style.use('seaborn-v0_8')
fig, axes = plt.subplots(2, 1, figsize=(14, 10))
# Plot 1: Normalized price performance
normalized_prices = (df_combined / df_combined.iloc[0]) * 100
for name in normalized_prices.columns:
axes[0].plot(normalized_prices.index, normalized_prices[name],
label=name, linewidth=2.5, alpha=0.8)
axes[0].set_title('Részvényárak teljesítménye (Normálva, kezdőérték: 100)', fontsize=14, fontweight='bold')
axes[0].set_xlabel('Dátum', fontsize=12)
axes[0].set_ylabel('Normált ár', fontsize=12)
axes[0].legend(loc='best', fontsize=10)
axes[0].grid(True, alpha=0.3)
axes[0].axhline(y=100, color='gray', linestyle='--', alpha=0.5)
# Plot 2: Metrics comparison
metrics_to_plot = metrics[['Teljes Hozam (%)', 'Volatilitás (%)']].T
metrics_to_plot.columns = tickers.keys()
x = np.arange(len(metrics_to_plot.index))
width = 0.35
for i, (name, ticker) in enumerate(tickers.items()):
axes[1].bar(x + i*width, [metrics.loc[name, 'Teljes Hozam (%)')],
width, label=f"{name} Hozam", alpha=0.8)
axes[1].set_title('Összehasonlítás: Hozam vs Volatilitás', fontsize=14, fontweight='bold')
axes[1].set_xlabel('Részvény', fontsize=12)
axes[1].set_ylabel('Százalék (%)', fontsize=12)
axes[1].set_xticks(x + width)
axes[1].set_xticklabels(metrics_to_plot.index, rotation=45)
axes[1].legend(loc='best', fontsize=9)
axes[1].grid(True, alpha=0.3, axis='y')
plt.tight_layout()
plt.savefig('output/részvény_összehasonlítás.png', dpi=150, bbox_inches='tight')
plt.close()
print("\n✅ Az elemzés és grafikon mentve: 'output/részvény_összehasonlítás.png'")
---------------
Nincsenek megjegyzések:
Megjegyzés küldése