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_stats(data):
"""Calculate basic statistical measures for stock data"""
current_price = data['Close'].iloc[-1]
prev_price = data['Close'].iloc[-2] if len(data) > 1 else current_price
daily_returns = data['Close'].pct_change().dropna()
stats = {
'current_price': current_price,
'prev_price': prev_price,
'mean_price': data['Close'].mean(),
'max_price': data['High'].max(),
'min_price': data['Low'].min(),
'daily_return': ((current_price - prev_price) / prev_price) * 100,
'volatility': daily_returns.std() * np.sqrt(252) * 100, # Annualized volatility
'avg_volume': data['Volume'].mean()
}
return stats
def calculate_moving_averages(data, periods):
"""Calculate moving averages for given periods"""
result = data.copy()
for period in periods:
result[f'MA_{period}'] = data['Close'].rolling(window=period).mean()
return result
def calculate_rsi(prices, period=14):
"""Calculate Relative Strength Index"""
delta = prices.diff()
gain = (delta.where(delta > 0, 0)).rolling(window=period).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=period).mean()
rs = gain / loss
rsi = 100 - (100 / (1 + rs))
return rsi
def calculate_bollinger_bands(prices, period=20, std_dev=2):
"""Calculate Bollinger Bands"""
sma = prices.rolling(window=period).mean()
std = prices.rolling(window=period).std()
upper_band = sma + (std * std_dev)
lower_band = sma - (std * std_dev)
return upper_band, lower_band
def calculate_technical_indicators(data):
"""Calculate various technical indicators"""
result = data.copy()
# RSI
result['RSI'] = calculate_rsi(data['Close'])
# Bollinger Bands
result['BB_Upper'], result['BB_Lower'] = calculate_bollinger_bands(data['Close'])
result['BB_Middle'] = data['Close'].rolling(window=20).mean()
# MACD
exp1 = data['Close'].ewm(span=12, adjust=False).mean()
exp2 = data['Close'].ewm(span=26, adjust=False).mean()
result['MACD'] = exp1 - exp2
result['MACD_Signal'] = result['MACD'].ewm(span=9, adjust=False).mean()
result['MACD_Histogram'] = result['MACD'] - result['MACD_Signal']
return result
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?