NandanData commited on
Commit
ff48274
·
verified ·
1 Parent(s): a210c50

Update llm.py

Browse files

Ask AI Enable done

Files changed (1) hide show
  1. llm.py +220 -220
llm.py CHANGED
@@ -1,220 +1,220 @@
1
-
2
- import streamlit as st
3
- import requests
4
- from model import fetch_data, calculate_indicators, calculate_support_resistance
5
- import os
6
-
7
- # import argparse
8
-
9
- # parser = argparse.ArgumentParser()
10
- # parser.add_argument('--token', required=True)
11
- # args = parser.parse_args()
12
-
13
- # API_TOKEN = args.token
14
- # Hugging Face API token and model URL
15
- # API_TOKEN = os.environ['HUGGING_FACE_TOKEN']
16
- API_TOKEN ='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'
17
- API_URL = "https://api-inference.huggingface.co/models/meta-llama/Meta-Llama-3.1-8B-Instruct"
18
-
19
- def generate_prompt(ticker, start_date, end_date):
20
- """Fetch data, calculate indicators, and prepare the prompt."""
21
- data = fetch_data(ticker, start_date, end_date)
22
-
23
- if data is None:
24
- return "No data available for the given ticker and date range.", None
25
-
26
- data = calculate_indicators(data)
27
- support, resistance = calculate_support_resistance(data)
28
-
29
- # Additional statistics
30
- highest_close = data['Close'].max()
31
- lowest_close = data['Close'].min()
32
- average_close = data['Close'].mean()
33
- average_volume = data['Volume'].mean()
34
- highest_volume = data['Volume'].max()
35
- lowest_volume = data['Volume'].min()
36
- daily_returns = data['Close'].pct_change().dropna()
37
- volatility = daily_returns.std()
38
-
39
- 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"
40
-
41
- # Summarize the key statistics
42
- summary = {
43
- 'latest_close': data['Close'].iloc[-1],
44
- 'SMA_50': data['SMA_50'].iloc[-1],
45
- 'EMA_50': data['EMA_50'].iloc[-1],
46
- 'RSI': data['RSI'].iloc[-1],
47
- 'MACD': data['MACD'].iloc[-1],
48
- 'MACD_Signal': data['MACD_Signal'].iloc[-1],
49
- 'Bollinger_High': data['Bollinger_High'].iloc[-1],
50
- 'Bollinger_Low': data['Bollinger_Low'].iloc[-1],
51
- 'ATR': data['ATR'].iloc[-1],
52
- 'OBV': data['OBV'].iloc[-1],
53
- 'Support': support,
54
- 'Resistance': resistance,
55
- 'Highest_Close': highest_close,
56
- 'Lowest_Close': lowest_close,
57
- 'Average_Close': average_close,
58
- 'Average_Volume': average_volume,
59
- 'Highest_Volume': highest_volume,
60
- 'Lowest_Volume': lowest_volume,
61
- 'Volatility': volatility,
62
- 'Recent_Trend': recent_trend,
63
- 'Percentage_Change': (data['Close'].iloc[-1] - data['Close'].iloc[-2]) / data['Close'].iloc[-2] * 100 if len(data) > 1 else 0
64
- }
65
-
66
- prompt = f"""
67
- Analyze the following stock data for {ticker} and provide a buy/sell recommendation:
68
- Latest Close Price: {summary['latest_close']}
69
- SMA 50: {summary['SMA_50']}
70
- EMA 50: {summary['EMA_50']}
71
- RSI: {summary['RSI']}
72
- MACD: {summary['MACD']}
73
- MACD Signal: {summary['MACD_Signal']}
74
- Bollinger Bands High: {summary['Bollinger_High']}
75
- Bollinger Bands Low: {summary['Bollinger_Low']}
76
- ATR: {summary['ATR']}
77
- OBV: {summary['OBV']}
78
- Support Level: {summary['Support']}
79
- Resistance Level: {summary['Resistance']}
80
- Highest Close Price: {summary['Highest_Close']}
81
- Lowest Close Price: {summary['Lowest_Close']}
82
- Average Close Price: {summary['Average_Close']}
83
- Average Volume: {summary['Average_Volume']}
84
- Highest Volume: {summary['Highest_Volume']}
85
- Lowest Volume: {summary['Lowest_Volume']}
86
- Volatility: {summary['Volatility']}
87
- Recent Trend: {summary['Recent_Trend']}
88
- Percentage Change: {summary['Percentage_Change']}%
89
- """
90
-
91
- return prompt, summary
92
-
93
- def get_recommendation(prompt):
94
- """Get stock recommendation from Hugging Face API."""
95
- headers = {
96
- "Authorization": f"Bearer {API_TOKEN}",
97
- "Content-Type": "application/json"
98
- }
99
- payload = {"inputs": prompt}
100
-
101
- response = requests.post(API_URL, headers=headers, json=payload)
102
- response.raise_for_status() # Raise an error for HTTP issues
103
- result = response.json()
104
-
105
- return result[0]['generated_text'].strip()
106
-
107
- def display_recommendation(ticker, start_date, end_date):
108
- """Fetch data, generate prompt, get recommendation, and display it in a nice format."""
109
- prompt, summary = generate_prompt(ticker, start_date, end_date)
110
-
111
- if summary is None:
112
- st.error(prompt)
113
- return
114
-
115
- try:
116
- recommendation = get_recommendation(prompt)
117
- except Exception as e:
118
- st.error(f"An error occurred while getting recommendation: {e}")
119
- return
120
-
121
- # Display in a box/table format using Streamlit
122
- st.markdown(f"### Stock Analysis & Recommendation for {ticker}")
123
-
124
- st.markdown(f"""
125
- <div style='border:2px solid #4CAF50; padding: 15px; border-radius: 10px;'>
126
- <table style='width:100%; border-collapse: collapse;'>
127
- <tr>
128
- <th style='text-align: left;'>Indicator</th>
129
- <th style='text-align: left;'>Value</th>
130
- </tr>
131
- <tr>
132
- <td>Latest Close Price</td>
133
- <td>{summary['latest_close']}</td>
134
- </tr>
135
- <tr>
136
- <td>SMA 50</td>
137
- <td>{summary['SMA_50']}</td>
138
- </tr>
139
- <tr>
140
- <td>EMA 50</td>
141
- <td>{summary['EMA_50']}</td>
142
- </tr>
143
- <tr>
144
- <td>RSI</td>
145
- <td>{summary['RSI']}</td>
146
- </tr>
147
- <tr>
148
- <td>MACD</td>
149
- <td>{summary['MACD']}</td>
150
- </tr>
151
- <tr>
152
- <td>MACD Signal</td>
153
- <td>{summary['MACD_Signal']}</td>
154
- </tr>
155
- <tr>
156
- <td>Bollinger Bands High</td>
157
- <td>{summary['Bollinger_High']}</td>
158
- </tr>
159
- <tr>
160
- <td>Bollinger Bands Low</td>
161
- <td>{summary['Bollinger_Low']}</td>
162
- </tr>
163
- <tr>
164
- <td>ATR</td>
165
- <td>{summary['ATR']}</td>
166
- </tr>
167
- <tr>
168
- <td>OBV</td>
169
- <td>{summary['OBV']}</td>
170
- </tr>
171
- <tr>
172
- <td>Support Level</td>
173
- <td>{summary['Support']}</td>
174
- </tr>
175
- <tr>
176
- <td>Resistance Level</td>
177
- <td>{summary['Resistance']}</td>
178
- </tr>
179
- <tr>
180
- <td>Highest Close Price</td>
181
- <td>{summary['Highest_Close']}</td>
182
- </tr>
183
- <tr>
184
- <td>Lowest Close Price</td>
185
- <td>{summary['Lowest_Close']}</td>
186
- </tr>
187
- <tr>
188
- <td>Average Close Price</td>
189
- <td>{summary['Average_Close']}</td>
190
- </tr>
191
- <tr>
192
- <td>Average Volume</td>
193
- <td>{summary['Average_Volume']}</td>
194
- </tr>
195
- <tr>
196
- <td>Highest Volume</td>
197
- <td>{summary['Highest_Volume']}</td>
198
- </tr>
199
- <tr>
200
- <td>Lowest Volume</td>
201
- <td>{summary['Lowest_Volume']}</td>
202
- </tr>
203
- <tr>
204
- <td>Volatility</td>
205
- <td>{summary['Volatility']}</td>
206
- </tr>
207
- <tr>
208
- <td>Recent Trend</td>
209
- <td>{summary['Recent_Trend']}</td>
210
- </tr>
211
- <tr>
212
- <td>Percentage Change</td>
213
- <td>{summary['Percentage_Change']}%</td>
214
- </tr>
215
- </table>
216
- </div>
217
- """, unsafe_allow_html=True)
218
-
219
- st.write('AI Recommendation:')
220
- st.write(recommendation)
 
