dibend commited on
Commit
19e5d93
1 Parent(s): 088e2dc

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +78 -0
app.py ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import yfinance as yf
2
+ import plotly.graph_objects as go
3
+ from plotly.subplots import make_subplots
4
+ import pandas as pd
5
+ import gradio as gr
6
+ import os
7
+
8
+ def fetch_data(ticker, period):
9
+ data = yf.download(ticker, period=period)
10
+ return data
11
+
12
+ 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()
23
+ exp2 = data['Close'].ewm(span=slow, adjust=False).mean()
24
+ macd = exp1 - exp2
25
+ signal_line = macd.ewm(span=signal, adjust=False).mean()
26
+ histogram = macd - signal_line
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_data(data, buy_signals, sell_signals, filename="plot.png"):
56
+ fig = make_subplots(rows=2, cols=1)
57
+ fig.add_trace(go.Candlestick(x=data.index, open=data['Open'], high=data['High'], low=data['Low'], close=data['Close'], name='Candlesticks'), row=1, col=1)
58
+ fig.add_trace(go.Scatter(x=data.index, y=buy_signals, mode='markers', marker_symbol='triangle-up', marker_color='green', name='Buy Signal'), row=1, col=1)
59
+ fig.add_trace(go.Scatter(x=data.index, y=sell_signals, mode='markers', marker_symbol='triangle-down', marker_color='red', name='Sell Signal'), row=1, col=1)
60
+ fig.update_layout(title='Candlestick Chart with Buy and Sell Signals', xaxis_rangeslider_visible=False)
61
+ fig.write_image(filename)
62
+ return filename
63
+
64
+ def main_interface(ticker, period):
65
+ data = fetch_data(ticker, period)
66
+ rsi = compute_rsi(data)
67
+ macd, signal_line, _ = compute_macd(data)
68
+ buy_signals, sell_signals = buy_sell_signals(data, rsi, macd, signal_line)
69
+ plot_filename = plot_data(data, buy_signals, sell_signals)
70
+ return plot_filename
71
+
72
+ iface = gr.Interface(fn=main_interface,
73
+ inputs=[gr.Textbox(label="Asset Ticker"), gr.Textbox(label="Period: (e.g., 1y, 2y, 5y)")],
74
+ outputs=gr.Image(type="file"),
75
+ title="Stock Analysis Tool",
76
+ description="Enter a stock ticker and period to analyze buy/sell signals based on RSI and MACD.")
77
+
78
+ iface.launch()