
app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
app.layout = dbc.Container([
dbc.Row([
dbc.Col([
html.H1("📊 Advanced Financial Dashboard", className="text-center mb-4"),
html.P(f"Interactive dashboard with {len(df)} data points across {len(stock_names)} stocks",
className="text-center text-muted"),
html.Hr()
])
]),
dbc.Row([
dbc.Col([
dbc.Card([
dbc.CardBody([
html.H5("🎛️ Dashboard Controls", className="card-title"),
html.Label("Select Stocks:", className="fw-bold mt-3"),
dcc.Dropdown(
id='stock-dropdown',
options=[{'label': f'{stock} ({base_prices[stock]})', 'value': stock}
for stock in stock_names],
value=['AAPL', 'GOOGL'],
multi=True,
placeholder="Choose stocks to analyze..."
),
html.Label("Date Range:", className="fw-bold mt-3"),
dcc.DatePickerRange(
id='date-picker-range',
start_date="2023-06-01",
end_date="2024-06-01",
display_format="YYYY-MM-DD",
style={'width': '100%'}
),
html.Label("Chart Style:", className="fw-bold mt-3"),
dcc.RadioItems(
id='chart-type',
options=[
{'label': ' Line Chart', 'value': 'line'},
{'label': ' Area Chart', 'value': 'area'},
{'label': ' Scatter Plot', 'value': 'scatter'}
],
value="line",
labelStyle={'display': 'block', 'margin': '5px'}
),
dbc.Checklist(
id='show-ma',
options=[{'label': ' Show Moving Average', 'value': 'show'}],
value=[],
style={'margin': '10px 0'}
),
])
], className="h-100")
], width=3),
dbc.Col([
dbc.Card([
dbc.CardHeader("📈 Stock Price Analysis"),
dbc.CardBody([
dcc.Graph(id='main-chart', style={'height': '450px'})
])
])
], width=9)
], className="mb-4"),
dbc.Row([
dbc.Col([
dbc.Card([
dbc.CardBody([
html.H4(id="avg-price", className="text-primary mb-0"),
html.Small("Average Price", className="text-muted")
])
])
], width=3),
dbc.Col([
dbc.Card([
dbc.CardBody([
html.H4(id="total-volume", className="text-success mb-0"),
html.Small("Total Volume", className="text-muted")
])
])
], width=3),
dbc.Col([
dbc.Card([
dbc.CardBody([
html.H4(id="price-range", className="text-info mb-0"),
html.Small("Price Range", className="text-muted")
])
])
], width=3),
dbc.Col([
dbc.Card([
dbc.CardBody([
html.H4(id="data-points", className="text-warning mb-0"),
html.Small("Data Points", className="text-muted")
])
])
], width=3)
], className="mb-4"),
dbc.Row([
dbc.Col([
dbc.Card([
dbc.CardHeader("📊 Trading Volume"),
dbc.CardBody([
dcc.Graph(id='volume-chart', style={'height': '300px'})
])
])
], width=6),
dbc.Col([
dbc.Card([
dbc.CardHeader("📉 Returns Distribution"),
dbc.CardBody([
dcc.Graph(id='returns-chart', style={'height': '300px'})
])
])
], width=6)
], className="mb-4"),
dbc.Row([
dbc.Col([
dbc.Card([
dbc.CardHeader("📋 Latest Stock Data"),
dbc.CardBody([
dash_table.DataTable(
id='data-table',
columns=[
{'name': 'Stock', 'id': 'Stock'},
{'name': 'Date', 'id': 'Date'},
{'name': 'Price ($)', 'id': 'Price', 'type': 'numeric',
'format': {'specifier': '.2f'}},
{'name': 'Volume', 'id': 'Volume', 'type': 'numeric',
'format': {'specifier': ',.0f'}},
{'name': 'Daily Return (%)', 'id': 'Returns', 'type': 'numeric',
'format': {'specifier': '.2%'}}
],
style_cell={'textAlign': 'center', 'fontSize': '14px', 'padding': '10px'},
style_header={'backgroundColor': 'rgb(230, 230, 230)', 'fontWeight': 'bold'},
style_data_conditional=[
{
'if': {'filter_query': '{Returns} > 0'},
'backgroundColor': '#d4edda'
},
{
'if': {'filter_query': '{Returns} < 0'},
'backgroundColor': '#f8d7da'
}
],
page_size=15,
sort_action="native",
filter_action="native"
)
])
])
])
])
], fluid=True)