| | import pandas as pd |
| | import yfinance as yf |
| | import streamlit as st |
| | from datetime import datetime, timedelta |
| | import requests |
| | import numpy as np |
| |
|
| | @st.cache_data(ttl=300) |
| | def get_stock_data_cached(symbol, period="1y", interval="1d"): |
| | """ |
| | Belirtilen sembolün hisse senedi verilerini cache'leyerek alır. |
| | İlk olarak yfinance kullanarak gerçek veri almayı dener, başarısız olursa simüle edilmiş veri döndürür. |
| | """ |
| | try: |
| | |
| | if not symbol.endswith('.IS'): |
| | yahoo_symbol = f"{symbol}.IS" |
| | else: |
| | yahoo_symbol = symbol |
| | |
| | stock = yf.Ticker(yahoo_symbol) |
| | data = stock.history(period=period, interval=interval) |
| | |
| | |
| | if len(data) > 0: |
| | |
| | try: |
| | |
| | try: |
| | fast_info = stock.fast_info |
| | if hasattr(fast_info, 'last_price') and fast_info.last_price is not None: |
| | current_market_price = fast_info.last_price |
| | print(f"Anlık fiyat (fast_info) - {symbol}: {current_market_price}") |
| | |
| | data.loc[data.index[-1], 'Close'] = current_market_price |
| | else: |
| | raise Exception("fast_info kullanılamadı") |
| | except: |
| | |
| | info = stock.info |
| | current_price_keys = ['regularMarketPrice', 'currentPrice', 'previousClose'] |
| | current_market_price = None |
| | |
| | for key in current_price_keys: |
| | if key in info and info[key] is not None and info[key] > 0: |
| | current_market_price = info[key] |
| | print(f"Anlık fiyat ({key}) - {symbol}: {current_market_price}") |
| | break |
| | |
| | if current_market_price: |
| | |
| | data.loc[data.index[-1], 'Close'] = current_market_price |
| | |
| | last_high = data.loc[data.index[-1], 'High'] |
| | last_low = data.loc[data.index[-1], 'Low'] |
| | |
| | |
| | if current_market_price > last_high: |
| | data.loc[data.index[-1], 'High'] = current_market_price |
| | |
| | |
| | if current_market_price < last_low: |
| | data.loc[data.index[-1], 'Low'] = current_market_price |
| | except Exception as price_e: |
| | print(f"Anlık fiyat güncelleme hatası - {symbol}: {str(price_e)}") |
| | |
| | print(f"Gerçek veri alındı: {symbol}") |
| | return data |
| | |
| | |
| | for backup_period in ["1y", "6mo", "3mo", "1mo", "5d"]: |
| | if backup_period != period: |
| | try: |
| | data = stock.history(period=backup_period, interval=interval) |
| | if not data.empty: |
| | print(f"Yedek periyot kullanıldı - {symbol}: {backup_period}") |
| | return data |
| | except: |
| | continue |
| | |
| | |
| | print(f"Gerçek veri alınamadı, simülasyon kullanılıyor: {symbol}") |
| | return get_simulated_stock_data(symbol, period, interval) |
| | |
| | except Exception as e: |
| | print(f"Veri alınırken hata oluştu ({symbol}): {e}") |
| | |
| | return get_simulated_stock_data(symbol, period, interval) |
| |
|
| | def get_simulated_stock_data(symbol, period="1y", interval="1d"): |
| | """ |
| | Test için simüle edilmiş veri üretir. |
| | |
| | Args: |
| | symbol (str): Hisse senedi sembolü |
| | period (str): Veri periyodu (1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, 10y, ytd, max) |
| | interval (str): Veri aralığı (1m, 2m, 5m, 15m, 30m, 60m, 90m, 1h, 1d, 5d, 1wk, 1mo, 3mo) |
| | |
| | Returns: |
| | pd.DataFrame: Simüle edilmiş hisse verisi |
| | """ |
| | from datetime import datetime, timedelta |
| | |
| | |
| | seed = sum(ord(c) for c in symbol) |
| | np.random.seed(seed) |
| | |
| | |
| | end_date = datetime.now() |
| | if period == "1d": |
| | days = 1 |
| | elif period == "5d": |
| | days = 5 |
| | elif period == "1mo": |
| | days = 30 |
| | elif period == "3mo": |
| | days = 90 |
| | elif period == "6mo": |
| | days = 180 |
| | elif period == "1y": |
| | days = 365 |
| | elif period == "2y": |
| | days = 365 * 2 |
| | elif period == "5y": |
| | days = 365 * 5 |
| | elif period == "10y": |
| | days = 365 * 10 |
| | elif period == "ytd": |
| | days = (end_date - datetime(end_date.year, 1, 1)).days |
| | else: |
| | days = 365 |
| | |
| | start_date = end_date - timedelta(days=days) |
| | |
| | |
| | is_intraday = interval in ['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h'] |
| | |
| | if is_intraday: |
| | |
| | if days > 7: |
| | start_date = end_date - timedelta(days=7) |
| | |
| | |
| | business_hours = [] |
| | current_date = start_date |
| | while current_date <= end_date: |
| | if current_date.weekday() < 5: |
| | for hour in range(9, 18): |
| | for minute in range(0, 60, 5): |
| | if hour == 9 and minute < 30: |
| | continue |
| | if hour == 17 and minute > 0: |
| | break |
| | business_hours.append(datetime(current_date.year, current_date.month, current_date.day, hour, minute)) |
| | current_date += timedelta(days=1) |
| | |
| | dates = business_hours |
| | else: |
| | |
| | if interval == '1d': |
| | |
| | dates = pd.date_range(start=start_date, end=end_date, freq='B') |
| | elif interval == '5d': |
| | |
| | dates = pd.date_range(start=start_date, end=end_date, freq='5B') |
| | elif interval == '1wk': |
| | |
| | dates = pd.date_range(start=start_date, end=end_date, freq='W') |
| | elif interval == '1mo': |
| | |
| | dates = pd.date_range(start=start_date, end=end_date, freq='M') |
| | elif interval == '3mo': |
| | |
| | dates = pd.date_range(start=start_date, end=end_date, freq='3M') |
| | else: |
| | |
| | dates = pd.date_range(start=start_date, end=end_date, freq='B') |
| | |
| | |
| | |
| | base_price = np.random.uniform(10, 500) |
| | |
| | |
| | trend = np.random.choice(['up', 'down', 'sideways'], p=[0.5, 0.3, 0.2]) |
| | |
| | n = len(dates) |
| | if n == 0: |
| | |
| | dates = [end_date] |
| | n = 1 |
| | |
| | |
| | if trend == 'up': |
| | daily_change = np.random.uniform(0.001, 0.01, n) |
| | elif trend == 'down': |
| | daily_change = np.random.uniform(-0.01, -0.001, n) |
| | else: |
| | daily_change = np.random.uniform(-0.005, 0.005, n) |
| | |
| | |
| | volatility = np.random.uniform(0.005, 0.03) |
| | noise = np.random.normal(0, volatility, n) |
| | daily_returns = daily_change + noise |
| | |
| | |
| | cumulative_returns = np.cumprod(1 + daily_returns) |
| | |
| | close_prices = base_price * cumulative_returns |
| | |
| | |
| | intraday_volatility = volatility * 0.5 |
| | open_prices = close_prices * (1 + np.random.normal(0, intraday_volatility, n)) |
| | high_prices = np.maximum(close_prices, open_prices) * (1 + np.abs(np.random.normal(0, intraday_volatility, n))) |
| | low_prices = np.minimum(close_prices, open_prices) * (1 - np.abs(np.random.normal(0, intraday_volatility, n))) |
| | |
| | |
| | base_volume = np.random.randint(50000, 5000000) |
| | volume_change = np.abs(daily_returns) * 10 |
| | volume = base_volume * (1 + volume_change) |
| | |
| | |
| | df = pd.DataFrame({ |
| | 'Open': open_prices, |
| | 'High': high_prices, |
| | 'Low': low_prices, |
| | 'Close': close_prices, |
| | 'Volume': volume.astype(int) |
| | }, index=dates) |
| | |
| | return df |
| |
|
| | def get_stock_data(symbol, period="6mo"): |
| | """ |
| | Hisse senedi verilerini alır |
| | |
| | Args: |
| | symbol (str): Hisse senedi sembolü |
| | period (str): Veri periyodu ("1mo", "3mo", "6mo", "1y", "2y", "5y", "max") |
| | |
| | Returns: |
| | pd.DataFrame: Hisse senedi verileri |
| | """ |
| | try: |
| | |
| | if not symbol.endswith('.IS'): |
| | yahoo_symbol = f"{symbol}.IS" |
| | else: |
| | yahoo_symbol = symbol |
| | symbol = symbol.replace('.IS', '') |
| | |
| | |
| | |
| | periods_to_try = [period] |
| | |
| | |
| | if period == "5y": |
| | periods_to_try.extend(["3y", "2y", "1y", "6mo"]) |
| | elif period == "3y": |
| | periods_to_try.extend(["2y", "1y", "6mo"]) |
| | elif period == "2y": |
| | periods_to_try.extend(["1y", "6mo"]) |
| | |
| | data = pd.DataFrame() |
| | used_period = period |
| | stock = yf.Ticker(yahoo_symbol) |
| | |
| | |
| | for p in periods_to_try: |
| | temp_data = stock.history(period=p) |
| | |
| | if len(temp_data) >= 30: |
| | data = temp_data |
| | used_period = p |
| | break |
| | |
| | if data.empty: |
| | print(f"Hisse verisi alınamadı: {symbol}") |
| | return pd.DataFrame() |
| | |
| | |
| | try: |
| | |
| | stock_info = stock.info |
| | |
| | |
| | current_price = None |
| | |
| | if 'regularMarketPrice' in stock_info and stock_info['regularMarketPrice'] is not None: |
| | current_price = stock_info['regularMarketPrice'] |
| | elif 'currentPrice' in stock_info and stock_info['currentPrice'] is not None: |
| | current_price = stock_info['currentPrice'] |
| | elif 'lastPrice' in stock_info and stock_info['lastPrice'] is not None: |
| | current_price = stock_info['lastPrice'] |
| | |
| | if current_price is not None: |
| | |
| | last_date = data.index[-1] |
| | if datetime.now().date() == last_date.date(): |
| | |
| | data.loc[last_date, 'Close'] = current_price |
| | |
| | |
| | if current_price > data.loc[last_date, 'High']: |
| | data.loc[last_date, 'High'] = current_price |
| | |
| | |
| | if current_price < data.loc[last_date, 'Low']: |
| | data.loc[last_date, 'Low'] = current_price |
| | else: |
| | |
| | now = datetime.now() |
| | |
| | is_market_open = ( |
| | now.weekday() < 5 and |
| | ((now.hour == 9 and now.minute >= 30) or now.hour > 9) and |
| | now.hour < 18 |
| | ) |
| | |
| | if is_market_open: |
| | |
| | new_row = pd.DataFrame({ |
| | 'Open': [current_price], |
| | 'High': [current_price], |
| | 'Low': [current_price], |
| | 'Close': [current_price], |
| | 'Volume': [0] |
| | }, index=[pd.Timestamp(now)]) |
| | |
| | |
| | data = pd.concat([data, new_row]) |
| | |
| | print(f"Güncel fiyat alındı ({symbol}): {current_price}") |
| | except Exception as e: |
| | print(f"Güncel fiyat alınamadı ({symbol}): {str(e)}") |
| | |
| | if used_period != period: |
| | print(f"İstenen periyot ({period}) için veri bulunamadı. Bunun yerine {used_period} kullanıldı.") |
| | |
| | return data |
| | |
| | except Exception as e: |
| | print(f"Hisse verisi alınırken hata oluştu ({symbol}): {str(e)}") |
| | return pd.DataFrame() |
| |
|
| | @st.cache_data(ttl=86400) |
| | def get_company_info(symbol): |
| | """ |
| | Belirtilen sembol için şirket bilgilerini döndürür |
| | |
| | Args: |
| | symbol (str): Hisse senedi sembolü (BIST) |
| | |
| | Returns: |
| | dict: Şirket bilgilerini içeren sözlük |
| | { |
| | 'name': Şirket adı, |
| | 'sector': Sektör, |
| | 'industry': Endüstri, |
| | 'website': Web sitesi, |
| | 'description': Açıklama, |
| | ... |
| | } |
| | """ |
| | try: |
| | if symbol and not symbol.endswith('.IS'): |
| | yahoo_symbol = f"{symbol}.IS" |
| | else: |
| | yahoo_symbol = symbol |
| | |
| | |
| | stock = yf.Ticker(yahoo_symbol) |
| | info = stock.info |
| | |
| | |
| | if info and 'longName' in info: |
| | return { |
| | 'name': info.get('longName', ''), |
| | 'sector': info.get('sector', ''), |
| | 'industry': info.get('industry', ''), |
| | 'website': info.get('website', ''), |
| | 'description': info.get('longBusinessSummary', ''), |
| | 'country': info.get('country', 'Türkiye'), |
| | 'exchange': info.get('exchange', 'BIST'), |
| | 'currency': info.get('currency', 'TRY'), |
| | 'symbol': symbol |
| | } |
| | except Exception as e: |
| | print(f"Şirket bilgileri alınamadı ({symbol}): {e}") |
| | |
| | |
| | return {} |
| |
|
| | @st.cache_data(ttl=300) |
| | def get_market_summary(): |
| | """ |
| | Piyasa özeti verilerini alır |
| | """ |
| | try: |
| | |
| | bist100 = yf.Ticker("XU100.IS") |
| | bist100_data = bist100.history(period="2d") |
| | |
| | |
| | usdtry = yf.Ticker("USDTRY=X") |
| | usdtry_data = usdtry.history(period="2d") |
| | |
| | |
| | gold = yf.Ticker("GC=F") |
| | gold_data = gold.history(period="2d") |
| | |
| | result = {} |
| | |
| | |
| | if not bist100_data.empty and len(bist100_data) >= 2: |
| | current_price = bist100_data["Close"].iloc[-1] |
| | prev_close = bist100_data["Close"].iloc[-2] |
| | change = current_price - prev_close |
| | change_percent = (change / prev_close) * 100 |
| | volume = bist100_data["Volume"].iloc[-1] if "Volume" in bist100_data.columns else 0 |
| | |
| | status = "yükseliş" if change > 0 else ("düşüş" if change < 0 else "sabit") |
| | |
| | result["bist100"] = { |
| | "value": current_price, |
| | "change": change, |
| | "change_percent": change_percent, |
| | "volume": volume / 1e9, |
| | "status": status |
| | } |
| | else: |
| | result["bist100"] = { |
| | "value": 0, |
| | "change": 0, |
| | "change_percent": 0, |
| | "volume": 0, |
| | "status": "sabit" |
| | } |
| | |
| | |
| | if not usdtry_data.empty and len(usdtry_data) >= 2: |
| | current_price = usdtry_data["Close"].iloc[-1] |
| | prev_close = usdtry_data["Close"].iloc[-2] |
| | change = current_price - prev_close |
| | change_percent = (change / prev_close) * 100 |
| | high = usdtry_data["High"].iloc[-1] |
| | low = usdtry_data["Low"].iloc[-1] |
| | |
| | status = "yükseliş" if change > 0 else ("düşüş" if change < 0 else "sabit") |
| | |
| | result["usdtry"] = { |
| | "value": current_price, |
| | "change": change, |
| | "change_percent": change_percent, |
| | "range": f"{low:.2f} - {high:.2f}", |
| | "status": status |
| | } |
| | else: |
| | result["usdtry"] = { |
| | "value": 0, |
| | "change": 0, |
| | "change_percent": 0, |
| | "range": "0.00 - 0.00", |
| | "status": "sabit" |
| | } |
| | |
| | |
| | if not gold_data.empty and len(gold_data) >= 2: |
| | current_price = gold_data["Close"].iloc[-1] |
| | prev_close = gold_data["Close"].iloc[-2] |
| | change = current_price - prev_close |
| | change_percent = (change / prev_close) * 100 |
| | high = gold_data["High"].iloc[-1] |
| | low = gold_data["Low"].iloc[-1] |
| | |
| | status = "yükseliş" if change > 0 else ("düşüş" if change < 0 else "sabit") |
| | |
| | result["gold"] = { |
| | "value": current_price, |
| | "change": change, |
| | "change_percent": change_percent, |
| | "range": f"{low:.1f} - {high:.1f}", |
| | "status": status |
| | } |
| | else: |
| | result["gold"] = { |
| | "value": 0, |
| | "change": 0, |
| | "change_percent": 0, |
| | "range": "0.0 - 0.0", |
| | "status": "sabit" |
| | } |
| | |
| | return result |
| | |
| | except Exception as e: |
| | |
| | return { |
| | "bist100": { |
| | "value": 0, |
| | "change": 0, |
| | "change_percent": 0, |
| | "volume": 0, |
| | "status": "sabit" |
| | }, |
| | "usdtry": { |
| | "value": 0, |
| | "change": 0, |
| | "change_percent": 0, |
| | "range": "0.00 - 0.00", |
| | "status": "sabit" |
| | }, |
| | "gold": { |
| | "value": 0, |
| | "change": 0, |
| | "change_percent": 0, |
| | "range": "0.0 - 0.0", |
| | "status": "sabit" |
| | }, |
| | "error": f"Piyasa özeti alınamadı: {str(e)}" |
| | } |
| |
|
| | @st.cache_data(ttl=300) |
| | def get_popular_stocks(): |
| | """ |
| | Popüler hisselerin detaylı verilerini döndürür |
| | """ |
| | popular_stocks_symbols = [ |
| | "THYAO", "GARAN", "ASELS", "SISE", "AKBNK", "TCELL", "EREGL", "KCHOL", |
| | "VAKBN", "PETKM", "BIMAS", "TUPRS", "SAHOL", "HALKB", "ISCTR", "KOZAA", |
| | "PGSUS", "ARCLK", "DOHOL", "GUBRF" |
| | ] |
| | |
| | |
| | stock_names = { |
| | "THYAO": "Türk Hava Yolları", |
| | "GARAN": "Garanti BBVA", |
| | "ASELS": "Aselsan", |
| | "SISE": "Şişe Cam", |
| | "AKBNK": "Akbank", |
| | "TCELL": "Turkcell", |
| | "EREGL": "Erdemir", |
| | "KCHOL": "Koç Holding", |
| | "VAKBN": "VakıfBank", |
| | "PETKM": "Petkim", |
| | "BIMAS": "BİM", |
| | "TUPRS": "Tüpraş", |
| | "SAHOL": "Sabancı Holding", |
| | "HALKB": "Halkbank", |
| | "ISCTR": "İş Bankası", |
| | "KOZAA": "Koza Altın", |
| | "PGSUS": "Pegasus", |
| | "ARCLK": "Arçelik", |
| | "DOHOL": "Doğan Holding", |
| | "GUBRF": "Gübre Fabrikaları" |
| | } |
| | |
| | result = [] |
| | |
| | for symbol in popular_stocks_symbols: |
| | try: |
| | |
| | stock_data = get_stock_data_cached(f"{symbol}.IS", period="2d") |
| | |
| | if stock_data is not None and not stock_data.empty and len(stock_data) >= 2: |
| | current_price = stock_data["Close"].iloc[-1] |
| | prev_close = stock_data["Close"].iloc[-2] |
| | change_percent = ((current_price - prev_close) / prev_close) * 100 |
| | |
| | result.append({ |
| | "symbol": symbol, |
| | "name": stock_names.get(symbol, symbol), |
| | "value": current_price, |
| | "change_percent": change_percent |
| | }) |
| | else: |
| | |
| | result.append({ |
| | "symbol": symbol, |
| | "name": stock_names.get(symbol, symbol), |
| | "value": 0.0, |
| | "change_percent": 0.0 |
| | }) |
| | except Exception as e: |
| | |
| | result.append({ |
| | "symbol": symbol, |
| | "name": stock_names.get(symbol, symbol), |
| | "value": 0.0, |
| | "change_percent": 0.0 |
| | }) |
| | |
| | return result |
| |
|
| | @st.cache_data(ttl=600) |
| | def get_stock_news(symbol, limit=5): |
| | """ |
| | Belirtilen hisse senedi sembolü için haberleri getirir. |
| | |
| | Args: |
| | symbol (str): Hisse senedi sembolü (örn: THYAO) |
| | limit (int): Gösterilecek maksimum haber sayısı |
| | |
| | Returns: |
| | list: Haberler listesi |
| | [ |
| | { |
| | "title": Haber başlığı, |
| | "publisher": Yayıncı, |
| | "link": Haber linki, |
| | "published": Yayın tarihi |
| | }, |
| | ... |
| | ] |
| | """ |
| | try: |
| | |
| | if not symbol.endswith('.IS'): |
| | yahoo_symbol = f"{symbol}.IS" |
| | else: |
| | yahoo_symbol = symbol |
| | |
| | |
| | stock = yf.Ticker(yahoo_symbol) |
| | news = stock.news |
| | |
| | |
| | formatted_news = [] |
| | if news: |
| | for item in news[:limit]: |
| | formatted_news.append({ |
| | "title": item.get("title", ""), |
| | "publisher": item.get("publisher", ""), |
| | "link": item.get("link", ""), |
| | "published": datetime.fromtimestamp(item.get("providerPublishTime", 0)).strftime("%d.%m.%Y %H:%M") |
| | }) |
| | |
| | return formatted_news |
| | except Exception as e: |
| | st.error(f"Haberler alınırken hata oluştu: {e}") |
| | return [] |
| |
|
| | @st.cache_data(ttl=86400) |
| | def get_stock_list(index_name="BIST 100"): |
| | """ |
| | Belirtilen endekse ait hisse listesini döndürür |
| | |
| | Args: |
| | index_name (str): Endeks adı ('BIST 30', 'BIST 50', 'BIST 100') |
| | |
| | Returns: |
| | list: Endeksteki hisse kodlarını içeren liste (.IS uzantılı) |
| | """ |
| | try: |
| | bist30_stocks = [ |
| | "AKBNK.IS", "ARCLK.IS", "ASELS.IS", "BIMAS.IS", "EKGYO.IS", |
| | "EREGL.IS", "FROTO.IS", "GARAN.IS", "HALKB.IS", "HEKTS.IS", |
| | "ISCTR.IS", "KCHOL.IS", "KOZAA.IS", "KOZAL.IS", "KRDMD.IS", |
| | "PETKM.IS", "PGSUS.IS", "SAHOL.IS", "SASA.IS", "SISE.IS", |
| | "TCELL.IS", "THYAO.IS", "TOASO.IS", "TUPRS.IS", "VAKBN.IS", |
| | "VESTL.IS", "YKBNK.IS", "TAVHL.IS", "ENJSA.IS", "SOKM.IS" |
| | ] |
| | |
| | bist50_stocks = bist30_stocks + [ |
| | "ALARK.IS", "ALBRK.IS", "CIMSA.IS", "DOHOL.IS", "ESEN.IS", |
| | "GESAN.IS", "IPEKE.IS", "ISGYO.IS", "KLMSN.IS", "KONTR.IS", |
| | "ODAS.IS", "OYAKC.IS", "PRKME.IS", "SMRTG.IS", "TSKB.IS", |
| | "TRGYO.IS", "TTKOM.IS", "ULKER.IS", "YBTAS.IS", "ZOREN.IS" |
| | ] |
| | |
| | bist100_stocks = bist50_stocks + [ |
| | "AEFES.IS", "AGHOL.IS", "AKFYE.IS", "AKSA.IS", "AKSEN.IS", |
| | "ALGYO.IS", "ASUZU.IS", "AYDEM.IS", "BAGFS.IS", "BASGZ.IS", |
| | "BRSAN.IS", "BRISA.IS", "CCOLA.IS", "CEMTS.IS", "ENKAI.IS", |
| | "ERBOS.IS", "EUPWR.IS", "GLYHO.IS", "GUBRF.IS", "HSVGY.IS", |
| | "INDES.IS", "ISDMR.IS", "ISGSY.IS", "ISMEN.IS", "KARTN.IS", |
| | "KERVT.IS", "LOGO.IS", "MGROS.IS", "MPARK.IS", "NETAS.IS", |
| | "NUHCM.IS", "OTKAR.IS", "OYAKT.IS", "SELEC.IS", "SKBNK.IS", |
| | "TATGD.IS", "TKFEN.IS", "TUKAS.IS", "VESBE.IS", "YATAS.IS", |
| | "ZRGYO.IS", "AGESA.IS", "AKSA.IS", "BRYAT.IS", "DOAS.IS", |
| | "GWIND.IS", "KMPUR.IS", "MAVI.IS", "SDTTR.IS", "SMRTG.IS" |
| | ] |
| | |
| | if index_name == "BIST 30": |
| | return bist30_stocks |
| | elif index_name == "BIST 50": |
| | return bist50_stocks |
| | elif index_name == "BIST 100": |
| | return bist100_stocks |
| | else: |
| | st.warning(f"Bilinmeyen endeks: {index_name}. BIST 100 döndürülüyor.") |
| | return bist100_stocks |
| | |
| | except Exception as e: |
| | st.error(f"Hisse listesi alınırken hata: {str(e)}") |
| | return [] |
| |
|
| | @st.cache_data(ttl=86400) |
| | def get_all_bist_stocks(): |
| | """ |
| | Borsa İstanbul'daki tüm hisse senetlerinin listesini döndürür. |
| | |
| | Returns: |
| | list: BIST'teki tüm hisse kodlarını içeren liste (uzantısız, örn: "THYAO") |
| | """ |
| | try: |
| | |
| | |
| | all_bist_stocks = [ |
| | "ACSEL", "ADEL", "ADESE", "AEFES", "AFYON", "AGESA", "AGHOL", "AGYO", "AHGAZ", "AKBNK", |
| | "AKCNS", "AKFGY", "AKFYE", "AKGRT", "AKMGY", "AKSA", "AKSEN", "AKSGY", "AKSUE", "AKYHO", |
| | "ALARK", "ALBRK", "ALCAR", "ALCTL", "ALFAS", "ALGYO", "ALKA", "ALKIM", "ALMAD", "ALTIN", |
| | "ALYAG", "ANACM", "ANELE", "ANGEN", "ANHYT", "ANSGR", "ARASE", "ARCEN", "ARCLK", "ARDYZ", |
| | "ARENA", "ARSAN", "ARZUM", "ASELS", "ASGYO", "ASTOR", "ASUZU", "ATAGY", "ATATP", "ATEKS", |
| | "ATLAS", "ATSYH", "AVGYO", "AVHOL", "AVOD", "AVTUR", "AYCES", "AYDEM", "AYEN", "AYES", |
| | "AYGAZ", "AZTEK", "BAGFS", "BAKAB", "BALAT", "BANVT", "BARMA", "BASGZ", "BAYRK", "BEYAZ", |
| | "BIGCH", "BIMAS", "BIOEN", "BIZIM", "BJKAS", "BLCYT", "BNTAS", "BOBET", "BOSSA", "BRISA", |
| | "BRKSN", "BRMEN", "BRLSM", "BRSAN", "BRYAT", "BSOKE", "BTCIM", "BUCIM", "BURCE", "BURVA", |
| | "BVSAN", "CANTE", "CASA", "CCOLA", "CELHA", "CEMAS", "CEMTS", "CEOEM", "CIMSA", "CLEBI", |
| | "CONSE", "COSMO", "CRDFA", "CRFSA", "CUSAN", "DAGHL", "DAGI", "DAPGM", "DENGE", "DERHL", |
| | "DERIM", "DESA", "DESPC", "DEVA", "DGATE", "DIRIT", "DITAS", "DMSAS", "DNISI", "DOAS", |
| | "DOBUR", "DOCO", "DOGUB", "DOHOL", "DOKTA", "DURDO", "DYOBY", "ECILC", "ECZYT", "EDIP", |
| | "EGCEY", "EGCYO", "EGEEN", "EGEPO", "EGGUB", "EGPRO", "EGSER", "EKGYO", "EKIZ", "EKSUN", |
| | "ELITE", "EMKEL", "EMNIS", "ENJSA", "ENKAI", "ENSRI", "EPLAS", "ERBOS", "EREGL", "ERSU", |
| | "ESCAR", "ESCOM", "ESEN", "ETILR", "ETYAT", "EUPWR", "EUREN", "EUHOL", "EUKYO", "EUYO", |
| | "FADE", "FBBNK", "FENER", "FLAP", "FMIZP", "FONET", "FORMT", "FRIGO", "FROTO", "GARAN", |
| | "GARFA", "GEDIK", "GEDZA", "GEREL", "GESAN", "GLBMD", "GLCVY", "GLDTR", "GLRYH", "GLYHO", |
| | "GMTAS", "GOODY", "GOZDE", "GRNYO", "GRSEL", "GRTRK", "GSDDE", "GSDHO", "GSRAY", "GUBRF", |
| | "GWIND", "GZNMI", "HALKB", "HATEK", "HDFGS", "HEDEF", "HEKTS", "HKTM", "HLGYO", "HTTBT", |
| | "HUBVC", "HUNER", "HURGZ", "ICBCT", "IDEAS", "IDGYO", "IEYHO", "IHEVA", "IHGZT", "IHLAS", |
| | "IHLGM", "IHYAY", "INDES", "INFO", "INTEM", "INVEO", "IPEKE", "ISATR", "ISBTR", "ISCTR", |
| | "ISDMR", "ISFIN", "ISGSY", "ISGYO", "ISKPL", "ISYAT", "ITTFH", "IZFAS", "IZINV", "JANTS", |
| | "KAPLM", "KAREL", "KARSN", "KARTN", "KARYE", "KATMR", "KAYSE", "KCAER", "KCHOL", "KENT", |
| | "KERVN", "KERVT", "KFEIN", "KGYO", "KLGYO", "KLMSN", "KLNMA", "KLRHO", "KMPUR", "KNFRT", |
| | "KONKA", "KONTR", "KONYA", "KORDS", "KORFZ", "KORTS", "KOSLF", "KOZAA", "KOZAL", "KPHOL", |
| | "KRDMA", "KRDMB", "KRDMD", "KRGYO", "KRONT", "KRPLS", "KRSTL", "KRTEK", "KRVGD", "KSTUR", |
| | "KTSKR", "KUTPO", "KUYAS", "LIDFA", "LINK", "LKMNH", "LOGO", "LUKSK", "LVENT", "MACKO", |
| | "MAKIM", "MAKTK", "MANAS", "MARKA", "MARTI", "MAVI", "MEDTR", "MEGAP", "MERCN", "MERIT", |
| | "MERKO", "METRO", "METUR", "MGROS", "MIATK", "MIPAZ", "MMCAS", "MNDRS", "MNDTR", "MOBTL", |
| | "MPARK", "MRGYO", "MRSHL", "MSGYO", "MTRKS", "MTRYO", "MZHLD", "NATEN", "NETAS", "NETHO", |
| | "NIKAY", "NTGAZ", "NTHOL", "NUGYO", "NUHCM", "ODAS", "OLMIP", "ORGE", "ORMA", "OSMEN", |
| | "OYLUM", "OZGYO", "OZKGY", "OZRDN", "OZSUB", "PAGYO", "PAMEL", "PAPIL", "PARSN", "PASEU", |
| | "PCILT", "PEGYO", "PEKGY", "PENGD", "PENTA", "PETKM", "PETUN", "PGSUS", "PINSU", "PKART", |
| | "PKENT", "PLTUR", "PNLSN", "POLHO", "POLTK", "PRKAB", "PRKME", "PRZMA", "PSDTC", "PSGYO", |
| | "QNBFB", "QNBFL", "QUAGR", "RALYH", "RAYSG", "RHYAY", "RODRG", "ROYAL", "RTALB", "RUBNS", |
| | "RYGYO", "RYSAS", "SAFKR", "SAHOL", "SAMAT", "SANEL", "SANFM", "SANKO", "SARKY", "SASA", |
| | "SAYAS", "SDTTR", "SEGYO", "SELEC", "SELGD", "SELVA", "SEYKM", "SISE", "SKBNK", "SKTAS", |
| | "SMART", "SMRTG", "SNGYO", "SNKRN", "SNPAM", "SODSN", "SOKM", "SONME", "SRVGY", "SUMAS", |
| | "SUNTK", "SUWEN", "TARIS", "TATGD", "TAVHL", "TBORG", "TCELL", "TDGYO", "TEKTU", "TERA", |
| | "TETMT", "TEZOL", "TFNVK", "TGSAS", "THYAO", "TIMUR", "TKFEN", "TKNSA", "TKURU", "TLMAN", |
| | "TMPOL", "TMSN", "TOASO", "TRCAS", "TRGYO", "TRILC", "TSGYO", "TSKB", "TSPOR", "TTKOM", |
| | "TTRAK", "TUCLK", "TUKAS", "TUPRS", "TUREX", "TURGG", "TURSG", "TVCKS", "TVRKS", "ULUFA", |
| | "ULUSE", "ULUUN", "UMPAS", "UNLU", "USAK", "UZERB", "VAKBN", "VAKKO", "VAKVK", "VANGD", |
| | "VBTYZ", "VERTU", "VERUS", "VESBE", "VESTL", "VKFYO", "VKGYO", "VKING", "YAPRK", "YATAS", |
| | "YAYLA", "YBTAS", "YDSYO", "YEOTK", "YESIL", "YGGYO", "YGYO", "YKBNK", "YKSLN", "YONGA", |
| | "YUNSA", "YYAPI", "YYLGD", "ZOREN", "ZRGYO" |
| | ] |
| | |
| | return all_bist_stocks |
| | except Exception as e: |
| | st.error(f"Tüm hisse listesi alınırken hata: {str(e)}") |
| | return [] |