2026. május 27., szerda

Tőzsdei elemzés

Írtam neked egy programot, ami elemzi a tőzsdei részvények árfolyam-ingadozását és javaslatot tesz a vásárlásra! Sok szerencsét!
--------------

import pandas as pd
import numpy as np
import yfinance as yf
from datetime import datetime, timedelta
import warnings
warnings.filterwarnings('ignore')

def analyze_stock(symbol, days=60):
    """
    Egyetlen részvény elemzése
    """
    print(f"\n{'='*60}")
    print(f"Elemzés: {symbol}")
    print(f"{'='*60}")
    
    try:
        # Adatok letöltése
        stock = yf.Ticker(symbol)
        df = stock.history(period=f"{days}d")
        
        if len(df) == 0:
            print(f"? Nincs adat {symbol} számára")
            return None
        
        # Alapvető mutatók
        current_price = df['Close'].iloc[-1]
        prev_close = df['Close'].iloc[-2]
        change = ((current_price - prev_close) / prev_close) * 100
        
        # Mozgóátlagok
        ma_5 = df['Close'].rolling(window=5).mean().iloc[-1]
        ma_20 = df['Close'].rolling(window=20).mean().iloc[-1]
        ma_50 = df['Close'].rolling(window=50).mean().iloc[-1] if len(df) >= 50 else ma_20
        ma_200 = df['Close'].rolling(window=200).mean().iloc[-1] if len(df) >= 200 else ma_50
        
        # RSI (Relative Strength Index)
        delta = df['Close'].diff()
        gain = delta.where(delta > 0, 0).rolling(window=14).mean().iloc[-1]
        loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean().iloc[-1]
        rs = gain / loss if loss != 0 else 0
        rsi = 100 - (100 / (1 + rs))
        
        # Volatilitás
        volatility = df['Close'].pct_change().std() * np.sqrt(252) * 100
        
        # Volume
        volume = df['Volume'].iloc[-1]
        avg_volume = df['Volume'].rolling(window=20).mean().iloc[-1]
        volume_ratio = volume / avg_volume if avg_volume > 0 else 1
        
        # Pontszám számítása
        score = 0
        reasons_buy = []
        reasons_sell = []
        
        # Ár változás
        if change > 2:
            score += 15
            reasons_buy.append(f"Pozitív árfolyam-változás: +{change:.2f}%")
        elif change < -2:
            score -= 10
            reasons_sell.append(f"Negatív árfolyam-változás: {change:.2f}%")
        else:
            score += 5
        
        # RSI értékelés
        if rsi < 30:
            score += 25
            reasons_buy.append(f"Túladott (RSI: {rsi:.1f}) - olcsó")
        elif rsi > 70:
            score -= 20
            reasons_sell.append(f"Túlvetett (RSI: {rsi:.1f}) - drága")
        else:
            score += 10
            reasons_buy.append(f"RSI normál tartományban: {rsi:.1f}")
        
        # Mozgóátlagok
        if current_price > ma_5:
            score += 10
            reasons_buy.append("Ár > 5 napos MA (rövid távú emelkedés)")
        else:
            score -= 5
            reasons_sell.append("Ár < 5 napos MA")
        
        if current_price > ma_20:
            score += 15
            reasons_buy.append("Ár > 20 napos MA (közép távú emelkedés)")
        else:
            score -= 10
            reasons_sell.append("Ár < 20 napos MA")
        
        if current_price > ma_50:
            score += 15
            reasons_buy.append("Ár > 50 napos MA (hosszú távú emelkedés)")
        else:
            score -= 10
            reasons_sell.append("Ár < 50 napos MA")
        
        # Volume
        if volume_ratio > 1.5:
            score += 10
            reasons_buy.append(f"Növekedett volume ({volume_ratio:.1f}x az átlag)")
        
        # Volatilitás
        if volatility < 20:
            score += 10
            reasons_buy.append(f"Alacsony volatilitás: {volatility:.1f}%")
        elif volatility > 35:
            score -= 5
            reasons_sell.append(f"Magas volatilitás: {volatility:.1f}%")
        
        return {
            'symbol': symbol,
            'price': current_price,
            'change': change,
            'ma_5': ma_5,
            'ma_20': ma_20,
            'ma_50': ma_50,
            'rsi': rsi,
            'volatility': volatility,
            'volume_ratio': volume_ratio,
            'score': score,
            'reasons_buy': reasons_buy,
            'reasons_sell': reasons_sell
        }
    
    except Exception as e:
        print(f"Hiba {symbol} elemzésekor: {e}")
        return None


