2026. június 13., szombat

A legjobb 20 részvény

Ez a kód letölti a megadott részvények havi adatait és kiírja az első öt nap záró árát, valamint az átlagos napi hozamot. Ahhoz, hogy valóban a 'legjobb 20' részvényt gyűjtsd ki, meg kell határoznod, milyen kritériumok alapján szeretnéd rangsorolni őket (pl. piaci kapitalizáció, elmúlt évi hozam, osztalék, volatilitás stb.), majd ehhez megfelelő adatokat kell gyűjteni és elemezni. Ehhez gyakran komplexebb adatszolgáltatásokra vagy API-kra van szükség. 

-------------

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