dibend commited on
Commit
25e5bc9
1 Parent(s): 5936d70

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +28 -34
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
- rsi = 100 - (100 / (1 + rs))
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
- buy_signals = []
31
- sell_signals = []
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
- buy_signals.append(data['Close'][i])
36
- sell_signals.append(float('nan'))
37
  # RSI Sell Signal (RSI > 70)
38
- elif rsi[i-1] > 70 and rsi[i] <= 70:
39
- sell_signals.append(data['Close'][i])
40
- buy_signals.append(float('nan'))
41
  # MACD Buy Signal (MACD crosses above Signal)
42
- elif macd[i-1] < signal_line[i-1] and macd[i] >= signal_line[i]:
43
- buy_signals.append(data['Close'][i])
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
- sell_signals.append(data['Close'][i])
48
- buy_signals.append(float('nan'))
49
- else:
50
- buy_signals.append(float('nan'))
51
- sell_signals.append(float('nan'))
52
- return buy_signals, sell_signals
53
-
54
 
55
- def plot_with_gr_plot(data, buy_signals_rsi, sell_signals_rsi, buy_signals_macd, sell_signals_macd):
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
- fig.add_trace(go.Scatter(x=list(buy_signals_rsi.keys()), y=list(buy_signals_rsi.values()), mode='markers', marker_symbol='triangle-up', marker_color='green', name='Buy Signal RSI', text=["RSI Buy"]*len(buy_signals_rsi), hoverinfo='text+y'), row=1, col=1)
62
- fig.add_trace(go.Scatter(x=list(sell_signals_rsi.keys()), y=list(sell_signals_rsi.values()), mode='markers', marker_symbol='triangle-down', marker_color='red', name='Sell Signal RSI', text=["RSI Sell"]*len(sell_signals_rsi), hoverinfo='text+y'), row=1, col=1)
 
 
 
63
 
64
- fig.add_trace(go.Scatter(x=list(buy_signals_macd.keys()), y=list(buy_signals_macd.values()), mode='markers', marker=dict(symbol='triangle-up', color='blue', size=10), name='Buy Signal MACD', text=["MACD Buy"]*len(buy_signals_macd), hoverinfo='text+y'), row=1, col=1)
65
- fig.add_trace(go.Scatter(x=list(sell_signals_macd.keys()), y=list(sell_signals_macd.values()), mode='markers', marker=dict(symbol='triangle-down', color='purple', size=10), name='Sell Signal MACD', text=["MACD Sell"]*len(sell_signals_macd), hoverinfo='text+y'), row=1, col=1)
 
 
 
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
- buy_signals, sell_signals = buy_sell_signals(data, rsi, macd, signal_line)
77
- plot_filename = plot_data(data, buy_signals, sell_signals)
78
- return plot_filename
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(), # Corrected type parameter
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