import tkinter as tk
from tkinter import ttk
import urllib.request, json
from datetime import datetime
TICKERS = ["AAPL", "MSFT",
"NVDA", "GOOGL"]
F = {
"AAPL":
{"month": [(datetime(2026,1,2),185.0),(datetime(2026,1,3),186.5),(datetime(2026,1,4),184.2)],
"year": [(datetime(2026,1,2),172.0),(datetime(2026,6,2),190.0),(datetime(2025,1,2),210.0)],
"market_cap": 3000000000000, "dividend_yield":
0.005},
"MSFT":
{"month": [(datetime(2026,1,2),410.0),(datetime(2026,1,3),412.0),(datetime(2026,1,4),409.5)],
"year": [(datetime(2026,1,2),370.0),(datetime(2026,6,2),420.0),(datetime(2025,1,2),455.0)],
"market_cap": 2900000000000, "dividend_yield":
0.007},
"NVDA":
{"month": [(datetime(2026,1,2),620.0),(datetime(2026,1,3),630.0),(datetime(2026,1,4),625.0)],
"year": [(datetime(2026,1,2),490.0),(datetime(2026,6,2),700.0),(datetime(2025,1,2),850.0)],
"market_cap": 2500000000000, "dividend_yield": 0.0},
"GOOGL":
{"month": [(datetime(2026,1,2),138.0),(datetime(2026,1,3),139.2),(datetime(2026,1,4),137.8)],
"year": [(datetime(2026,1,2),130.0),(datetime(2026,6,2),145.0),(datetime(2025,1,2),170.0)],
"market_cap": 1800000000000, "dividend_yield": 0.0}
}
def fb(s, r): return F.get(s, {}).get("month" if r
== "1mo" else "year", [])
def fbf(s): x = F.get(s, {}); return
x.get("market_cap", 0), x.get("dividend_yield", 0.0)
def j(u):
try:
with
urllib.request.urlopen(urllib.request.Request(u,
headers={"User-Agent": "Mozilla/5.0"}), timeout=20) as r:
return
json.loads(r.read().decode())
except Exception:
return None
def chart(s, r="1mo"):
d =
j(f"https://query1.finance.yahoo.com/v8/finance/chart/{s}?range={r}&interval=1d")
try:
x =
d["chart"]["result"][0]
rows =
[(datetime.fromtimestamp(t), float(c)) for t, c in
zip(x.get("timestamp", []), x.get("indicators",
{}).get("quote", [{}])[0].get("close", [])) if c is not
None]
return rows or
fb(s, r)
except Exception:
return fb(s,
r)
def fund(s):
d =
j(f"https://query1.finance.yahoo.com/v10/finance/quoteSummary/{s}?modules=price,summaryDetail")
try:
x =
d["quoteSummary"]["result"][0]
return
x.get("price", {}).get("marketCap",
{}).get("raw", 0), x.get("summaryDetail",
{}).get("dividendYield", {}).get("raw", 0.0)
except Exception:
return fbf(s)
def avg(cs):
rs = [(cs[i] -
cs[i-1]) / cs[i-1] for i in range(1, len(cs)) if cs[i-1]]
return sum(rs) /
len(rs) if rs else 0.0
def vol(cs):
rs = [(cs[i] -
cs[i-1]) / cs[i-1] for i in range(1, len(cs)) if cs[i-1]]
if len(rs) < 2:
return 0.0
m = sum(rs) / len(rs)
return ((sum((r -
m) ** 2 for r in rs) / (len(rs) - 1)) ** 0.5) * (252 ** 0.5)
def log(t):
out.insert(tk.END,
t + "\n")
out.see(tk.END)
root.update_idletasks()
def analyze():
out.delete("1.0", tk.END)
log("Elemzés
indul...")
res = []
for s in TICKERS:
log(f"Letöltés: {s}")
m, y =
chart(s, "1mo"), chart(s, "1y")
if not m or
not y:
log(f"Hiba ({s}): nincs adat.")
continue
mc = [c for _,
c in m]
yc = [c for _,
c in y]
adr, v =
avg(mc), vol(mc)
yr = (yc[-1] /
yc[0]) - 1 if yc and yc[0] else 0.0
cap, dy =
fund(s)
res.append((s,
cap, yr, dy, v, adr))
log("")
log(s)
log("Első
5 kereskedési nap záróára:")
for d, c in
m[:5]: log(f"{d.date()} : {c:.2f}")
log(f"Átlagos napi hozam: {adr:.4%}")
log(f"Éves hozam: {yr:.2%}")
log(f"Volatilitás: {v:.2%}")
log(f"Piaci kapitalizáció: {cap:,.0f} USD")
log(f"Osztalékhozam: {dy:.2%}")
if res:
log("")
log("=" * 70)
log("RANGSOR")
log("=" * 70)
for s, cap,
yr, dy, v, adr in sorted(res, key=lambda x: (x[1], x[2], x[3], -x[4]),
reverse=True):
log(f"{s} | YearlyReturn: {yr:.2%} | DividendYield: {dy:.2%} |
Volatility: {v:.2%} | AvgDailyReturn: {adr:.4%}")
else:
log("Nem
sikerült eredményt előállítani.")
root = tk.Tk()
root.title("Részvény elemző")
frm = ttk.Frame(root, padding=10)
frm.pack(fill="both", expand=True)
ttk.Button(frm, text="Elemzés",
command=analyze).pack(pady=5)
out = tk.Text(frm, width=100, height=30)
out.pack(fill="both", expand=True)
out.insert(tk.END, "Nyomd meg az 'Elemzés'
gombot.\n")
root.mainloop()
Nincsenek megjegyzések:
Megjegyzés küldése