Spaces:
Sleeping
Sleeping
| import numpy as np | |
| import pandas as pd | |
| def add_technical_indicators(df: pd.DataFrame) -> pd.DataFrame: | |
| df = df.copy() | |
| # RSI | |
| delta = df["Close"].diff() | |
| gain = delta.where(delta > 0, 0).rolling(window=14).mean() | |
| loss = -delta.where(delta < 0, 0).rolling(window=14).mean() | |
| rs = gain / loss | |
| df["RSI"] = 100 - (100 / (1 + rs)) | |
| # MACD | |
| exp1 = df["Close"].ewm(span=12, adjust=False).mean() | |
| exp2 = df["Close"].ewm(span=26, adjust=False).mean() | |
| df["MACD"] = exp1 - exp2 | |
| # Simple 50-day MA | |
| df["MA50"] = df["Close"].rolling(window=50).mean() | |
| # Log Volume | |
| df["Log_Volume"] = np.log(df["Volume"] + 1) | |
| df = df.dropna() | |
| return df | |
| def classify_signal(predicted_change: float) -> str: | |
| if predicted_change > 1.0: | |
| return "STRONG BUY" | |
| if predicted_change > 0: | |
| return "BUY" | |
| if predicted_change < -1.0: | |
| return "STRONG SELL" | |
| if predicted_change < 0: | |
| return "SELL" | |
| return "HOLD" | |
| def classify_volatility(df: pd.DataFrame) -> str: | |
| returns = df["Close"].pct_change().dropna() | |
| vol = returns.std() | |
| if vol < 0.01: | |
| return "Low" | |
| if vol < 0.025: | |
| return "Medium" | |
| return "High" | |