1
+
2
+ import streamlit as st
3
+ import requests
4
+ from model import fetch_data, calculate_indicators, calculate_support_resistance
5
+ import os
6
+ from dotenv import load_dotenv
7
+
8
+ # Load environment variables from .env file
9
+ load_dotenv()
10
+
11
+ # Hugging Face API token and model URL
12
+ # Fetch API token from environment variable (works locally and in Hugging Face Spaces)
13
+ API_TOKEN = os.getenv('HF_API_KEY')
14
+ API_URL = "https://api-inference.huggingface.co/models/meta-llama/Meta-Llama-3.1-8B-Instruct"
15
+
16
+ if not API_TOKEN:
17
+ raise ValueError("HF_API_KEY not found in environment variables. Please set it in .env file or Hugging Face Spaces secrets.")
18
+
19
+ def generate_prompt(ticker, start_date, end_date):
20
+ """Fetch data, calculate indicators, and prepare the prompt."""
21
+ data = fetch_data(ticker, start_date, end_date)
22
+
23
+ if data is None:
24
+ return "No data available for the given ticker and date range.", None
25
+
26
+ data = calculate_indicators(data)
27
+ support, resistance = calculate_support_resistance(data)
28
+
29
+ # Additional statistics
30
+ highest_close = data['Close'].max()
31
+ lowest_close = data['Close'].min()
32
+ average_close = data['Close'].mean()
33
+ average_volume = data['Volume'].mean()
34
+ highest_volume = data['Volume'].max()
35
+ lowest_volume = data['Volume'].min()
36
+ daily_returns = data['Close'].pct_change().dropna()
37
+ volatility = daily_returns.std()
38
+
39
+ 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"
40
+
41
+ # Summarize the key statistics
42
+ summary = {
43
+ 'latest_close': data['Close'].iloc[-1],
44
+ 'SMA_50': data['SMA_50'].iloc[-1],
45
+ 'EMA_50': data['EMA_50'].iloc[-1],
46
+ 'RSI': data['RSI'].iloc[-1],
47
+ 'MACD': data['MACD'].iloc[-1],
48
+ 'MACD_Signal': data['MACD_Signal'].iloc[-1],
49
+ 'Bollinger_High': data['Bollinger_High'].iloc[-1],
50
+ 'Bollinger_Low': data['Bollinger_Low'].iloc[-1],
51
+ 'ATR': data['ATR'].iloc[-1],
52
+ 'OBV': data['OBV'].iloc[-1],
53
+ 'Support': support,
54
+ 'Resistance': resistance,
55
+ 'Highest_Close': highest_close,
56
+ 'Lowest_Close': lowest_close,
57
+ 'Average_Close': average_close,
58
+ 'Average_Volume': average_volume,
59
+ 'Highest_Volume': highest_volume,
60
+ 'Lowest_Volume': lowest_volume,
61
+ 'Volatility': volatility,
62
+ 'Recent_Trend': recent_trend,
63
+ 'Percentage_Change': (data['Close'].iloc[-1] - data['Close'].iloc[-2]) / data['Close'].iloc[-2] * 100 if len(data) > 1 else 0
64
+ }
65
+
66
+ prompt = f"""
67
+ Analyze the following stock data for {ticker} and provide a buy/sell recommendation:
68
+ Latest Close Price: {summary['latest_close']}
69
+ SMA 50: {summary['SMA_50']}
70
+ EMA 50: {summary['EMA_50']}
71
+ RSI: {summary['RSI']}
72
+ MACD: {summary['MACD']}
73
+ MACD Signal: {summary['MACD_Signal']}
74
+ Bollinger Bands High: {summary['Bollinger_High']}
75
+ Bollinger Bands Low: {summary['Bollinger_Low']}
76
+ ATR: {summary['ATR']}
77
+ OBV: {summary['OBV']}
78
+ Support Level: {summary['Support']}
79
+ Resistance Level: {summary['Resistance']}
80
+ Highest Close Price: {summary['Highest_Close']}
81
+ Lowest Close Price: {summary['Lowest_Close']}
82
+ Average Close Price: {summary['Average_Close']}
83
+ Average Volume: {summary['Average_Volume']}
84
+ Highest Volume: {summary['Highest_Volume']}
85
+ Lowest Volume: {summary['Lowest_Volume']}
86
+ Volatility: {summary['Volatility']}
87
+ Recent Trend: {summary['Recent_Trend']}
88
+ Percentage Change: {summary['Percentage_Change']}%
89
+ """
90
+
91
+ return prompt, summary
92
+
93
+ def get_recommendation(prompt):
94
+ """Get stock recommendation from Hugging Face API."""
95
+ headers = {
96
+ "Authorization": f"Bearer {API_TOKEN}",
97
+ "Content-Type": "application/json"
98
+ }
99
+ payload = {"inputs": prompt}
100
+
101
+ response = requests.post(API_URL, headers=headers, json=payload)
102
+ response.raise_for_status() # Raise an error for HTTP issues
103
+ result = response.json()
104
+
105
+ return result[0]['generated_text'].strip()
106
+
107
+ def display_recommendation(ticker, start_date, end_date):
108
+ """Fetch data, generate prompt, get recommendation, and display it in a nice format."""
109
+ prompt, summary = generate_prompt(ticker, start_date, end_date)
110
+
111
+ if summary is None:
112
+ st.error(prompt)
113
+ return
114
+
115
+ try:
116
+ recommendation = get_recommendation(prompt)
117
+ except Exception as e:
118
+ st.error(f"An error occurred while getting recommendation: {e}")
119
+ return
120
+
121
+ # Display in a box/table format using Streamlit
122
+ st.markdown(f"### Stock Analysis & Recommendation for {ticker}")
123
+
124
+ st.markdown(f"""
125
+ <div style='border:2px solid #4CAF50; padding: 15px; border-radius: 10px;'>
126
+ <table style='width:100%; border-collapse: collapse;'>
127
+ <tr>
128
+ <th style='text-align: left;'>Indicator</th>
129
+ <th style='text-align: left;'>Value</th>
130
+ </tr>
131
+ <tr>
132
+ <td>Latest Close Price</td>
133
+ <td>{summary['latest_close']}</td>
134
+ </tr>
135
+ <tr>
136
+ <td>SMA 50</td>
137
+ <td>{summary['SMA_50']}</td>
138
+ </tr>
139
+ <tr>
140
+ <td>EMA 50</td>
141
+ <td>{summary['EMA_50']}</td>
142
+ </tr>
143
+ <tr>
144
+ <td>RSI</td>
145
+ <td>{summary['RSI']}</td>
146
+ </tr>
147
+ <tr>
148
+ <td>MACD</td>
149
+ <td>{summary['MACD']}</td>
150
+ </tr>
151
+ <tr>
152
+ <td>MACD Signal</td>
153
+ <td>{summary['MACD_Signal']}</td>
154
+ </tr>
155
+ <tr>
156
+ <td>Bollinger Bands High</td>
157
+ <td>{summary['Bollinger_High']}</td>
158
+ </tr>
159
+ <tr>
160
+ <td>Bollinger Bands Low</td>
161
+ <td>{summary['Bollinger_Low']}</td>
162
+ </tr>
163
+ <tr>
164
+ <td>ATR</td>
165
+ <td>{summary['ATR']}</td>
166
+ </tr>
167
+ <tr>
168
+ <td>OBV</td>
169
+ <td>{summary['OBV']}</td>
170
+ </tr>
171
+ <tr>
172
+ <td>Support Level</td>
173
+ <td>{summary['Support']}</td>
174
+ </tr>
175
+ <tr>
176
+ <td>Resistance Level</td>
177
+ <td>{summary['Resistance']}</td>
178
+ </tr>
179
+ <tr>
180
+ <td>Highest Close Price</td>
181
+ <td>{summary['Highest_Close']}</td>
182
+ </tr>
183
+ <tr>
184
+ <td>Lowest Close Price</td>
185
+ <td>{summary['Lowest_Close']}</td>
186
+ </tr>
187
+ <tr>
188
+ <td>Average Close Price</td>
189
+ <td>{summary['Average_Close']}</td>
190
+ </tr>
191
+ <tr>
192
+ <td>Average Volume</td>
193
+ <td>{summary['Average_Volume']}</td>
194
+ </tr>
195
+ <tr>
196
+ <td>Highest Volume</td>
197
+ <td>{summary['Highest_Volume']}</td>
198
+ </tr>
199
+ <tr>
200
+ <td>Lowest Volume</td>
201
+ <td>{summary['Lowest_Volume']}</td>
202
+ </tr>
203
+ <tr>
204
+ <td>Volatility</td>
205
+ <td>{summary['Volatility']}</td>
206
+ </tr>
207
+ <tr>
208
+ <td>Recent Trend</td>
209
+ <td>{summary['Recent_Trend']}</td>
210
+ </tr>
211
+ <tr>
212
+ <td>Percentage Change</td>
213
+ <td>{summary['Percentage_Change']}%</td>
214
+ </tr>
215
+ </table>
216
+ </div>
217
+ """, unsafe_allow_html=True)
218
+
219
+ st.write('AI Recommendation:')
220
+ st.write(recommendation)