Create an app for stock analysis with mock data. Generate mock daily price data for 5 tech stocks over the past year with standard fields (Open, Close, etc). Features: - Stock selector dropdown - Price trend charts - Basic stats (mean, volatility) - Moving averages - Volume analysis - Stock comparison Interactive elements: - Date range picker - Technical indicators - Chart type toggle Focus on clean visualization of realistic mock data.
Drop files here
or click to upload
import streamlit as st
import pandas as pd
import numpy as np
import plotly.graph_objects as go
from datetime import datetime, timedelta
def generate_mock_data(start_date, num_days):
dates = [start_date + timedelta(days=i) for i in range(num_days)]
data = {
'Date': dates,
'Open': np.random.rand(num_days) * 100,
'Close': np.random.rand(num_days) * 100,
'High': np.random.rand(num_days) * 100,
'Low': np.random.rand(num_days) * 100,
'Volume': np.random.randint(1000, 10000, size=num_days)
}
return pd.DataFrame(data)
# Generate mock data for 5 tech stocks
np.random.seed(42)
num_days = 365
start_date = datetime.now() - timedelta(days=num_days)
stocks = {'AAPL': generate_mock_data(start_date, num_days),
'GOOGL': generate_mock_data(start_date, num_days),
'MSFT': generate_mock_data(start_date, num_days),
'AMZN': generate_mock_data(start_date, num_days),
'TSLA': generate_mock_data(start_date, num_days)}
st.title('Stock Analysis Dashboard')
# Stock selector
stock_choice = st.selectbox('Select a stock:', list(stocks.keys()))
# Date range picker
start_date = st.date_input('Start date', value=datetime.now() - timedelta(days=30))
end_date = st.date_input('End date', value=datetime.now())
# Filter data based on date range
filtered_data = stocks[stock_choice][(stocks[stock_choice]['Date'] >= pd.Timestamp(start_date)) & (stocks[stock_choice]['Date'] <= pd.Timestamp(end_date))]
# Plotting price trend
fig = go.Figure()
fig.add_trace(go.Scatter(x=filtered_data['Date'], y=filtered_data['Close'], mode='lines+markers', name='Close'))
fig.update_layout(title=f'{stock_choice} Price Trend', xaxis_title='Date', yaxis_title='Price ($)', template='plotly', width=800)
st.plotly_chart(fig)
# Stats
mean_price = filtered_data['Close'].mean()
volatility = filtered_data['Close'].std()
st.subheader('Basic Statistics')
st.write(f'Mean Price: ${mean_price:.2f}')
st.write(f'Volatility: ${volatility:.2f}')
# Moving averages
ma_period = st.slider('Select Moving Average Period:', 1, 30, 5)
filtered_data[f'MA_{ma_period}'] = filtered_data['Close'].rolling(window=ma_period).mean()
# Plotting moving averages
fig_ma = go.Figure()
fig_ma.add_trace(go.Scatter(x=filtered_data['Date'], y=filtered_data['Close'], mode='lines', name='Close'))
fig_ma.add_trace(go.Scatter(x=filtered_data['Date'], y=filtered_data[f'MA_{ma_period}'], mode='lines', name=f'MA {ma_period}'))
fig_ma.update_layout(title=f'{stock_choice} Moving Averages', xaxis_title='Date', yaxis_title='Price ($)', template='plotly', width=800)
st.plotly_chart(fig_ma)
# Volume analysis
fig_vol = go.Figure()
fig_vol.add_trace(go.Bar(x=filtered_data['Date'], y=filtered_data['Volume'], name='Volume'))
fig_vol.update_layout(title=f'{stock_choice} Volume Analysis', xaxis_title='Date', yaxis_title='Volume', template='plotly', width=800)
st.plotly_chart(fig_vol)
# Stock Comparison
st.subheader('Stock Comparison')
selected_stocks = st.multiselect('Choose stocks to compare:', list(stocks.keys()))
if len(selected_stocks) > 0:
for s in selected_stocks:
comparison_data = stocks[s][(stocks[s]['Date'] >= pd.Timestamp(start_date)) & (stocks[s]['Date'] <= pd.Timestamp(end_date))]
st.line_chart(comparison_data.set_index('Date')['Close'], use_container_width=True, name=s)
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?