|
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 |
|
|
|
|
|
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') |
|
|
|
|
|
if submit_button: |
|
try: |
|
start_date, end_date = date_range |
|
stock_data = yf.download(stock_symbol, start=start_date, end=end_date) |
|
|
|
|
|
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) |
|
|
|
|
|
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) |
|
|
|
|
|
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) |
|
|
|
|
|
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)}') |
|
|
|
|
|
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.') |
|
|