dibend's picture
Update app.py
2d63453 verified
import yfinance as yf
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import pandas as pd
import gradio as gr
import os
def fetch_data(ticker, period):
data = yf.download(ticker, period=period)
return data
def compute_rsi(data, window=14):
delta = data['Close'].diff()
gain = (delta.where(delta > 0, 0)).rolling(window=window).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=window).mean()
rs = gain / loss
rsi = 100 - (100 / (1 + rs))
return rsi
def compute_macd(data, slow=26, fast=12, signal=9):
exp1 = data['Close'].ewm(span=fast, adjust=False).mean()
exp2 = data['Close'].ewm(span=slow, adjust=False).mean()
macd = exp1 - exp2
signal_line = macd.ewm(span=signal, adjust=False).mean()
histogram = macd - signal_line
return macd, signal_line, histogram
def buy_sell_signals(data, rsi, macd, signal_line):
buy_signals = []
sell_signals = []
for i in range(2, len(data)):
# RSI Buy Signal (RSI < 30)
if rsi[i-1] < 30 and rsi[i] >= 30:
buy_signals.append(data['Close'][i])
sell_signals.append(float('nan'))
# RSI Sell Signal (RSI > 70)
elif rsi[i-1] > 70 and rsi[i] <= 70:
sell_signals.append(data['Close'][i])
buy_signals.append(float('nan'))
# MACD Buy Signal (MACD crosses above Signal)
elif macd[i-1] < signal_line[i-1] and macd[i] >= signal_line[i]:
buy_signals.append(data['Close'][i])
sell_signals.append(float('nan'))
# MACD Sell Signal (MACD crosses below Signal)
elif macd[i-1] > signal_line[i-1] and macd[i] <= signal_line[i]:
sell_signals.append(data['Close'][i])
buy_signals.append(float('nan'))
else:
buy_signals.append(float('nan'))
sell_signals.append(float('nan'))
return buy_signals, sell_signals
def plot_data(data, buy_signals, sell_signals, filename="plot.png"):
fig = make_subplots(rows=2, cols=1)
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)
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)
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)
fig.update_layout(title='Candlestick Chart with Buy and Sell Signals', xaxis_rangeslider_visible=False)
fig.write_image(filename)
return filename
def main_interface(ticker, period):
data = fetch_data(ticker, period)
rsi = compute_rsi(data)
macd, signal_line, _ = compute_macd(data)
buy_signals, sell_signals = buy_sell_signals(data, rsi, macd, signal_line)
plot_filename = plot_data(data, buy_signals, sell_signals)
return plot_filename
# Step 7: Set Up Gradio Interface with corrected type parameter
iface = gr.Interface(fn=main_interface,
inputs=[gr.Textbox(label="Asset Ticker"), gr.Textbox(label="Period: (e.g., 1y, 2y, 5y)")],
outputs=gr.Image(type="filepath"), # Corrected type parameter
title="Stock Analysis Tool",
description="Enter a stock ticker and period to analyze buy/sell signals based on RSI and MACD.")
iface.launch()