feat: Enhance Monte Carlo simulation plot with improved visualization and styling
This commit is contained in:
parent
9b3b1f27ac
commit
3eb6b7b62b
@ -77,39 +77,91 @@ def create_simulation_plot(paths: np.ndarray, dates: pd.DatetimeIndex,
|
|||||||
row_heights=[0.7, 0.3]
|
row_heights=[0.7, 0.3]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Plot all simulation paths with low opacity
|
||||||
|
for i in range(paths.shape[1]):
|
||||||
|
fig.add_trace(
|
||||||
|
go.Scatter(
|
||||||
|
x=dates,
|
||||||
|
y=paths[:, i],
|
||||||
|
name=f'Simulation {i+1}',
|
||||||
|
line=dict(color='orange', width=0.1, opacity=0.1),
|
||||||
|
showlegend=False
|
||||||
|
),
|
||||||
|
row=1, col=1
|
||||||
|
)
|
||||||
|
|
||||||
# Plot confidence intervals
|
# Plot confidence intervals
|
||||||
percentiles = np.percentile(paths, [5, 25, 50, 75, 95], axis=1)
|
percentiles = np.percentile(paths, [5, 25, 50, 75, 95], axis=1)
|
||||||
|
|
||||||
# Add price paths
|
# Add upper bound (blue)
|
||||||
fig.add_trace(
|
fig.add_trace(
|
||||||
go.Scatter(x=dates, y=percentiles[2], name='Median Path',
|
go.Scatter(
|
||||||
line=dict(color='blue', width=2)), row=1, col=1)
|
x=dates,
|
||||||
|
y=percentiles[4],
|
||||||
|
name='Upper 95% Confidence',
|
||||||
|
line=dict(color='blue', width=2)
|
||||||
|
),
|
||||||
|
row=1, col=1
|
||||||
|
)
|
||||||
|
|
||||||
# Add confidence intervals
|
# Add lower bound (red)
|
||||||
fig.add_trace(
|
fig.add_trace(
|
||||||
go.Scatter(x=dates, y=percentiles[4], name='95% Confidence',
|
go.Scatter(
|
||||||
line=dict(color='rgba(0,100,80,0.2)', width=0)), row=1, col=1)
|
x=dates,
|
||||||
|
y=percentiles[0],
|
||||||
|
name='Lower 95% Confidence',
|
||||||
|
line=dict(color='red', width=2)
|
||||||
|
),
|
||||||
|
row=1, col=1
|
||||||
|
)
|
||||||
|
|
||||||
|
# Add median path
|
||||||
fig.add_trace(
|
fig.add_trace(
|
||||||
go.Scatter(x=dates, y=percentiles[0], name='95% Confidence',
|
go.Scatter(
|
||||||
fill='tonexty', line=dict(color='rgba(0,100,80,0.2)', width=0)),
|
x=dates,
|
||||||
row=1, col=1)
|
y=percentiles[2],
|
||||||
|
name='Median Path',
|
||||||
|
line=dict(color='white', width=2)
|
||||||
|
),
|
||||||
|
row=1, col=1
|
||||||
|
)
|
||||||
|
|
||||||
# Add starting price line
|
# Add starting price line
|
||||||
fig.add_trace(
|
fig.add_trace(
|
||||||
go.Scatter(x=dates, y=[last_price] * len(dates), name='Current Price',
|
go.Scatter(
|
||||||
line=dict(color='red', dash='dash')), row=1, col=1)
|
x=dates,
|
||||||
|
y=[last_price] * len(dates),
|
||||||
|
name='Current Price',
|
||||||
|
line=dict(color='green', dash='dash', width=2)
|
||||||
|
),
|
||||||
|
row=1, col=1
|
||||||
|
)
|
||||||
|
|
||||||
# Add histogram of final prices
|
# Add histogram of final prices
|
||||||
fig.add_trace(
|
fig.add_trace(
|
||||||
go.Histogram(x=paths[-1], name='Final Price Distribution',
|
go.Histogram(
|
||||||
nbinsx=50), row=2, col=1)
|
x=paths[-1],
|
||||||
|
name='Final Price Distribution',
|
||||||
|
nbinsx=50,
|
||||||
|
marker_color='orange'
|
||||||
|
),
|
||||||
|
row=2, col=1
|
||||||
|
)
|
||||||
|
|
||||||
|
# Update layout
|
||||||
fig.update_layout(
|
fig.update_layout(
|
||||||
title=f'Monte Carlo Simulation - {ticker}',
|
title=f'Monte Carlo Simulation - {ticker}',
|
||||||
showlegend=True,
|
showlegend=True,
|
||||||
height=800
|
height=800,
|
||||||
|
template='plotly_dark', # Dark theme for better visibility
|
||||||
|
plot_bgcolor='rgba(0,0,0,0)', # Transparent background
|
||||||
|
paper_bgcolor='rgba(0,0,0,0)'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Update axes
|
||||||
|
fig.update_xaxes(showgrid=True, gridwidth=1, gridcolor='rgba(128,128,128,0.2)')
|
||||||
|
fig.update_yaxes(showgrid=True, gridwidth=1, gridcolor='rgba(128,128,128,0.2)')
|
||||||
|
|
||||||
return fig
|
return fig
|
||||||
|
|
||||||
def monte_carlo_page():
|
def monte_carlo_page():
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user