File size: 6,292 Bytes
92648a6
 
 
 
 
 
 
da243b7
 
 
 
 
 
31504ca
92648a6
 
31504ca
92648a6
31504ca
 
 
 
 
92648a6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31504ca
92648a6
da243b7
 
 
 
31504ca
 
92648a6
31504ca
 
 
 
22f9e5d
92648a6
31504ca
 
 
 
22f9e5d
31504ca
22f9e5d
31504ca
 
 
 
 
22f9e5d
31504ca
 
 
 
 
22f9e5d
31504ca
 
 
 
 
 
22f9e5d
31504ca
 
1a1204d
31504ca
1a1204d
31504ca
 
22f9e5d
11e8c44
 
 
 
da243b7
11e8c44
 
 
22f9e5d
 
31504ca
22f9e5d
 
da243b7
31504ca
11e8c44
92648a6
11e8c44
92648a6
11e8c44
 
 
da243b7
11e8c44
92648a6
 
 
31504ca
da243b7
 
 
 
31504ca
 
 
 
 
 
 
 
92648a6
 
11e8c44
1a1204d
 
31504ca
 
 
 
 
 
 
 
22f9e5d
31504ca
 
22f9e5d
1a1204d
22f9e5d
 
31504ca
22f9e5d
 
 
 
 
 
31504ca
22f9e5d
31504ca
 
22f9e5d
 
1a1204d
31504ca
 
 
 
92648a6
 
 
31504ca
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
import gradio as gr
import pandas as pd
from datetime import datetime, timedelta
import requests
import json
import os

def verify_api_key():
    api_key = os.environ.get('MISTRAL_API_KEY')
    if not api_key:
        return "ERROR: Mistral API key not found in environment variables"
    return "API key found"

def fetch_stock_data(symbol):
    try:
        end_date = datetime.now()
        start_date = end_date - timedelta(days=30)  # Changed to 30 days
        
        # Add .NS suffix for NSE stocks if not present
        if not symbol.endswith('.NS') and not symbol.startswith('^'):
            symbol = f"{symbol}.NS"
        
        url = f"https://query1.finance.yahoo.com/v8/finance/chart/{symbol}?period1={int(start_date.timestamp())}&period2={int(end_date.timestamp())}&interval=1d"
        
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
        }
        
        response = requests.get(url, headers=headers)
        data = response.json()
        
        timestamps = data['chart']['result'][0]['timestamp']
        quote = data['chart']['result'][0]['indicators']['quote'][0]
        
        df = pd.DataFrame({
            'Date': [datetime.fromtimestamp(ts).strftime('%Y-%m-%d') for ts in timestamps],
            'Open': quote['open'],
            'High': quote['high'],
            'Low': quote['low'],
            'Close': quote['close'],
            'Volume': quote['volume']
        })
        
        numeric_columns = ['Open', 'High', 'Low', 'Close']
        df[numeric_columns] = df[numeric_columns].round(2)
        
        return df
    except Exception as e:
        print(f"Error fetching data: {str(e)}")
        return pd.DataFrame()

def get_swing_trade_analysis(df, symbol):
    try:
        api_key = os.environ.get('MISTRAL_API_KEY')
        if not api_key:
            return "Error: Mistral API key not found. Please add it to the environment variables."

        # Get last 30 days of data
        last_30_days = df.tail(30)
        
        # Calculate current price and other metrics
        current_price = last_30_days.iloc[-1]['Close']
        avg_volume = last_30_days['Volume'].mean()
        price_change = ((current_price - last_30_days.iloc[0]['Close']) / last_30_days.iloc[0]['Close']) * 100
        
        # Format data for prompt
        data_str = f"""Analyze the following stock data for {symbol} for swing trading suitability.
Current Price: {current_price}
30-Day Price Change: {price_change:.2f}%
Average Daily Volume: {avg_volume:,.0f}

Please provide a comprehensive swing trading analysis in the following format:

Price Action Analysis:
- Trend Analysis:
- Key Support Levels:
- Key Resistance Levels:
- Volume Analysis:

Swing Trading Suitability:
- Overall Rating (1-10):
- Risk Level (Low/Medium/High):
- Suggested Position Size:
- Recommended Holding Period:

Trading Setup (if suitable):
- Entry Strategy:
- Entry Price Range:
- Stop Loss:
- Target Prices (multiple levels):
- Risk/Reward Ratio:

Key Observations:
- List 3-4 critical points about price action and volume patterns

Last 30 days data:
"""
        for _, row in last_30_days.iterrows():
            data_str += f"{row['Date']}: O:{row['Open']} H:{row['High']} L:{row['Low']} C:{row['Close']} V:{row['Volume']:,.0f}\n"

        url = "https://api.mistral.ai/v1/chat/completions"
        
        headers = {
            "Content-Type": "application/json",
            "Authorization": f"Bearer {api_key}"
        }
        
        data = {
            "model": "mistral-small",
            "messages": [
                {"role": "system", "content": "You are an experienced swing trader specializing in price action analysis. Provide detailed, actionable analysis focusing on price action patterns, volume analysis, and swing trading suitability. Be specific with numbers and levels."},
                {"role": "user", "content": data_str}
            ],
            "temperature": 0.7,
            "max_tokens": 1000
        }
        
        response = requests.post(url, headers=headers, json=data)
        
        if response.status_code == 200:
            return response.json()['choices'][0]['message']['content']
        else:
            return f"Error {response.status_code}: {response.text}"
            
    except Exception as e:
        return f"Error getting analysis: {str(e)}"

def analyze_stock(symbol):
    api_status = verify_api_key()
    if api_status.startswith("ERROR"):
        return pd.DataFrame(), api_status
    
    if not symbol:
        return pd.DataFrame(), "Please enter a stock symbol"
    
    df = fetch_stock_data(symbol)
    if df.empty:
        return df, f"Unable to fetch data for symbol: {symbol}"
    
    analysis = get_swing_trade_analysis(df, symbol)
    return df, analysis

# Create Gradio interface
with gr.Blocks() as demo:
    with gr.Column():
        gr.Markdown("# Stock Swing Trading Analysis")
        
        # Add input for stock symbol
        stock_input = gr.Textbox(
            label="Enter Stock Symbol (e.g., RELIANCE, INFY, TATAMOTORS, or ^NSEI for Nifty50)",
            placeholder="Enter stock symbol...",
            info="For NSE stocks, you can enter the symbol directly (e.g., RELIANCE). For indices, use ^ prefix (e.g., ^NSEI)"
        )
        
        # Add analyze button
        analyze_btn = gr.Button("Analyze Stock", variant="primary")
        
        # Add outputs
        with gr.Row():
            with gr.Column(scale=1):
                gr.Markdown("### Historical Data (Last 30 Days)")
                output_table = gr.Dataframe(
                    headers=["Date", "Open", "High", "Low", "Close", "Volume"],
                    wrap=True
                )
            
            with gr.Column(scale=1):
                gr.Markdown("### Swing Trading Analysis")
                analysis_output = gr.Textbox(
                    label="Analysis Results",
                    lines=20,
                    elem_classes="analysis"
                )
    
    # Set up analyze button click event
    analyze_btn.click(
        fn=analyze_stock,
        inputs=[stock_input],
        outputs=[output_table, analysis_output],
    )

# Launch the app with sharing enabled
demo.launch(share=True)