Actuarial cashflow model graph analyser
To upload files, please first save the app
import streamlit as st
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
st.title("Actuarial Cashflow Model Analyzer")
# Sidebar inputs
st.sidebar.header("Model Parameters")
initial_investment = st.sidebar.number_input("Initial Investment", min_value=0, value=100000)
interest_rate = st.sidebar.slider("Annual Interest Rate (%)", 0.0, 20.0, 5.0)
years = st.sidebar.slider("Projection Years", 1, 50, 30)
payment_freq = st.sidebar.selectbox("Payment Frequency", ["Annual", "Semi-Annual", "Quarterly", "Monthly"])
# Calculate payment frequency multiplier
freq_multiplier = {
"Annual": 1,
"Semi-Annual": 2,
"Quarterly": 4,
"Monthly": 12
}[payment_freq]
# Optional cashflow inputs
st.sidebar.header("Additional Cashflows")
regular_contribution = st.sidebar.number_input("Regular Contribution", value=0)
withdrawal_rate = st.sidebar.slider("Annual Withdrawal Rate (%)", 0.0, 20.0, 0.0)
# Calculate time points and cashflows
periods = years * freq_multiplier
time_points = np.arange(0, periods + 1) / freq_multiplier
periodic_rate = (1 + interest_rate/100) ** (1/freq_multiplier) - 1
# Initialize cashflow array
balance = np.zeros(periods + 1)
balance[0] = initial_investment
# Calculate balance over time
for i in range(1, periods + 1):
# Previous balance with interest
balance[i] = balance[i-1] * (1 + periodic_rate)
# Add regular contribution
balance[i] += regular_contribution
# Subtract withdrawals
withdrawal = balance[i] * (withdrawal_rate/100) / freq_multiplier
balance[i] -= withdrawal
# Create main display area
st.header("Cashflow Analysis")
# Display chart
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(time_points, balance, 'b-', label='Account Balance')
ax.fill_between(time_points, 0, balance, alpha=0.2)
ax.set_xlabel('Years')
ax.set_ylabel('Balance')
ax.set_title('Projected Account Balance Over Time')
ax.grid(True)
ax.legend()
st.pyplot(fig)
# Key metrics
final_balance = balance[-1]
total_contributions = initial_investment + regular_contribution * periods
total_interest = final_balance - total_contributions
total_withdrawals = sum(balance * (withdrawal_rate/100) / freq_multiplier)
# Display metrics
col1, col2, col3 = st.columns(3)
with col1:
st.metric("Final Balance", f"${final_balance:,.2f}")
with col2:
st.metric("Total Interest Earned", f"${total_interest:,.2f}")
with col3:
st.metric("Total Withdrawals", f"${total_withdrawals:,.2f}")
# Display detailed data
st.header("Detailed Cashflow Data")
df = pd.DataFrame({
'Year': time_points,
'Balance': balance,
'Interest Earned': balance * periodic_rate,
'Withdrawal': balance * (withdrawal_rate/100) / freq_multiplier
})
st.dataframe(df.round(2))
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?