Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -13,10 +13,8 @@ def compute_rsi(data, window=14):
|
|
13 |
delta = data['Close'].diff()
|
14 |
gain = (delta.where(delta > 0, 0)).rolling(window=window).mean()
|
15 |
loss = (-delta.where(delta < 0, 0)).rolling(window=window).mean()
|
16 |
-
|
17 |
rs = gain / loss
|
18 |
-
|
19 |
-
return rsi
|
20 |
|
21 |
def compute_macd(data, slow=26, fast=12, signal=9):
|
22 |
exp1 = data['Close'].ewm(span=fast, adjust=False).mean()
|
@@ -27,60 +25,56 @@ def compute_macd(data, slow=26, fast=12, signal=9):
|
|
27 |
return macd, signal_line, histogram
|
28 |
|
29 |
def buy_sell_signals(data, rsi, macd, signal_line):
|
30 |
-
|
31 |
-
|
32 |
for i in range(2, len(data)):
|
33 |
# RSI Buy Signal (RSI < 30)
|
34 |
-
if rsi[i-1] < 30 and rsi[i] >= 30:
|
35 |
-
|
36 |
-
sell_signals.append(float('nan'))
|
37 |
# RSI Sell Signal (RSI > 70)
|
38 |
-
elif rsi[i-1] > 70 and rsi[i] <= 70:
|
39 |
-
|
40 |
-
buy_signals.append(float('nan'))
|
41 |
# MACD Buy Signal (MACD crosses above Signal)
|
42 |
-
|
43 |
-
|
44 |
-
sell_signals.append(float('nan'))
|
45 |
# MACD Sell Signal (MACD crosses below Signal)
|
46 |
-
elif macd[i-1] > signal_line[i-1] and macd[i] <= signal_line[i]:
|
47 |
-
|
48 |
-
|
49 |
-
else:
|
50 |
-
buy_signals.append(float('nan'))
|
51 |
-
sell_signals.append(float('nan'))
|
52 |
-
return buy_signals, sell_signals
|
53 |
-
|
54 |
|
55 |
-
def
|
56 |
fig = make_subplots(rows=2, cols=1, shared_xaxes=True)
|
57 |
|
58 |
# Add the candlestick chart
|
59 |
fig.add_trace(go.Candlestick(x=data.index, open=data['Open'], high=data['High'], low=data['Low'], close=data['Close'], name='Market Data'), row=1, col=1)
|
60 |
|
61 |
-
|
62 |
-
|
|
|
|
|
|
|
63 |
|
64 |
-
|
65 |
-
|
|
|
|
|
|
|
66 |
|
67 |
-
# Update layout if needed
|
68 |
fig.update_layout(title='Stock Analysis with RSI and MACD Signals')
|
69 |
-
|
70 |
return fig
|
71 |
|
72 |
def main_interface(ticker, period):
|
73 |
data = fetch_data(ticker, period)
|
74 |
rsi = compute_rsi(data)
|
75 |
macd, signal_line, _ = compute_macd(data)
|
76 |
-
|
77 |
-
|
78 |
-
return
|
79 |
|
80 |
# Step 7: Set Up Gradio Interface with corrected type parameter
|
81 |
iface = gr.Interface(fn=main_interface,
|
82 |
-
inputs=[gr.Textbox(label="Asset Ticker"), gr.Textbox(label="Period: (e.g., 1y, 2y, 5y)")],
|
83 |
-
outputs=gr.Plot(),
|
84 |
title="Stock Analysis Tool",
|
85 |
description="Enter a stock ticker and period to analyze buy/sell signals based on RSI and MACD.")
|
86 |
|
|
|
13 |
delta = data['Close'].diff()
|
14 |
gain = (delta.where(delta > 0, 0)).rolling(window=window).mean()
|
15 |
loss = (-delta.where(delta < 0, 0)).rolling(window=window).mean()
|
|
|
16 |
rs = gain / loss
|
17 |
+
return 100 - (100 / (1 + rs))
|
|
|
18 |
|
19 |
def compute_macd(data, slow=26, fast=12, signal=9):
|
20 |
exp1 = data['Close'].ewm(span=fast, adjust=False).mean()
|
|
|
25 |
return macd, signal_line, histogram
|
26 |
|
27 |
def buy_sell_signals(data, rsi, macd, signal_line):
|
28 |
+
buy_signals_rsi, sell_signals_rsi = [], []
|
29 |
+
buy_signals_macd, sell_signals_macd = [], []
|
30 |
for i in range(2, len(data)):
|
31 |
# RSI Buy Signal (RSI < 30)
|
32 |
+
if rsi.iloc[i-1] < 30 and rsi.iloc[i] >= 30:
|
33 |
+
buy_signals_rsi.append((data.index[i], data['Close'].iloc[i]))
|
|
|
34 |
# RSI Sell Signal (RSI > 70)
|
35 |
+
elif rsi.iloc[i-1] > 70 and rsi.iloc[i] <= 70:
|
36 |
+
sell_signals_rsi.append((data.index[i], data['Close'].iloc[i]))
|
|
|
37 |
# MACD Buy Signal (MACD crosses above Signal)
|
38 |
+
if macd.iloc[i-1] < signal_line.iloc[i-1] and macd.iloc[i] >= signal_line.iloc[i]:
|
39 |
+
buy_signals_macd.append((data.index[i], data['Close'].iloc[i]))
|
|
|
40 |
# MACD Sell Signal (MACD crosses below Signal)
|
41 |
+
elif macd.iloc[i-1] > signal_line.iloc[i-1] and macd.iloc[i] <= signal_line.iloc[i]:
|
42 |
+
sell_signals_macd.append((data.index[i], data['Close'].iloc[i]))
|
43 |
+
return buy_signals_rsi, sell_signals_rsi, buy_signals_macd, sell_signals_macd
|
|
|
|
|
|
|
|
|
|
|
44 |
|
45 |
+
def plot_data(data, buy_signals_rsi, sell_signals_rsi, buy_signals_macd, sell_signals_macd):
|
46 |
fig = make_subplots(rows=2, cols=1, shared_xaxes=True)
|
47 |
|
48 |
# Add the candlestick chart
|
49 |
fig.add_trace(go.Candlestick(x=data.index, open=data['Open'], high=data['High'], low=data['Low'], close=data['Close'], name='Market Data'), row=1, col=1)
|
50 |
|
51 |
+
# Plot RSI signals with labels
|
52 |
+
for date, price in buy_signals_rsi:
|
53 |
+
fig.add_trace(go.Scatter(x=[date], y=[price], mode='markers', marker_symbol='triangle-up', marker_color='green', name='Buy Signal RSI', hovertext="RSI Buy", hoverinfo='text'), row=1, col=1)
|
54 |
+
for date, price in sell_signals_rsi:
|
55 |
+
fig.add_trace(go.Scatter(x=[date], y=[price], mode='markers', marker_symbol='triangle-down', marker_color='red', name='Sell Signal RSI', hovertext="RSI Sell", hoverinfo='text'), row=1, col=1)
|
56 |
|
57 |
+
# Plot MACD signals with labels
|
58 |
+
for date, price in buy_signals_macd:
|
59 |
+
fig.add_trace(go.Scatter(x=[date], y=[price], mode='markers', marker=dict(symbol='triangle-up', color='blue'), name='Buy Signal MACD', hovertext="MACD Buy", hoverinfo='text'), row=1, col=1)
|
60 |
+
for date, price in sell_signals_macd:
|
61 |
+
fig.add_trace(go.Scatter(x=[date], y=[price], mode='markers', marker=dict(symbol='triangle-down', color='purple'), name='Sell Signal MACD', hovertext="MACD Sell", hoverinfo='text'), row=1, col=1)
|
62 |
|
|
|
63 |
fig.update_layout(title='Stock Analysis with RSI and MACD Signals')
|
|
|
64 |
return fig
|
65 |
|
66 |
def main_interface(ticker, period):
|
67 |
data = fetch_data(ticker, period)
|
68 |
rsi = compute_rsi(data)
|
69 |
macd, signal_line, _ = compute_macd(data)
|
70 |
+
buy_signals_rsi, sell_signals_rsi, buy_signals_macd, sell_signals_macd = buy_sell_signals(data, rsi, macd, signal_line)
|
71 |
+
plot = plot_data(data, buy_signals_rsi, sell_signals_rsi, buy_signals_macd, sell_signals_macd)
|
72 |
+
return plot # Return the plot directly
|
73 |
|
74 |
# Step 7: Set Up Gradio Interface with corrected type parameter
|
75 |
iface = gr.Interface(fn=main_interface,
|
76 |
+
inputs=[gr.Textbox(label="Asset Ticker"), gr.Textbox(label="Period: (e.g., 1mo, 2mo, 3mo, 1y, 2y, 5y)")],
|
77 |
+
outputs=gr.Plot(),
|
78 |
title="Stock Analysis Tool",
|
79 |
description="Enter a stock ticker and period to analyze buy/sell signals based on RSI and MACD.")
|
80 |
|