Actuarial cashflow model graph analyser
Drop files here
or click to upload
import streamlit as st
import pandas as pd
import numpy as np
import plotly.graph_objects as go
from datetime import datetime, timedelta
st.title("Actuarial Cashflow Model Analyzer")
# Sidebar inputs
st.sidebar.header("Model Parameters")
# Basic parameters
initial_investment = st.sidebar.number_input("Initial Investment", min_value=0, value=100000)
years = st.sidebar.slider("Projection Years", min_value=1, max_value=50, value=30)
interest_rate = st.sidebar.slider("Annual Interest Rate (%)", min_value=0.0, max_value=15.0, value=5.0) / 100
# Additional parameters
mortality_rate = st.sidebar.slider("Annual Mortality Rate (%)", min_value=0.0, max_value=5.0, value=1.0) / 100
expense_ratio = st.sidebar.slider("Annual Expense Ratio (%)", min_value=0.0, max_value=3.0, value=0.5) / 100
premium_payment = st.sidebar.number_input("Annual Premium Payment", min_value=0, value=10000)
# Calculate cashflows
def calculate_cashflows(initial_investment, years, interest_rate, mortality_rate, expense_ratio, premium_payment):
timeline = list(range(years + 1))
fund_value = [initial_investment]
mortality_outflow = []
expense_outflow = []
premium_inflow = [initial_investment]
net_cashflow = [initial_investment]
for year in range(1, years + 1):
# Previous year's fund value
prev_fund = fund_value[-1]
# Calculate flows
mortality = prev_fund * mortality_rate
expenses = prev_fund * expense_ratio
investment_return = prev_fund * interest_rate
# Calculate this year's fund value
current_fund = (prev_fund
+ premium_payment
+ investment_return
- mortality
- expenses)
# Store values
fund_value.append(current_fund)
mortality_outflow.append(mortality)
expense_outflow.append(expenses)
premium_inflow.append(premium_payment)
net_cashflow.append(premium_payment - mortality - expenses)
return {
'timeline': timeline,
'fund_value': fund_value,
'mortality_outflow': [0] + mortality_outflow,
'expense_outflow': [0] + expense_outflow,
'premium_inflow': premium_inflow,
'net_cashflow': net_cashflow
}
# Calculate results
results = calculate_cashflows(
initial_investment,
years,
interest_rate,
mortality_rate,
expense_ratio,
premium_payment
)
# Create plots
st.header("Fund Value Projection")
fig_fund = go.Figure()
fig_fund.add_trace(go.Scatter(
x=results['timeline'],
y=results['fund_value'],
mode='lines',
name='Fund Value'
))
fig_fund.update_layout(
title='Fund Value Over Time',
xaxis_title='Year',
yaxis_title='Fund Value',
hovermode='x'
)
st.plotly_chart(fig_fund)
st.header("Cashflow Analysis")
fig_cashflow = go.Figure()
fig_cashflow.add_trace(go.Bar(
x=results['timeline'],
y=results['premium_inflow'],
name='Premium Inflow',
marker_color='green'
))
fig_cashflow.add_trace(go.Bar(
x=results['timeline'],
y=[-x for x in results['mortality_outflow']],
name='Mortality Outflow',
marker_color='red'
))
fig_cashflow.add_trace(go.Bar(
x=results['timeline'],
y=[-x for x in results['expense_outflow']],
name='Expense Outflow',
marker_color='orange'
))
fig_cashflow.add_trace(go.Scatter(
x=results['timeline'],
y=results['net_cashflow'],
name='Net Cashflow',
line=dict(color='blue'),
mode='lines'
))
fig_cashflow.update_layout(
title='Annual Cashflow Components',
xaxis_title='Year',
yaxis_title='Amount',
barmode='relative',
hovermode='x'
)
st.plotly_chart(fig_cashflow)
# Summary statistics
st.header("Summary Statistics")
col1, col2, col3 = st.columns(3)
with col1:
st.metric(
"Final Fund Value",
f"${results['fund_value'][-1]:,.2f}"
)
with col2:
total_premiums = sum(results['premium_inflow'])
st.metric(
"Total Premiums Paid",
f"${total_premiums:,.2f}"
)
with col3:
total_return = results['fund_value'][-1] - total_premiums
st.metric(
"Total Return",
f"${total_return:,.2f}",
f"{(total_return/total_premiums)*100:.1f}%"
)
# Display data table
st.header("Detailed Projections")
df = pd.DataFrame({
'Year': results['timeline'],
'Fund Value': results['fund_value'],
'Premium Inflow': results['premium_inflow'],
'Mortality Outflow': results['mortality_outflow'],
'Expense Outflow': results['expense_outflow'],
'Net Cashflow': results['net_cashflow']
})
st.dataframe(df.style.format("${:,.2f}"))
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?