| """ |
| 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 |
|
|
| |
| 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, |
| ) |
|
|
| |
| def load_gemini_pro(): |
| """ |
| Gemini API'yi başlatır ve hazır bir model döndürür |
| """ |
| return _initialize_gemini_api() |
|
|
| |
| 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...") |
| |
| |
| 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...") |
| |
| |
| 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 = [] |
| |
| |
| current_price = bist100_data['Close'].iloc[-1] |
| previous_price = bist100_data['Close'].iloc[-2] |
| price_change = (current_price - previous_price) / previous_price * 100 |
| |
| |
| month_start_price = bist100_data['Close'].iloc[0] |
| month_change = (current_price - month_start_price) / month_start_price * 100 |
| |
| |
| volatility = bist100_data['Close'].pct_change().std() * 100 |
| |
| |
| sma20 = bist100_data['Close'].rolling(window=20).mean().iloc[-1] if len(bist100_data) >= 20 else 0 |
| |
| |
| if price_change > 1.5: |
| market_mood = "Olumlu" |
| elif price_change < -1.5: |
| market_mood = "Olumsuz" |
| else: |
| market_mood = "Nötr" |
| |
| |
| 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 |
| |
| |
| if volatility > 3: |
| volatility_expectation = "Yüksek" |
| elif volatility > 1.5: |
| volatility_expectation = "Orta" |
| else: |
| volatility_expectation = "Düşük" |
| |
| |
| 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" |
| |
| |
| confidence = 70 + (abs(month_change) if month_change > 0 else -abs(month_change)) / 2 |
| confidence = max(60, min(95, confidence)) |
| |
| |
| 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: |
| |
| print(f"AI portföy analizi hatası: {str(e)}") |
| |
| |
| stocks_data = portfolio_data.get("stocks", []) |
| total_gain_loss = portfolio_data.get("total_gain_loss", 0) |
| |
| |
| 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] |
| |
| |
| 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 |
| |
| |
| 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." |
| |
| |
| 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: |
| |
| print(f"AI portföy optimizasyonu hatası: {str(e)}") |
| |
| |
| stocks_data = portfolio_data.get("stocks", []) |
| |
| |
| sorted_stocks = sorted(stocks_data, key=lambda x: x["gain_loss_percentage"], reverse=True) |
| |
| |
| top_performers = sorted_stocks[:3] if len(sorted_stocks) >= 3 else sorted_stocks |
| poor_performers = sorted_stocks[-3:] if len(sorted_stocks) >= 3 else [] |
| |
| |
| 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." |
| ] |
| |
| |
| 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." |
| ) |
| |
| |
| 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." |
| ) |
| |
| |
| 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: |
| |
| print(f"AI sektör önerisi hatası: {str(e)}") |
| |
| |
| 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." |
| } |