| """ |
| Borsa Uygulaması için Analiz Yardımcı Modülü |
| Bu modül, risk seviyesi ve öneri hesaplamaları için parametrik fonksiyonlar içerir. |
| """ |
|
|
| import pandas as pd |
| import numpy as np |
| from config import RISK_THRESHOLDS, RECOMMENDATION_THRESHOLDS |
|
|
| def calculate_risk_level(volatility, thresholds=None): |
| """ |
| Volatilite değerine göre risk seviyesini hesaplar. |
| |
| Args: |
| volatility (float): Volatilite değeri (%) |
| thresholds (dict, optional): Risk eşik değerleri. Varsayılan: RISK_THRESHOLDS |
| |
| Returns: |
| tuple: (risk_level, risk_color) risk seviyesi ve renk kodu |
| """ |
| if thresholds is None: |
| thresholds = RISK_THRESHOLDS |
| |
| if volatility is None: |
| return "BELİRSİZ", "gray" |
| |
| if volatility <= thresholds["low"]: |
| return "DÜŞÜK", "green" |
| elif volatility <= thresholds["medium"]: |
| return "ORTA", "orange" |
| else: |
| return "YÜKSEK", "red" |
|
|
| def calculate_recommendation(total_signal, indicator_count, thresholds=None): |
| """ |
| Sinyal skorlarına göre yatırım tavsiyesi hesaplar. |
| |
| Args: |
| total_signal (float): Toplam sinyal skoru |
| indicator_count (int): Toplam gösterge sayısı |
| thresholds (dict, optional): Öneri eşik değerleri. Varsayılan: RECOMMENDATION_THRESHOLDS |
| |
| Returns: |
| tuple: (recommendation_text, recommendation_color) tavsiye metni ve renk kodu |
| """ |
| if thresholds is None: |
| thresholds = RECOMMENDATION_THRESHOLDS |
| |
| ratio = total_signal / indicator_count if indicator_count > 0 else 0 |
| |
| if ratio > thresholds["strong_buy"]: |
| return "GÜÇLÜ AL", "darkgreen" |
| elif ratio > 0: |
| return "AL", "green" |
| elif ratio < thresholds["strong_sell"]: |
| return "GÜÇLÜ SAT", "darkred" |
| elif ratio < 0: |
| return "SAT", "red" |
| else: |
| return "NÖTR", "gray" |
|
|
| def determine_trend(df, sma_columns): |
| """ |
| Fiyat hareketleri ve hareketli ortalamalardan trend yönünü belirler. |
| |
| Args: |
| df (DataFrame): Veri seti (Close fiyatları ve hareketli ortalamalar içermeli) |
| sma_columns (list): Hareketli ortalama sütun adları (örn. ['SMA20', 'SMA50', 'SMA200']) |
| |
| Returns: |
| dict: Trend bilgileri |
| """ |
| trend_info = {} |
| close_price = df['Close'].iloc[-1] |
| |
| |
| trend_info['short_term'] = "Yükseliş" if close_price > df[sma_columns[0]].iloc[-1] else "Düşüş" |
| trend_info['medium_term'] = "Yükseliş" if close_price > df[sma_columns[1]].iloc[-1] else "Düşüş" |
| trend_info['long_term'] = "Yükseliş" if close_price > df[sma_columns[2]].iloc[-1] else "Düşüş" |
| |
| |
| trend_info['short_term_strength'] = abs((close_price / df[sma_columns[0]].iloc[-1] - 1) * 100) |
| trend_info['medium_term_strength'] = abs((close_price / df[sma_columns[1]].iloc[-1] - 1) * 100) |
| trend_info['long_term_strength'] = abs((close_price / df[sma_columns[2]].iloc[-1] - 1) * 100) |
| |
| |
| if trend_info['short_term'] == "Yükseliş" and trend_info['medium_term'] == "Yükseliş": |
| trend_info['direction'] = "yükseliş eğiliminde" |
| elif trend_info['short_term'] == "Düşüş" and trend_info['medium_term'] == "Düşüş": |
| trend_info['direction'] = "düşüş eğiliminde" |
| elif trend_info['short_term'] == "Yükseliş" and trend_info['medium_term'] == "Düşüş": |
| trend_info['direction'] = "kısa vadede yükseliş gösterse de genel düşüş eğiliminde" |
| elif trend_info['short_term'] == "Düşüş" and trend_info['medium_term'] == "Yükseliş": |
| trend_info['direction'] = "kısa vadede düşüş gösterse de genel yükseliş eğiliminde" |
| else: |
| trend_info['direction'] = "yatay seyretmekte" |
| |
| |
| if trend_info['short_term'] == trend_info['medium_term'] == trend_info['long_term'] == "Yükseliş": |
| trend_info['overall'] = "GÜÇLÜ YÜKSELİŞ TRENDİ" |
| trend_info['color'] = "darkgreen" |
| elif trend_info['short_term'] == trend_info['medium_term'] == trend_info['long_term'] == "Düşüş": |
| trend_info['overall'] = "GÜÇLÜ DÜŞÜŞ TRENDİ" |
| trend_info['color'] = "darkred" |
| elif trend_info['long_term'] == "Yükseliş" and (trend_info['short_term'] == "Yükseliş" or trend_info['medium_term'] == "Yükseliş"): |
| trend_info['overall'] = "YÜKSELİŞ TRENDİ" |
| trend_info['color'] = "green" |
| elif trend_info['long_term'] == "Düşüş" and (trend_info['short_term'] == "Düşüş" or trend_info['medium_term'] == "Düşüş"): |
| trend_info['overall'] = "DÜŞÜŞ TRENDİ" |
| trend_info['color'] = "red" |
| elif trend_info['short_term'] != trend_info['medium_term'] or trend_info['medium_term'] != trend_info['long_term']: |
| trend_info['overall'] = "TREND BELİRSİZ" |
| trend_info['color'] = "gray" |
| else: |
| trend_info['overall'] = "YATAY TREND" |
| trend_info['color'] = "blue" |
| |
| return trend_info |
|
|
| def generate_analysis_summary(stock_symbol, trend_info, risk_level, recommendation, price_changes, market_info="", news_info=""): |
| """ |
| Analiz sonuçlarına göre özet metin oluşturur. |
| |
| Args: |
| stock_symbol (str): Hisse senedi sembolü |
| trend_info (dict): Trend bilgileri |
| risk_level (str): Risk seviyesi |
| recommendation (str): Tavsiye metni |
| price_changes (dict): Fiyat değişim bilgileri |
| market_info (str, optional): Piyasa bilgisi metni |
| news_info (str, optional): Haber bilgisi metni |
| |
| Returns: |
| str: Analiz özet metni |
| """ |
| risk_desc = "düşük riskli" if risk_level == "DÜŞÜK" else ("orta riskli" if risk_level == "ORTA" else "yüksek riskli") |
| |
| |
| if "AL" in recommendation: |
| if "GÜÇLÜ" in recommendation: |
| action = "alım için uygun görünüyor" |
| else: |
| action = "dikkatli bir şekilde alım için değerlendirilebilir" |
| elif "SAT" in recommendation: |
| if "GÜÇLÜ" in recommendation: |
| action = "satış için uygun görünüyor" |
| else: |
| action = "satış düşünülebilir" |
| else: |
| action = "bekleme pozisyonunda kalınması uygun olabilir" |
| |
| |
| last_week_trend = f"Son bir haftada %{price_changes.get('1w', 0):.2f} " if price_changes.get('1w') is not None else "" |
| |
| summary = f"{stock_symbol} hissesi şu anda {trend_info['direction']} ve {risk_desc} bir yatırım olarak değerlendirilmektedir. " + \ |
| f"{last_week_trend}değişim göstermiş olup, teknik analiz sonuçlarına göre {action}. " + \ |
| f"{market_info} {news_info} " + \ |
| f"Yatırım kararınızda bu analiz sonuçlarının yanı sıra şirketin temel verilerini ve piyasa koşullarını da dikkate almanız önerilir." |
| |
| return summary |