""" ai/api.py modülündeki AI işlevlerine yönlendiren köprü modülü. Bu modül, kodun geri kalanının mevcut import ifadeleriyle çalışmasını sağlamak için oluşturulmuştur. """ from datetime import datetime import os import logging import requests import pandas as pd import yfinance as yf import random # AI API fonksiyonlarını buraya yönlendiriyoruz from ai.api import ( initialize_gemini_api as _initialize_gemini_api, ai_market_sentiment as _ai_market_sentiment, ai_stock_analysis as _ai_stock_analysis, ai_price_prediction as _ai_price_prediction, ai_sector_analysis as _ai_sector_analysis, ai_portfolio_recommendation as _ai_portfolio_recommendation, ai_technical_interpretation as _ai_technical_interpretation, ai_portfolio_analysis as _ai_portfolio_analysis, ai_portfolio_optimization as _ai_portfolio_optimization, ai_sector_recommendation as _ai_sector_recommendation, ) # API'yi başlatmak için kullanılan fonksiyon def load_gemini_pro(): """ Gemini API'yi başlatır ve hazır bir model döndürür """ return _initialize_gemini_api() # API fonksiyonlarını yönlendirme def ai_market_sentiment(gemini_pro, log_container=None): """ Piyasa genel duyarlılığını analiz eder Returns: tuple: (sentiment_text, sentiment_data) tüple'ı döndürür """ try: if log_container: log_container.info("BIST100 verilerini alıyorum...") # BIST100 verilerini al from data.stock_data import get_stock_data bist100_data = get_stock_data("XU100.IS", period="1mo") if bist100_data is None or bist100_data.empty: raise Exception("BIST100 verileri alınamadı") if log_container: log_container.info("Piyasa haberleri toplanıyor...") # Piyasa haberleri try: from data.news_data import get_general_market_news market_news = get_general_market_news(max_results=5) except Exception as e: if log_container: log_container.warning(f"Haberler alınamadı: {str(e)}") market_news = [] # Temel piyasa analizini yap current_price = bist100_data['Close'].iloc[-1] previous_price = bist100_data['Close'].iloc[-2] price_change = (current_price - previous_price) / previous_price * 100 # Son bir aydaki değişim month_start_price = bist100_data['Close'].iloc[0] month_change = (current_price - month_start_price) / month_start_price * 100 # Volatilite hesapla volatility = bist100_data['Close'].pct_change().std() * 100 # Trend tespiti sma20 = bist100_data['Close'].rolling(window=20).mean().iloc[-1] if len(bist100_data) >= 20 else 0 # Piyasa durumunu belirle if price_change > 1.5: market_mood = "Olumlu" elif price_change < -1.5: market_mood = "Olumsuz" else: market_mood = "Nötr" # Trend gücünü belirle if month_change > 5: trend_strength = 80 elif month_change > 3: trend_strength = 65 elif month_change > 0: trend_strength = 55 elif month_change > -3: trend_strength = 45 elif month_change > -5: trend_strength = 35 else: trend_strength = 20 # Volatilite seviyesini belirle if volatility > 3: volatility_expectation = "Yüksek" elif volatility > 1.5: volatility_expectation = "Orta" else: volatility_expectation = "Düşük" # Tavsiye belirle if market_mood == "Olumlu" and current_price > sma20 and volatility_expectation != "Yüksek": recommendation = "Al" elif market_mood == "Olumsuz" and current_price < sma20: recommendation = "Sat" else: recommendation = "Tut" # Güven oranını belirle confidence = 70 + (abs(month_change) if month_change > 0 else -abs(month_change)) / 2 confidence = max(60, min(95, confidence)) # Sentiment metni: sadece hesaplanan metriklere dayanır (yatırım tavsiyesi üretmez) sentiment_text = ( f"BIST100 günlük değişim: {price_change:.2f}%\n" f"BIST100 1 aylık değişim: {month_change:.2f}%\n" f"Yaklaşık volatilite (1 ay): {volatility:.2f}%\n" f"20G HO (SMA20) karşılaştırması: {'Üstünde' if current_price > sma20 else 'Altında' if sma20 else 'Hesaplanamadı'}\n" f"Piyasa modu: {market_mood} (heuristic)\n" f"Not: Bu bölüm yatırım tavsiyesi değildir; veri kaynaklarına bağlıdır." ) if log_container: log_container.success("Piyasa analizi tamamlandı!") return sentiment_text, None except Exception as e: if log_container: log_container.error(f"Piyasa analizi hatası: {str(e)}") return ( "Piyasa duyarlılığı üretilemedi (BIST100 veya haber verisi alınamadı). " "Bu durumda uydurma/varsayılan metrik gösterilmez.", None, ) def ai_stock_analysis(gemini_pro, stock_symbol, stock_data): """ Belirli bir hisse senedi için AI analizi yapar """ return _ai_stock_analysis(gemini_pro, stock_symbol, stock_data) def ai_price_prediction(gemini_pro, stock_symbol, stock_data): """ Hisse senedi için fiyat tahmini yapar """ return _ai_price_prediction(gemini_pro, stock_symbol, stock_data) def ai_sector_analysis(gemini_pro, stock_symbol): """ Sektör analizi yapar """ return _ai_sector_analysis(gemini_pro, stock_symbol) def ai_portfolio_recommendation(gemini_pro, budget=10000): """ Portföy önerileri sunar """ return _ai_portfolio_recommendation(gemini_pro, budget) def ai_technical_interpretation(gemini_pro, stock_data): """ Teknik analiz sonuçlarını yorumlar """ return _ai_technical_interpretation(gemini_pro, stock_data) def ai_portfolio_analysis(gemini_pro, portfolio_data): """ Portföy analizini yapay zeka ile gerçekleştirir. Args: gemini_pro: Yapay zeka modeli portfolio_data (dict): Portföy performans verileri Returns: dict: Yapay zeka analiz sonuçları """ try: return _ai_portfolio_analysis(gemini_pro, portfolio_data) except Exception as e: # API hatası veya bağlantı sorunu durumunda basit bir analiz dön print(f"AI portföy analizi hatası: {str(e)}") # Basit analiz oluştur stocks_data = portfolio_data.get("stocks", []) total_gain_loss = portfolio_data.get("total_gain_loss", 0) # Kazançlı ve zarardaki hisseleri ayır profitable_stocks = [s for s in stocks_data if s["gain_loss"] > 0] loss_stocks = [s for s in stocks_data if s["gain_loss"] < 0] # En iyi ve en kötü performansa sahip hisseleri bul best_stock = max(stocks_data, key=lambda x: x["gain_loss_percentage"]) if stocks_data else None worst_stock = min(stocks_data, key=lambda x: x["gain_loss_percentage"]) if stocks_data else None # Genel durum belirle if total_gain_loss > 0: status = "pozitif" advice = "Portföyünüz kazançta. Kâr realizasyonu yapabilir veya güçlü hisselerde pozisyonunuzu artırabilirsiniz." elif total_gain_loss < 0: status = "negatif" advice = "Portföyünüz zararda. Zarardaki hisseleri gözden geçirin ve performansı iyi olan sektörlere yönelebilirsiniz." else: status = "nötr" advice = "Portföyünüz başabaş durumda. Fırsatları değerlendirerek daha güçlü hisselere yönelebilirsiniz." # Analiz sonuçlarını oluştur return { "status": status, "summary": f"Portföyünüzde {len(stocks_data)} adet hisse bulunuyor. {len(profitable_stocks)} tanesi kârda, {len(loss_stocks)} tanesi zararda.", "best_performer": best_stock["symbol"] if best_stock else "Yok", "worst_performer": worst_stock["symbol"] if worst_stock else "Yok", "best_percentage": best_stock["gain_loss_percentage"] if best_stock else 0, "worst_percentage": worst_stock["gain_loss_percentage"] if worst_stock else 0, "recommendations": advice, "details": "Yapay zeka analizi şu anda kullanılamıyor. Lütfen daha sonra tekrar deneyin." } def ai_portfolio_optimization(gemini_pro, portfolio_data, sector_distribution): """ Portföy optimizasyon önerileri sunar. Args: gemini_pro: Yapay zeka modeli portfolio_data (dict): Portföy performans verileri sector_distribution (dict): Sektör dağılımı verileri Returns: dict: Yapay zeka optimizasyon önerileri """ try: return _ai_portfolio_optimization(gemini_pro, portfolio_data, sector_distribution) except Exception as e: # API hatası veya bağlantı sorunu durumunda basit öneriler dön print(f"AI portföy optimizasyonu hatası: {str(e)}") # Basit optimizasyon önerileri stocks_data = portfolio_data.get("stocks", []) # Kazanç yüzdesine göre sırala sorted_stocks = sorted(stocks_data, key=lambda x: x["gain_loss_percentage"], reverse=True) # Performansa göre öneriler top_performers = sorted_stocks[:3] if len(sorted_stocks) >= 3 else sorted_stocks poor_performers = sorted_stocks[-3:] if len(sorted_stocks) >= 3 else [] # Temel optimizasyon önerileri recommendations = [ "Portföyünüzü çeşitlendirerek riski azaltabilirsiniz.", "Kârdaki pozisyonlarınızın bir kısmını realize edebilirsiniz.", "Uzun vadeli yatırımlarınızda düzenli aralıklarla alım yaparak ortalama maliyetinizi düşürebilirsiniz." ] # İyi performans gösteren hisseler için öneriler increase_recommendations = [] for stock in top_performers: if stock["gain_loss_percentage"] > 5: increase_recommendations.append( f"{stock['symbol']} hissesi iyi performans gösteriyor. Pozisyonunuzu artırabilirsiniz." ) # Kötü performans gösteren hisseler için öneriler decrease_recommendations = [] for stock in poor_performers: if stock["gain_loss_percentage"] < -10: decrease_recommendations.append( f"{stock['symbol']} hissesi kötü performans gösteriyor. Pozisyonunuzu azaltmayı düşünebilirsiniz." ) # Sektör bazlı öneriler sector_recommendations = [] if sector_distribution: top_sector = max(sector_distribution.items(), key=lambda x: x[1]) sector_recommendations.append(f"Portföyünüzde {top_sector[0]} sektörüne ağırlık vermişsiniz. Çeşitlendirme için farklı sektörlere de yönelebilirsiniz.") return { "general_recommendations": recommendations, "increase_positions": increase_recommendations, "decrease_positions": decrease_recommendations, "sector_recommendations": sector_recommendations, "details": "Yapay zeka optimizasyon önerileri şu anda kullanılamıyor. Lütfen daha sonra tekrar deneyin." } def ai_sector_recommendation(gemini_pro): """ Yatırım için önerilen sektörleri analiz eder. Args: gemini_pro: Yapay zeka modeli Returns: dict: Önerilen sektörler ve nedenleri """ try: return _ai_sector_recommendation(gemini_pro) except Exception as e: # API hatası veya bağlantı sorunu durumunda varsayılan öneriler print(f"AI sektör önerisi hatası: {str(e)}") # Türkiye'de genellikle güçlü sektörler default_sectors = { "Bankacılık": "Türkiye'de güçlü temellere sahip bir sektör, ekonomik büyüme ile birlikte gelişim potansiyeli taşır.", "Enerji": "Artan enerji ihtiyacı ve yenilenebilir enerji yatırımları sektöre ivme kazandırıyor.", "Perakende": "Tüketim alışkanlıklarının değişmesi ve e-ticaretin büyümesi ile potansiyel barındırıyor.", "İnşaat": "Altyapı projeleri ve kentsel dönüşüm çalışmaları sektöre canlılık katıyor.", "Teknoloji": "Dijital dönüşüm ve yazılım sektörünün büyümesi ile yüksek potansiyel taşıyor.", "Sağlık": "Medikal cihazlar ve ilaç sektörü büyüme potansiyeli taşıyor." } return { "recommended_sectors": default_sectors, "analysis_date": datetime.now().strftime("%Y-%m-%d"), "details": "Yapay zeka sektör önerileri şu anda kullanılamıyor. Lütfen daha sonra tekrar deneyin." }