stocks / app.py
samarthv's picture
Upload app.py
7b9eb2f
import streamlit as st
import pandas as pd
import yfinance as yf
import plotly.graph_objs as go
from datetime import datetime, timedelta
import requests
# Define the layout using Streamlit components
st.title('Stonks20.com')
stock_symbol = st.text_input('Enter the stock symbol:', 'AAPL')
date_range = st.date_input('Select the dates:', [(datetime.today() - timedelta(days=365)).date(), datetime.today().date()])
submit_button = st.button('Submit')
# Fetch stock data and update the graphs
if submit_button:
try:
start_date, end_date = date_range
stock_data = yf.download(stock_symbol, start=start_date, end=end_date)
# Create a Candlestick chart
candlestick_fig = go.Figure(data=[go.Candlestick(x=stock_data.index,
open=stock_data['Open'],
high=stock_data['High'],
low=stock_data['Low'],
close=stock_data['Close'])])
candlestick_fig.update_layout(
title=f'{stock_symbol} Stock Price',
xaxis_title='Date',
yaxis_title='Price',
autosize=True
)
st.plotly_chart(candlestick_fig)
# Create a Volume chart
volume_fig = go.Figure(data=[go.Bar(x=stock_data.index,
y=stock_data['Volume'])])
volume_fig.update_layout(
title='Volume',
xaxis_title='Date',
yaxis_title='Volume',
autosize=True
)
st.plotly_chart(volume_fig)
# Create a Moving Average chart
moving_average_fig = go.Figure(data=[
go.Scatter(x=stock_data.index, y=stock_data['Close'], name='Price'),
go.Scatter(x=stock_data.index, y=stock_data['Close'].rolling(window=50).mean(), name='50-day MA'),
go.Scatter(x=stock_data.index, y=stock_data['Close'].rolling(window=200).mean(), name='200-day MA')
])
moving_average_fig.update_layout(
title='Moving Averages',
xaxis_title='Date',
yaxis_title='Price',
autosize=True
)
st.plotly_chart(moving_average_fig)
# Create an RSI chart
delta = stock_data['Close'].diff()
gain = delta.mask(delta < 0, 0)
loss = -delta.mask(delta > 0, 0)
avg_gain = gain.rolling(window=14).mean()
avg_loss = loss.rolling(window=14).mean()
rs = avg_gain / avg_loss
rsi = 100 - (100 / (1 + rs))
rsi_fig = go.Figure(data=[go.Scatter(x=stock_data.index, y=rsi, name='RSI', line=dict(color='blue'))])
rsi_fig.update_layout(
title='Relative Strength Index (RSI)',
xaxis_title='Date',
yaxis_title='RSI',
autosize=True
)
st.plotly_chart(rsi_fig)
except Exception as e:
st.error(f'Error: {str(e)}')
# Fetch news articles from GNews API
response = requests.get(f"https://gnews.io/api/v4/search?q={stock_symbol}&token=09fdb169f86cad27b874f8a4872bd913")
if response.status_code == 200:
news_articles = response.json()['articles']
if news_articles:
st.subheader('News')
for article in news_articles:
st.markdown(f"## {article['title']}")
st.markdown(article['description'])
st.markdown(f"[Read More]({article['url']})")
else:
st.warning('No news articles found for the given stock symbol.')
else:
st.error('Failed to fetch news articles. Please check your API key and try again.')