def analyze_portfolio(stocks, days=60):
    """
    Több részvény elemzése és összehasonlítása
    """
    print("=" * 60)
    print("TŐZSDEI RÉSZVÉNY ELEMZŐ PROGRAM")
    print("=" * 60)
    print(f"Dátum: {datetime.now().strftime('%Y-%m-%d %H:%M')}")
    print(f"Elemzett részvények: {', '.join(stocks)}")
    
    results = []
    
    for symbol in stocks:
        result = analyze_stock(symbol, days)
        if result:
            results.append(result)
    
    # Rangsorolás
    results.sort(key=lambda x: x['score'], reverse=True)
    
    return results


def print_recommendations(results):
    """
    Ajánlások kiírása
    """
    print("\n" + "=" * 60)
    print("?? ELEMZÉSI EREDMÉNYEK")
    print("=" * 60)
    
    for i, r in enumerate(results, 1):
        print(f"\n{i}. {r['symbol']} - ${r['price']:.2f} ({r['change']:+.2f}%)")
        print(f"   RSI: {r['rsi']:.1f} | Volatilitás: {r['volatility']:.1f}%")
        print(f"   Pontszám: {r['score']}/100")
        
        if r['reasons_buy']:
            print("   ?? VÁSÁRLÁS ÉRVEI:")
            for reason in r['reasons_buy'][:3]:
                print(f"      ? {reason}")
        
        if r['reasons_sell']:
            print("   ? ELADÁS ÉRVEI:")
            for reason in r['reasons_sell'][:2]:
                print(f"      ? {reason}")
    
    print("\n" + "=" * 60)
    print("?? AJÁNLÁS")
    print("=" * 60)
    
    if not results:
        print("? Nincs elemzésre alkalmas adat")
        return
    
    best = results[0]
    
    if best['score'] >= 50:
        recommendation = "VÁSÁRLÁS"
        emoji = "??"
    elif best['score'] >= 20:
        recommendation = "FIGYELMES VÁRAKOZÁS"
        emoji = "??"
    else:
        recommendation = "ELKERÜLÉS"
        emoji = "??"
    
    print(f"\n{emoji} JAVASOLT RÉSZVÉNY: {best['symbol']}")
    print(f"   Ár: ${best['price']:.2f}")
    print(f"   Pontszám: {best['score']}/100")
    print(f"   Döntés: {recommendation}")
    
    print(f"\n   MIÉRT ÉRDEMES {recommendation.lower()}?")
    for reason in best['reasons_buy']:
        print(f"      ? {reason}")
    
    if best['reasons_sell']:
        print(f"\n   KOCKÁZATOK:")
        for reason in best['reasons_sell']:
            print(f"      ??  {reason}")


def main():
    """
    Fő program
    """
    # Példa részvények (változtathatod)
    # Amerikai részvények: AAPL, GOOGL, MSFT, TSLA, NVDA, AMZN, META, NFLX
    # Magyar részvények: MOLBN, OPUSBN, RICHBVN (BÉT)
    stocks_to_analyze = ['AAPL', 'GOOGL', 'MSFT', 'TSLA', 'NVDA']
    
    # Elemzés
    results = analyze_portfolio(stocks_to_analyze, days=60)
    
    # Ajánlások
    print_recommendations(results)
    
    print("\n" + "=" * 60)
    print("??  FONTOS FIGYELMEZTETÉS")
    print("=" * 60)
    
if __name__ == "__main__":
    # Telepítés szükséges: pip install yfinance pandas numpy
    main()
---------------------

Nincsenek megjegyzések:

Megjegyzés küldése