93 lines
4.2 KiB
Python
93 lines
4.2 KiB
Python
|
import matplotlib.pyplot as plt
|
||
|
|
||
|
periods_per_year = 12
|
||
|
loan_duration_years = 30
|
||
|
nominal_annual_interest_rate = 6.6 / 100
|
||
|
loan_principal = 600000
|
||
|
deposit = 32500
|
||
|
additional_upront_costs = 11356
|
||
|
annual_appreciation_rate = 5 / 100
|
||
|
initial_annual_rental_income = 14400
|
||
|
rental_income_annual_growth_rate = 6 / 100
|
||
|
baseline_annual_yield = 9 / 100 # ETF
|
||
|
rental_cost_annual_growth_rate = 6 / 100 # If I don't buy a PPOR
|
||
|
initial_annual_rental_cost = 20400 # Living in carlton
|
||
|
|
||
|
initial_property_value = loan_principal + deposit
|
||
|
period_interest_rate = nominal_annual_interest_rate / periods_per_year
|
||
|
total_loan_periods = periods_per_year * loan_duration_years
|
||
|
period_appreciation_rate = (1 + annual_appreciation_rate) ** (1 / periods_per_year) - 1
|
||
|
period_rental_income_growth_rate = (1 + rental_income_annual_growth_rate) ** (1 / periods_per_year) - 1
|
||
|
initial_period_rental_income = initial_annual_rental_income / periods_per_year
|
||
|
baseline_period_yield = (1 + baseline_annual_yield) ** (1 / periods_per_year) - 1 # ETF
|
||
|
period_rental_cost_growth_rate = (1 + rental_cost_annual_growth_rate) ** (1 / periods_per_year) - 1 # Renting
|
||
|
initial_period_rental_cost = initial_annual_rental_cost / periods_per_year
|
||
|
|
||
|
period_payment = (loan_principal * (period_interest_rate * (1 + period_interest_rate) ** total_loan_periods) /
|
||
|
((1 + period_interest_rate) ** total_loan_periods - 1))
|
||
|
|
||
|
property_value = initial_property_value
|
||
|
property_values = [property_value]
|
||
|
remaining_loan = loan_principal
|
||
|
remaining_loans = [remaining_loan]
|
||
|
equity = deposit
|
||
|
equities = [equity]
|
||
|
total_payments = 0
|
||
|
total_payments_list = [total_payments]
|
||
|
total_interest_paid = 0
|
||
|
total_interest_paid_list = [total_interest_paid]
|
||
|
total_rental_income = 0
|
||
|
total_rental_income_list = [total_rental_income]
|
||
|
rental_income_period = initial_period_rental_income
|
||
|
net_worth = deposit - additional_upront_costs
|
||
|
net_worths = [net_worth]
|
||
|
total_baseline_value = deposit + additional_upront_costs # ETF initial investment of all property upfront costs
|
||
|
total_baseline_values = [total_baseline_value]
|
||
|
rental_cost_period = initial_period_rental_cost # renting
|
||
|
for period in range(total_loan_periods):
|
||
|
total_payments += period_payment
|
||
|
interest_paid_period = remaining_loan * period_interest_rate
|
||
|
total_interest_paid += interest_paid_period
|
||
|
principal_paid_period = period_payment - interest_paid_period
|
||
|
remaining_loan -= principal_paid_period
|
||
|
|
||
|
appreciation_period = property_value * (1 + period_appreciation_rate) - property_value
|
||
|
property_value += appreciation_period
|
||
|
equity += principal_paid_period + appreciation_period
|
||
|
|
||
|
rental_income_period *= 1 + period_rental_income_growth_rate
|
||
|
total_rental_income += rental_income_period
|
||
|
|
||
|
cashflow_period = rental_income_period - interest_paid_period
|
||
|
net_worth += cashflow_period + appreciation_period + principal_paid_period
|
||
|
|
||
|
rental_cost_period *= 1 + period_rental_cost_growth_rate # My rent keeps increasing :((
|
||
|
total_baseline_value = total_baseline_value * (1 + baseline_period_yield) + max(period_payment - rental_cost_period, 0) # ETF grows from compounding and deposit. Assuming that deposit is equal to what would otherwise be building equity in a property - expense of rent
|
||
|
|
||
|
property_values.append(property_value)
|
||
|
remaining_loans.append(remaining_loan)
|
||
|
equities.append(equity)
|
||
|
total_payments_list.append(total_payments)
|
||
|
total_interest_paid_list.append(total_interest_paid)
|
||
|
total_rental_income_list.append(total_rental_income)
|
||
|
net_worths.append(net_worth)
|
||
|
total_baseline_values.append(total_baseline_value)
|
||
|
|
||
|
plt.figure(figsize=(14, 8))
|
||
|
plt.plot(property_values, label='Property Value', color='blue')
|
||
|
plt.plot(remaining_loans, label='Remaining Loan', color='red')
|
||
|
plt.plot(equities, label='Equity', color='green')
|
||
|
plt.plot(net_worths, label='Net Worth', color='purple')
|
||
|
plt.plot(total_payments_list, label='Total Payments', color='orange')
|
||
|
plt.plot(total_interest_paid_list, label='Total Interest Paid', color='brown')
|
||
|
plt.plot(total_rental_income_list, label='Total Rental Income', color='teal')
|
||
|
plt.plot(total_baseline_values, label='Total Baseline Value (ETF)', color='black')
|
||
|
|
||
|
plt.title('Financial Metrics and ETF Comparison over the Loan Term')
|
||
|
plt.xlabel('Months')
|
||
|
plt.ylabel('Dollar Amount')
|
||
|
plt.legend()
|
||
|
plt.grid(True)
|
||
|
plt.show()
|
||
|
|