# analysis/technical.py import numpy as np from data.api_client import YahooFinanceClient class TechnicalAnalyzer: @staticmethod def calculate_rsi(data, window=14): delta = data['Close'].diff() gain = (delta.where(delta > 0, 0)).rolling(window=window).mean() loss = (-delta.where(delta < 0, 0)).rolling(window=window).mean() rs = gain / loss return 100 - (100 / (1 + rs)) @staticmethod def calculate_sma(data, window): return data['Close'].rolling(window=window).mean() def analyze(self, ticker): data = YahooFinanceClient.download_data(ticker, period='1y') if data.empty or data.shape[0] < 50: return None sma_50 = self.calculate_sma(data, 50).iloc[-1].item() current_price = data['Close'].iloc[-1].item() rsi = self.calculate_rsi(data).iloc[-1].item() return { 'price': current_price, 'sma_50': sma_50, 'price_vs_sma': (current_price / sma_50) - 1, 'rsi': rsi if not np.isnan(rsi) else 50, 'trend': 'bullish' if current_price > sma_50 else 'bearish' }