stock-dock / app.py
dibend's picture
Update app.py
311504a
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)