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)