import pandas as pd import numpy as np from typing import Dict, Any def calculate_sma(data: pd.DataFrame, window: int = 20) -> float: return data['close'].rolling(window=window).mean().iloc[-1] def calculate_ema(data: pd.DataFrame, window: int = 20) -> float: return data['close'].ewm(span=window, adjust=False).mean().iloc[-1] def calculate_rsi(data: pd.DataFrame, window: int = 14) -> float: 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 rsi = 100 - (100 / (1 + rs)) return rsi.iloc[-1] def calculate_macd(data: pd.DataFrame) -> Dict[str, float]: exp1 = data['close'].ewm(span=12, adjust=False).mean() exp2 = data['close'].ewm(span=26, adjust=False).mean() macd = exp1 - exp2 signal = macd.ewm(span=9, adjust=False).mean() return { "macd": macd.iloc[-1], "signal": signal.iloc[-1], "histogram": macd.iloc[-1] - signal.iloc[-1] } def calculate_bollinger_bands(data: pd.DataFrame, window: int = 20) -> Dict[str, float]: sma = data['close'].rolling(window=window).mean() std = data['close'].rolling(window=window).std() upper_band = sma + (std * 2) lower_band = sma - (std * 2) return { "upper": upper_band.iloc[-1], "middle": sma.iloc[-1], "lower": lower_band.iloc[-1] }