Do tego skryptu dodaj jeszcze obliczanie momentum dla okresu 9 miesięcy.
Skrypt:
import yfinance as yf
import pandas as pd
from tabulate import tabulate

# Funkcja do obliczania momentum
def calculate_momentum(initial_price, final_price):
    return ((final_price - initial_price) / initial_price) * 100

# Funkcja pobierająca dane z Yahoo Finance
def get_etf_data(etf_symbol, period):
    etf = yf.Ticker(etf_symbol)
    
    # Pobieramy dane historyczne z wybranego okresu
    data = etf.history(period=period)
    
    # Zwracamy dane z daty początkowej (najstarsza dostępna) i ostatnią datę (obecna cena)
    initial_price = data['Close'].iloc[0]  # Pierwsza cena z okresu
    final_price = data['Close'].iloc[-1]   # Ostatnia cena z okresu
    
    return initial_price, final_price

# Funkcja do parsowania linii z pliku
def parse_etf_line(line):
    line = line.strip()
    if '#' in line:
        etf_symbol, alternative_name = line.split('#', 1)
        etf_symbol = etf_symbol.strip()
        alternative_name = alternative_name.strip()
        return etf_symbol, alternative_name
    else:
        return line, None

# Funkcja główna
def main():
    etfs_data = []  # Lista do przechowywania danych ETF-ów
    
    # Wczytywanie symboli ETF-ów z pliku
    try:
        with open('etfs.txt', 'r', encoding='utf-8') as file:
            etf_lines = [line.strip() for line in file.readlines() if line.strip()]
    except FileNotFoundError:
        print("Plik 'etfs.txt' nie został znaleziony.")
        return
    
    # Pobranie danych historycznych dla każdego ETF-a
    for etf_line in etf_lines:
        etf_symbol, alternative_name = parse_etf_line(etf_line)
        
        try:
            print(f"Pobieram dane dla ETF-a: {etf_symbol}...")
            initial_price_6, final_price_6 = get_etf_data(etf_symbol, "6mo")
            initial_price_12, final_price_12 = get_etf_data(etf_symbol, "1y")
        except Exception as e:
            print(f"Błąd podczas pobierania danych dla ETF-a {etf_symbol}: {e}")
            continue
        
        # Obliczanie momentum dla obu okresów
        momentum_6 = calculate_momentum(initial_price_6, final_price_6)
        momentum_12 = calculate_momentum(initial_price_12, final_price_12)
        
        # Określenie nazwy do wyświetlenia
        if alternative_name:
            display_name = f"{alternative_name} ({etf_symbol})"
        else:
            display_name = etf_symbol
        
        # Dodanie danych do listy
        etfs_data.append({
            'name': display_name,
            'momentum_6': momentum_6,
            'momentum_12': momentum_12
        })
    
    # Sortowanie ETF-ów według momentum dla 6 miesięcy (od najwyższego do najniższego)
    etfs_data_6_sorted = sorted(etfs_data, key=lambda x: x['momentum_6'], reverse=True)
    
    # Sortowanie ETF-ów według momentum dla 12 miesięcy (od najwyższego do najniższego)
    etfs_data_12_sorted = sorted(etfs_data, key=lambda x: x['momentum_12'], reverse=True)

    # Wyświetlanie wyników
    print("\n--- Momentum 6-miesięczne ---")
    table_6 = [[i, etf['name'], f"{etf['momentum_6']:.2f}%"] for i, etf in enumerate(etfs_data_6_sorted, 1)]
    print(tabulate(table_6, headers=['Pozycja', 'ETF', 'Momentum'], tablefmt='orgtbl'))

    print("\n--- Momentum 12-miesięczne ---")
    table_12 = [[i, etf['name'], f"{etf['momentum_12']:.2f}%"] for i, etf in enumerate(etfs_data_12_sorted, 1)]
    print(tabulate(table_12, headers=['Pozycja', 'ETF', 'Momentum'], tablefmt='orgtbl'))

# Uruchomienie programu
if __name__ == "__main__":
    main()