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 matplotlib.pyplot as plt
from datetime import timedelta, date
# Generate mock stock data
def generate_mock_data(tickers, start_date, end_date):
date_range = pd.date_range(start_date, end_date, freq='B') # Business days
data = {ticker: pd.DataFrame(index=date_range) for ticker in tickers}
for ticker, df in data.items():
np.random.seed(hash(ticker) % 123456) # Set seed for reproducibility
df['Open'] = np.random.uniform(100, 200, len(df))
df['Close'] = df['Open'] + np.random.uniform(-5, 5, len(df))
df['High'] = df[['Open', 'Close']].max(axis=1) + np.random.uniform(0, 3, len(df))
df['Low'] = df[['Open', 'Close']].min(axis=1) - np.random.uniform(0, 3, len(df))
df['Volume'] = np.random.randint(1000, 10000, len(df))
df['Date'] = df.index
data[ticker] = df
return data
# Stock Tickers
stock_tickers = ['AAPL', 'GOOG', 'MSFT', 'AMZN', 'FB']
start = date.today() - timedelta(days=365)
end = date.today()
mock_data = generate_mock_data(stock_tickers, start, end)
# Streamlit UI
st.title('Stock Analysis App')
selected_ticker = st.selectbox('Select Stock Ticker', stock_tickers)
date_range = st.date_input('Select Date Range', (start, end))
# Filter data
stock_data = mock_data[selected_ticker].loc[date_range[0]:date_range[1]]
# Plot price trends
st.subheader('Price Trend')
price_chart = st.selectbox('Select Chart Type', ['Line', 'Bar'])
plt.figure(figsize=(10, 5))
if price_chart == 'Line':
plt.plot(stock_data['Close'], label='Close', color='blue')
else:
plt.bar(stock_data.index, stock_data['Close'], label='Close', color='blue')
plt.title(f'{selected_ticker} Price Trend')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.grid()
st.pyplot(plt)
# Calculate and display statistics
mean_price = stock_data['Close'].mean()
volatility = stock_data['Close'].std()
st.subheader('Basic Statistics')
st.write(f'Mean Price: ${mean_price:.2f}')
st.write(f'Volatility: ${volatility:.2f}')
# Moving averages
moving_avg_period = st.number_input('Moving Average Period', min_value=1, value=20)
moving_avg = stock_data['Close'].rolling(window=moving_avg_period).mean()
st.line_chart(moving_avg)
st.write('Moving Average')
# Volume analysis
st.subheader('Volume Analysis')
st.bar_chart(stock_data['Volume'])
st.write('Volume over Time')
# Stock comparison
comparison_ticker = st.selectbox('Select Comparison Stock', stock_tickers)
if comparison_ticker != selected_ticker:
comparison_data = mock_data[comparison_ticker].loc[date_range[0]:date_range[1]]
plt.figure(figsize=(10, 5))
plt.plot(stock_data['Close'], label=selected_ticker, color='blue')
plt.plot(comparison_data['Close'], label=comparison_ticker, color='orange')
plt.title('Stock Comparison')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.grid()
st.pyplot(plt)
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?