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 pandas as pd
import numpy as np
def calculate_moving_averages(df, periods):
"""
Calculate moving averages for given periods
"""
result = df[['Date', 'Close']].copy()
for period in periods:
result[f'MA_{period}'] = df['Close'].rolling(window=period).mean()
return result
def calculate_stats(df):
"""
Calculate basic statistics for a stock
"""
if df.empty:
return {}
# Sort by date to ensure proper calculation
df_sorted = df.sort_values('Date')
# Current metrics
current_price = df_sorted['Close'].iloc[-1]
prev_price = df_sorted['Close'].iloc[-2] if len(df_sorted) > 1 else current_price
daily_return = ((current_price - prev_price) / prev_price) * 100
# Calculate daily returns for volatility
df_sorted['Daily_Return'] = df_sorted['Close'].pct_change()
volatility = df_sorted['Daily_Return'].std() * np.sqrt(252) * 100 # Annualized volatility
# 52-week high/low
high_52w = df_sorted['High'].max()
low_52w = df_sorted['Low'].min()
# Volume statistics
avg_volume = df_sorted['Volume'].mean()
recent_volume = df_sorted['Volume'].tail(5).mean()
volume_trend = ((recent_volume - avg_volume) / avg_volume) * 100
return {
'current_price': current_price,
'daily_return': daily_return,
'volatility': volatility,
'high_52w': high_52w,
'low_52w': low_52w,
'avg_volume': avg_volume,
'volume_trend': volume_trend
}
def calculate_rsi(df, period=14):
"""
Calculate Relative Strength Index (RSI)
"""
result = df[['Date', 'Close']].copy()
# Calculate price changes
delta = result['Close'].diff()
# Separate gains and losses
gains = delta.where(delta > 0, 0)
losses = -delta.where(delta < 0, 0)
# Calculate average gains and losses
avg_gains = gains.rolling(window=period).mean()
avg_losses = losses.rolling(window=period).mean()
# Calculate RS and RSI
rs = avg_gains / avg_losses
rsi = 100 - (100 / (1 + rs))
result['RSI'] = rsi
return result
def calculate_macd(df, fast=12, slow=26, signal=9):
"""
Calculate MACD (Moving Average Convergence Divergence)
"""
result = df[['Date', 'Close']].copy()
# Calculate exponential moving averages
ema_fast = result['Close'].ewm(span=fast).mean()
ema_slow = result['Close'].ewm(span=slow).mean()
# Calculate MACD line
macd_line = ema_fast - ema_slow
# Calculate signal line
signal_line = macd_line.ewm(span=signal).mean()
# Calculate histogram
histogram = macd_line - signal_line
result['MACD'] = macd_line
result['Signal'] = signal_line
result['Histogram'] = histogram
return result
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?