import streamlit as st import requests from model import fetch_data, calculate_indicators, calculate_support_resistance import os # import argparse # parser = argparse.ArgumentParser() # parser.add_argument('--token', required=True) # args = parser.parse_args() # API_TOKEN = args.token # Hugging Face API token and model URL # API_TOKEN = os.environ['HUGGING_FACE_TOKEN'] API_TOKEN ='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' API_URL = "https://api-inference.huggingface.co/models/meta-llama/Meta-Llama-3.1-8B-Instruct" def generate_prompt(ticker, start_date, end_date): """Fetch data, calculate indicators, and prepare the prompt.""" data = fetch_data(ticker, start_date, end_date) if data is None: return "No data available for the given ticker and date range.", None data = calculate_indicators(data) support, resistance = calculate_support_resistance(data) # Additional statistics highest_close = data['Close'].max() lowest_close = data['Close'].min() average_close = data['Close'].mean() average_volume = data['Volume'].mean() highest_volume = data['Volume'].max() lowest_volume = data['Volume'].min() daily_returns = data['Close'].pct_change().dropna() volatility = daily_returns.std() recent_trend = "uptrend" if data['Close'].iloc[-1] > data['Close'].iloc[0] else "downtrend" if data['Close'].iloc[-1] < data['Close'].iloc[0] else "sideways" # Summarize the key statistics summary = { 'latest_close': data['Close'].iloc[-1], 'SMA_50': data['SMA_50'].iloc[-1], 'EMA_50': data['EMA_50'].iloc[-1], 'RSI': data['RSI'].iloc[-1], 'MACD': data['MACD'].iloc[-1], 'MACD_Signal': data['MACD_Signal'].iloc[-1], 'Bollinger_High': data['Bollinger_High'].iloc[-1], 'Bollinger_Low': data['Bollinger_Low'].iloc[-1], 'ATR': data['ATR'].iloc[-1], 'OBV': data['OBV'].iloc[-1], 'Support': support, 'Resistance': resistance, 'Highest_Close': highest_close, 'Lowest_Close': lowest_close, 'Average_Close': average_close, 'Average_Volume': average_volume, 'Highest_Volume': highest_volume, 'Lowest_Volume': lowest_volume, 'Volatility': volatility, 'Recent_Trend': recent_trend, 'Percentage_Change': (data['Close'].iloc[-1] - data['Close'].iloc[-2]) / data['Close'].iloc[-2] * 100 if len(data) > 1 else 0 } prompt = f""" Analyze the following stock data for {ticker} and provide a buy/sell recommendation: Latest Close Price: {summary['latest_close']} SMA 50: {summary['SMA_50']} EMA 50: {summary['EMA_50']} RSI: {summary['RSI']} MACD: {summary['MACD']} MACD Signal: {summary['MACD_Signal']} Bollinger Bands High: {summary['Bollinger_High']} Bollinger Bands Low: {summary['Bollinger_Low']} ATR: {summary['ATR']} OBV: {summary['OBV']} Support Level: {summary['Support']} Resistance Level: {summary['Resistance']} Highest Close Price: {summary['Highest_Close']} Lowest Close Price: {summary['Lowest_Close']} Average Close Price: {summary['Average_Close']} Average Volume: {summary['Average_Volume']} Highest Volume: {summary['Highest_Volume']} Lowest Volume: {summary['Lowest_Volume']} Volatility: {summary['Volatility']} Recent Trend: {summary['Recent_Trend']} Percentage Change: {summary['Percentage_Change']}% """ return prompt, summary def get_recommendation(prompt): """Get stock recommendation from Hugging Face API.""" headers = { "Authorization": f"Bearer {API_TOKEN}", "Content-Type": "application/json" } payload = {"inputs": prompt} response = requests.post(API_URL, headers=headers, json=payload) response.raise_for_status() # Raise an error for HTTP issues result = response.json() return result[0]['generated_text'].strip() def display_recommendation(ticker, start_date, end_date): """Fetch data, generate prompt, get recommendation, and display it in a nice format.""" prompt, summary = generate_prompt(ticker, start_date, end_date) if summary is None: st.error(prompt) return try: recommendation = get_recommendation(prompt) except Exception as e: st.error(f"An error occurred while getting recommendation: {e}") return # Display in a box/table format using Streamlit st.markdown(f"### Stock Analysis & Recommendation for {ticker}") st.markdown(f"""
Indicator | Value |
---|---|
Latest Close Price | {summary['latest_close']} |
SMA 50 | {summary['SMA_50']} |
EMA 50 | {summary['EMA_50']} |
RSI | {summary['RSI']} |
MACD | {summary['MACD']} |
MACD Signal | {summary['MACD_Signal']} |
Bollinger Bands High | {summary['Bollinger_High']} |
Bollinger Bands Low | {summary['Bollinger_Low']} |
ATR | {summary['ATR']} |
OBV | {summary['OBV']} |
Support Level | {summary['Support']} |
Resistance Level | {summary['Resistance']} |
Highest Close Price | {summary['Highest_Close']} |
Lowest Close Price | {summary['Lowest_Close']} |
Average Close Price | {summary['Average_Close']} |
Average Volume | {summary['Average_Volume']} |
Highest Volume | {summary['Highest_Volume']} |
Lowest Volume | {summary['Lowest_Volume']} |
Volatility | {summary['Volatility']} |
Recent Trend | {summary['Recent_Trend']} |
Percentage Change | {summary['Percentage_Change']}% |