Basic-Financial-Literacy / src /streamlit_app.py
eagle0504's picture
Update src/streamlit_app.py
ce81efb verified
raw
history blame
2.13 kB
import streamlit as st
import numpy as np
import plotly.graph_objects as go
# Title
st.title("Financial Modeling App")
# Tab setup
tabs = st.tabs(["Time Value of Money", "Consistent Cash Flow Investment", "Monte Carlo Simulation"])
# --- Time Value of Money ---
with tabs[0]:
st.header("Time Value of Money")
a = st.number_input("Base Amount (a)", min_value=0.0, value=1000.0)
r = st.number_input("Annual Return Rate (r)", min_value=0.0, value=0.05)
T = st.number_input("Number of Years (T)", min_value=0, value=10)
future_value = a * ((1 + r) ** T)
st.write(f"Future Value = {a} * (1 + {r})^{T} = **{future_value:,.2f}**")
# --- Consistent Cash Flow Investment ---
with tabs[1]:
st.header("Consistent Cash Flow Investment")
a_cf = st.number_input("Annual Cash Flow (a)", min_value=0.0, value=1000.0)
r_cf = st.number_input("Annual Return Rate (r)", min_value=0.0, value=0.05)
T_cf = st.number_input("Number of Years (T)", min_value=0, value=10)
if r_cf > 0:
fv_cf = a_cf * (((1 + r_cf) ** T_cf - 1) / r_cf)
else:
fv_cf = a_cf * T_cf
st.write(f"Future Value of Cash Flows = **{fv_cf:,.2f}**")
# --- Monte Carlo Simulation ---
with tabs[2]:
st.header("Monte Carlo Simulation")
mean_return = st.number_input("Mean Annual Return", value=0.07)
std_dev = st.number_input("Standard Deviation", value=0.15)
years = st.slider("Number of Years", 1, 100, 30)
simulations = 50
# Simulate paths
np.random.seed(42)
results = np.zeros((simulations, years))
for i in range(simulations):
returns = np.random.normal(loc=mean_return, scale=std_dev, size=years)
results[i] = np.cumprod(1 + returns)
# Plot
fig = go.Figure()
for i in range(simulations):
fig.add_trace(go.Scatter(y=results[i], mode='lines', name=f'Sim {i+1}', line=dict(width=1)))
fig.update_layout(title="Monte Carlo Simulations of Portfolio Growth",
xaxis_title="Years",
yaxis_title="Portfolio Value (normalized)",
showlegend=False)
st.plotly_chart(fig)