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.
To upload files, please first save the app
import streamlit as st
import pandas as pd
import numpy as np
import altair as alt
from datetime import datetime, timedelta
# Function to generate mock stock data
def generate_mock_data(stocks, start_date, end_date):
date_range = pd.date_range(start=start_date, end=end_date, freq='B') # Business days
data = {}
for stock in stocks:
prices = np.random.uniform(low=100, high=500, size=len(date_range))
open_prices = prices + np.random.uniform(-5, 5, size=len(date_range))
volume = np.random.randint(1000, 10000, size=len(date_range))
data[stock] = {
'Date': date_range,
'Open': open_prices,
'Close': prices,
'Volume': volume,
}
return data
# Generate mock data for 5 tech stocks
stocks = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'FB']
start_date = (datetime.now() - timedelta(days=365)).date()
end_date = datetime.now().date()
mock_data = generate_mock_data(stocks, start_date, end_date)
# Prepare data for the selected stock
selected_stock = st.sidebar.selectbox('Select a Stock', stocks)
stock_data = pd.DataFrame(mock_data[selected_stock])
# Date range picker
start, end = st.sidebar.date_input('Date range', [start_date, end_date])
stock_data = stock_data[(stock_data['Date'] >= pd.to_datetime(start)) & (stock_data['Date'] <= pd.to_datetime(end))]
# Price trend chart
st.subheader(f'{selected_stock} Price Trend')
price_chart = alt.Chart(stock_data).mark_line().encode(
x='Date:T',
y='Close:Q',
tooltip=['Date:T', 'Close:Q']
).interactive()
st.altair_chart(price_chart, use_container_width=True)
# Basic stats
mean_close = stock_data['Close'].mean()
volatility = stock_data['Close'].std()
st.write(f'Mean Close Price: ${mean_close:.2f}')
st.write(f'Volatility (Std Dev): ${volatility:.2f}')
# Moving Average
days_moving_avg = st.sidebar.slider('Select Moving Average Window (days)', 1, 30, 5)
stock_data[f'{days_moving_avg} Day MA'] = stock_data['Close'].rolling(window=days_moving_avg).mean()
# Moving average chart
moving_avg_chart = alt.Chart(stock_data).mark_line(color='orange').encode(
x='Date:T',
y=f'{days_moving_avg} Day MA:Q'
)
combined_chart = price_chart + moving_avg_chart
st.altair_chart(combined_chart, use_container_width=True)
# Volume analysis chart
st.subheader(f'{selected_stock} Volume Analysis')
volume_chart = alt.Chart(stock_data).mark_bar().encode(
x='Date:T',
y='Volume:Q',
tooltip=['Date:T', 'Volume:Q']
).interactive()
st.altair_chart(volume_chart, use_container_width=True)
# Stock comparison feature
st.sidebar.subheader('Compare Stocks')
comparison_stocks = st.sidebar.multiselect('Select Stocks to Compare', stocks, default=[stocks[1], stocks[2]])
comparison_data = pd.DataFrame()
for stock in comparison_stocks:
comp_stock_data = pd.DataFrame(mock_data[stock])
comp_stock_data = comp_stock_data[(comp_stock_data['Date'] >= pd.to_datetime(start)) & (comp_stock_data['Date'] <= pd.to_datetime(end))]
comparison_data[stock] = comp_stock_data['Close']
comparison_data['Date'] = comp_stock_data['Date']
comparison_chart = alt.Chart(comparison_data).transform_fold(
comparison_stocks,
as_=['Stock', 'Price']
).mark_line().encode(
x='Date:T',
y='Price:Q',
color='Stock:N'
)
st.subheader('Selected Stocks Comparison')
st.altair_chart(comparison_chart, use_container_width=True)
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?