JayLacoma commited on
Commit
1388c94
·
verified ·
1 Parent(s): a3b3423

Delete app1.py

Browse files
Files changed (1) hide show
  1. app1.py +0 -287
app1.py DELETED
@@ -1,287 +0,0 @@
1
- # %%
2
- # %%
3
- import gradio as gr
4
- import pandas as pd
5
- import yfinance as yf
6
- from datetime import datetime
7
- import plotly.graph_objects as go
8
- import numpy as np
9
-
10
- # Functions for calculating indicators (SMA, RSI, etc.) and generating trading signals
11
-
12
- def calculate_sma(df, window):
13
- return df['Close'].rolling(window=window).mean()
14
-
15
- def calculate_ema(df, window):
16
- return df['Close'].ewm(span=window, adjust=False).mean()
17
-
18
-
19
- def calculate_macd(df):
20
- short_ema = df['Close'].ewm(span=12, adjust=False).mean()
21
- long_ema = df['Close'].ewm(span=26, adjust=False).mean()
22
- macd = short_ema - long_ema
23
- signal = macd.ewm(span=9, adjust=False).mean()
24
- return macd, signal
25
-
26
-
27
- def calculate_rsi(df):
28
- delta = df['Close'].diff()
29
- gain = (delta.where(delta > 0, 0)).rolling(window=14).mean()
30
- loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean()
31
- rs = gain / loss
32
- rsi = 100 - (100 / (1 + rs))
33
- return rsi
34
-
35
- def calculate_bollinger_bands(df):
36
- middle_bb = df['Close'].rolling(window=20).mean()
37
- upper_bb = middle_bb + 2 * df['Close'].rolling(window=20).std()
38
- lower_bb = middle_bb - 2 * df['Close'].rolling(window=20).std()
39
- return middle_bb, upper_bb, lower_bb
40
-
41
- def calculate_stochastic_oscillator(df):
42
- lowest_low = df['Low'].rolling(window=14).min()
43
- highest_high = df['High'].rolling(window=14).max()
44
- slowk = ((df['Close'] - lowest_low) / (highest_high - lowest_low)) * 100
45
- slowd = slowk.rolling(window=3).mean()
46
- return slowk, slowd
47
-
48
-
49
-
50
- def calculate_cmf(df, window=20):
51
- mfv = ((df['Close'] - df['Low']) - (df['High'] - df['Close'])) / (df['High'] - df['Low']) * df['Volume']
52
- cmf = mfv.rolling(window=window).sum() / df['Volume'].rolling(window=window).sum()
53
- return cmf
54
-
55
- def calculate_cci(df, window=20):
56
- """Calculate Commodity Channel Index (CCI)."""
57
- typical_price = (df['High'] + df['Low'] + df['Close']) / 3
58
- sma = typical_price.rolling(window=window).mean()
59
- mean_deviation = (typical_price - sma).abs().rolling(window=window).mean()
60
- cci = (typical_price - sma) / (0.015 * mean_deviation)
61
- return cci
62
-
63
-
64
-
65
- def generate_trading_signals(df):
66
- # Calculate various indicators
67
- df['SMA_30'] = calculate_sma(df, 30)
68
- df['SMA_100'] = calculate_sma(df, 100)
69
- df['EMA_12'] = calculate_ema(df, 12)
70
- df['EMA_26'] = calculate_ema(df, 26)
71
- df['RSI'] = calculate_rsi(df)
72
- df['MiddleBB'], df['UpperBB'], df['LowerBB'] = calculate_bollinger_bands(df)
73
- df['SlowK'], df['SlowD'] = calculate_stochastic_oscillator(df)
74
- df['CMF'] = calculate_cmf(df)
75
- df['CCI'] = calculate_cci(df)
76
-
77
-
78
-
79
- # Generate trading signals
80
- df['SMA_Signal'] = np.where(df['SMA_30'] > df['SMA_100'], 1, 0)
81
-
82
- macd, signal = calculate_macd(df)
83
- df['MACD_Signal'] = np.select([(macd > signal) & (macd.shift(1) <= signal.shift(1)),
84
- (macd < signal) & (macd.shift(1) >= signal.shift(1))],[1, -1], default=0)
85
-
86
-
87
-
88
- df['RSI_Signal'] = np.where(df['RSI'] < 20, 1, 0)
89
- df['RSI_Signal'] = np.where(df['RSI'] > 90, -1, df['RSI_Signal'])
90
-
91
- df['BB_Signal'] = np.where(df['Close'] < df['LowerBB'], 0, 0)
92
- df['BB_Signal'] = np.where(df['Close'] > df['UpperBB'], -1, df['BB_Signal'])
93
-
94
- df['Stochastic_Signal'] = np.where((df['SlowK'] < 10) & (df['SlowD'] < 15), 1, 0)
95
- df['Stochastic_Signal'] = np.where((df['SlowK'] > 90) & (df['SlowD'] > 85), -1, df['Stochastic_Signal'])
96
-
97
-
98
- df['CMF_Signal'] = np.where(df['CMF'] > 0.3, -1, np.where(df['CMF'] < -0.3, 1, 0))
99
-
100
-
101
- df['CCI_Signal'] = np.where(df['CCI'] < -180, 1, 0)
102
- df['CCI_Signal'] = np.where(df['CCI'] > 150, -1, df['CCI_Signal'])
103
-
104
-
105
-
106
- # Combined signal for stronger buy/sell points
107
- df['Combined_Signal'] = df[['RSI_Signal', 'BB_Signal',
108
- 'Stochastic_Signal', 'CMF_Signal',
109
- 'CCI_Signal']].sum(axis=1)
110
-
111
- return df
112
-
113
-
114
- # %%
115
- def plot_combined_signals(df, ticker):
116
- # Create a figure
117
- fig = go.Figure()
118
-
119
- # Add closing price trace
120
- fig.add_trace(go.Scatter(
121
- x=df.index, y=df['Close'],
122
- mode='lines',
123
- name='Closing Price',
124
- line=dict(color='lightcoral', width=2)
125
- ))
126
-
127
- # Add buy signals
128
- buy_signals = df[df['Combined_Signal'] >= 3]
129
- fig.add_trace(go.Scatter(
130
- x=buy_signals.index, y=buy_signals['Close'],
131
- mode='markers',
132
- marker=dict(symbol='triangle-up', size=10, color='lightgreen'),
133
- name='Buy Signal'
134
- ))
135
-
136
- # Add sell signals
137
- sell_signals = df[df['Combined_Signal'] <= -3]
138
- fig.add_trace(go.Scatter(
139
- x=sell_signals.index, y=sell_signals['Close'],
140
- mode='markers',
141
- marker=dict(symbol='triangle-down', size=10, color='lightsalmon'),
142
- name='Sell Signal'
143
- ))
144
-
145
- # Combined signal trace
146
- fig.add_trace(go.Scatter(
147
- x=df.index, y=df['Combined_Signal'],
148
- mode='lines',
149
- name='Combined Signal',
150
- line=dict(color='deepskyblue', width=2),
151
- yaxis='y2'
152
- ))
153
-
154
- # Update layout
155
- fig.update_layout(
156
- title=f'{ticker}: Stock Price and Combined Trading Signal (Last 120 Days)',
157
- xaxis=dict(title='Date'),
158
- yaxis=dict(title='Price', side='left'),
159
- yaxis2=dict(title='Combined Signal', overlaying='y', side='right', showgrid=False),
160
- plot_bgcolor='black',
161
- paper_bgcolor='black',
162
- font=dict(color='white')
163
- )
164
-
165
- return fig
166
-
167
-
168
-
169
-
170
- # %%
171
- def plot_individual_signals(df, ticker):
172
- # Create a figure
173
- fig = go.Figure()
174
- fig.add_trace(go.Scatter(
175
- x=df.index, y=df['Close'],
176
- mode='lines',
177
- name='Closing Price',
178
- line=dict(color='lightcoral', width=2)
179
- ))
180
-
181
- # Add buy/sell signals for each indicator
182
- signal_names = ['RSI_Signal', 'BB_Signal',
183
- 'Stochastic_Signal', 'CMF_Signal',
184
- 'CCI_Signal']
185
-
186
- for signal in signal_names:
187
- buy_signals = df[df[signal] == 1]
188
- sell_signals = df[df[signal] == -1]
189
-
190
- fig.add_trace(go.Scatter(
191
- x=buy_signals.index, y=buy_signals['Close'],
192
- mode='markers',
193
- marker=dict(symbol='triangle-up', size=10, color='lightgreen'),
194
- name=f'{signal} Buy Signal'
195
- ))
196
-
197
- fig.add_trace(go.Scatter(
198
- x=sell_signals.index, y=sell_signals['Close'],
199
- mode='markers',
200
- marker=dict(symbol='triangle-down', size=10, color='lightsalmon'),
201
- name=f'{signal} Sell Signal'
202
- ))
203
-
204
- fig.update_layout(
205
- title=f'{ticker}: Individual Trading Signals',
206
- xaxis=dict(title='Date'),
207
- yaxis=dict(title='Price', side='left'),
208
- plot_bgcolor='black',
209
- paper_bgcolor='black',
210
- font=dict(color='white')
211
- )
212
-
213
- return fig
214
-
215
-
216
- def display_signals(df):
217
- # Create a signals DataFrame
218
- signals_df = df[['Close', 'SMA_Signal', 'MACD_Signal', 'RSI_Signal',
219
- 'BB_Signal', 'Stochastic_Signal',
220
- 'CMF_Signal', 'CCI_Signal']].copy()
221
-
222
- # The Date is the index, so we don't need to add it as a column
223
- signals_df.index.name = 'Date' # Name the index for better readability
224
-
225
- # Replace signal values with 'Buy', 'Sell', or 'Hold'
226
- for column in signals_df.columns:
227
- signals_df[column] = signals_df[column].replace(
228
- {1: 'Buy', -1: 'Sell', 0: 'Hold'}
229
- )
230
-
231
- return signals_df
232
-
233
- def stock_analysis(ticker, start_date, end_date):
234
- # Download stock data from Yahoo Finance
235
- df = yf.download(ticker, start=start_date, end=end_date)
236
-
237
- # If the DataFrame has a MultiIndex for columns, drop the 'Ticker' level
238
- if isinstance(df.columns, pd.MultiIndex):
239
- df.columns = df.columns.droplevel(level=1) # Drop the 'Ticker' level
240
-
241
- # Explicitly set column names (optional)
242
- df.columns = ['Close', 'High', 'Low', 'Open', 'Volume']
243
-
244
- # Generate signals
245
- df = generate_trading_signals(df)
246
-
247
- # Last 60 days for plotting
248
- df_last_60 = df.tail(120)
249
-
250
- # Plot combined signals
251
- fig_signals = plot_combined_signals(df_last_60, ticker)
252
-
253
- # Plot individual signals
254
- fig_individual_signals = plot_individual_signals(df_last_60, ticker)
255
-
256
- # Display signals DataFrame
257
- signals_df = df_last_60[['Close', 'SMA_Signal', 'MACD_Signal', 'RSI_Signal', 'BB_Signal',
258
- 'Stochastic_Signal','CMF_Signal',
259
- 'CCI_Signal']]
260
-
261
- return fig_signals, fig_individual_signals
262
-
263
-
264
-
265
- # %%
266
- # Define Gradio interface
267
- with gr.Blocks() as demo:
268
- gr.Markdown("## Stock Market Analysis App")
269
-
270
- ticker_input = gr.Textbox(label="Enter Stock Ticker (e.g., AAPL, NVDA)", value="NVDA")
271
- start_date_input = gr.Textbox(label="Start Date (YYYY-MM-DD)", value="2022-01-01")
272
- end_date_input = gr.Textbox(label="End Date (YYYY-MM-DD)", value="2026-01-01")
273
-
274
- # Create a submit button that runs the stock analysis function
275
- button = gr.Button("Analyze Stock")
276
-
277
- # Outputs: Display results, charts
278
- combined_signals_output = gr.Plot(label="Combined Trading Signals")
279
- individual_signals_output = gr.Plot(label="Individual Trading Signals")
280
- #signals_df_output = gr.Dataframe(label="Buy/Sell Signals")
281
-
282
- # Link button to function
283
- button.click(stock_analysis, inputs=[ticker_input, start_date_input, end_date_input],
284
- outputs=[combined_signals_output, individual_signals_output])
285
-
286
- # Launch the interface
287
- demo.launch()