Spaces:
Sleeping
Sleeping
import gradio as gr | |
import yfinance as yf | |
import plotly.graph_objects as go | |
import pandas as pd | |
def get_interval(period): | |
if period in ['1mo', '3mo']: | |
return '1d' | |
elif period in ['6mo', '1y']: | |
return '5d' | |
elif period in ['2y', '5y', '10y', 'ytd']: | |
return '1wk' | |
else: | |
return '1mo' | |
def get_moving_average_windows(period): | |
if period in ['1mo', '3mo']: | |
return 5, 20 # Shorter windows for shorter periods | |
elif period in ['6mo', '1y']: | |
return 20, 50 | |
else: | |
return 50, 100 # Longer windows for longer periods | |
def plot_stock_data(ticker, period): | |
interval = get_interval(period) | |
short_window, long_window = get_moving_average_windows(period) | |
data = yf.Ticker(ticker).history(period=period, interval=interval) | |
candlestick = go.Candlestick(x=data.index, open=data['Open'], high=data['High'], low=data['Low'], close=data['Close'], name='Candlestick') | |
ma_short = go.Scatter(x=data.index, y=data['Close'].rolling(window=short_window).mean(), mode='lines', name=f'{short_window}-Day MA') | |
ma_long = go.Scatter(x=data.index, y=data['Close'].rolling(window=long_window).mean(), mode='lines', name=f'{long_window}-Day MA') | |
dividends = data[data['Dividends'] > 0] | |
dividend_events = go.Scatter(x=dividends.index, y=dividends['Close'], mode='markers', name='Dividends', marker=dict(color='orange', size=10), hovertext=['Dividend: $' + str(div) for div in dividends['Dividends']], hoverinfo="text") | |
fig = go.Figure(data=[candlestick, ma_short, ma_long, dividend_events]) | |
fig.update_layout(title=f'{ticker} Stock Data - {period}', xaxis_rangeslider_visible=False) | |
return fig | |
interface = gr.Interface( | |
fn=plot_stock_data, | |
inputs=["text", gr.Dropdown(['1mo', '3mo', '6mo', '1y', '2y', '5y', '10y', 'ytd', 'max'])], | |
outputs=gr.Plot(label="Stock Data Graph"), | |
title="Historical Stock Data Visualization", | |
description="Visualize historical stock data with candlestick graphs, including dynamically adjusted moving averages and dividend events." | |
) | |
interface.launch(share=False, debug=True) |