BASE_URL = "http://localhost:8501/api/v1"
"""Get technical indicators for a symbol."""
"limit": kwargs.get("limit", 500),
"rsi_period": kwargs.get("rsi_period", 14),
"macd_fast": kwargs.get("macd_fast", 12),
"macd_slow": kwargs.get("macd_slow", 26),
"macd_signal": kwargs.get("macd_signal", 9),
"bb_period": kwargs.get("bb_period", 20),
"bb_std": kwargs.get("bb_std", 2.0),
"ema_periods": kwargs.get("ema_periods", "20,50"),
f"{BASE_URL}/indicators/{symbol}",
response.raise_for_status()
def indicators_to_dataframe(indicators: dict) -> pd.DataFrame:
"""Convert indicators response to DataFrame."""
df = pd.DataFrame(indicators["data"])
df["time"] = pd.to_datetime(df["time"])
df.set_index("time", inplace=True)
def analyze_stock(symbol: str) -> dict:
"""Perform technical analysis on a stock."""
indicators = get_indicators(symbol)
df = indicators_to_dataframe(indicators)
summary = indicators["signal_summary"]
"signal": summary["current_signal"],
"price": latest["close"],
"macd_signal": latest["macd_signal"],
"macd_histogram": latest["macd_histogram"],
"bb_position": (latest["close"] - latest["bb_lower"]) /
(latest["bb_upper"] - latest["bb_lower"]) * 100,
analysis["alerts"].append("RSI oversold - potential buy")
analysis["alerts"].append("RSI overbought - potential sell")
if latest["macd"] > latest["macd_signal"]:
analysis["alerts"].append("MACD bullish")
analysis["alerts"].append("MACD bearish")
if latest["close"] < latest["bb_lower"]:
analysis["alerts"].append("Price below lower BB")
elif latest["close"] > latest["bb_upper"]:
analysis["alerts"].append("Price above upper BB")
def screen_stocks(symbols: list, rsi_threshold_low: float = 30, rsi_threshold_high: float = 70):
"""Screen multiple stocks for trading signals."""
response = requests.post(
f"{BASE_URL}/indicators/batch",
response.raise_for_status()
results = response.json()
signals = {"oversold": [], "overbought": [], "neutral": []}
for symbol, data in results.items():
latest = data["data"][-1]
signal = data["signal_summary"]["current_signal"]
if rsi < rsi_threshold_low:
signals["oversold"].append(stock_info)
elif rsi > rsi_threshold_high:
signals["overbought"].append(stock_info)
signals["neutral"].append(stock_info)
if __name__ == "__main__":
analysis = analyze_stock("AAPL")
print(f"\n{analysis['symbol']} Analysis:")
print(f" Signal: {analysis['signal']}")
print(f" Price: ${analysis['price']:.2f}")
print(f" RSI: {analysis['rsi']:.1f}")
print(f" MACD: {analysis['macd']:.2f}")
print(f" BB Position: {analysis['bb_position']:.1f}%")
for alert in analysis["alerts"]:
symbols = ["AAPL", "MSFT", "GOOGL", "AMZN", "META", "NVDA", "TSLA"]
signals = screen_stocks(symbols)
print("\n📉 Oversold stocks:")
for s in signals["oversold"]:
print(f" {s['symbol']}: RSI={s['rsi']:.1f}")
print("\n📈 Overbought stocks:")
for s in signals["overbought"]:
print(f" {s['symbol']}: RSI={s['rsi']:.1f}")