# When the LPR rate comes, should we change our mortgage?

Keywords: Pycharm

According to the announcement of the people's Bank of China, the conversion of pricing benchmark for stock floating rate loans was started as scheduled on March 1, 2020. According to the regulations, the lender of stock floating rate housing loan can choose fixed interest rate or floating interest rate of loan market quotation rate (LPR) when signing the contract again. Pricing benchmark can only be converted once, and cannot be converted again after conversion. Note that the meaning here should be that the bp value of LPR can only be changed once, not the value of LPR.

So, how do you choose to buy a house or have a mortgage? In response, experts said that the regulatory authorities clearly need to continue to promote LPR reform and guide the overall market interest rate and loan interest rate downward. LPR may be a better choice. In addition, the change of anchor will promote the "two tracks and one track" of interest rate marketization, first incremental and then stock gradual reform, effectively guarantee the smooth conversion of loan contract benchmark, and open a new space for the real economy to reduce costs.

But are experts reliable? I think most people have never succeeded in collecting socialist wool. So, we write our own program to determine whether we should replace LPR or not. Here is the source code. Brothers and sisters run for a while, and they have a bottom in mind.

```# -*- coding: utf-8 -*-
# @Time    : 20/2/27 11:14
# @Author  : Jay Lam
# @File    : LPR_Calculator.py
# @Software: PyCharm

import math
import random

import numpy as np

# LPR computing
def LPRCalculator():
currentLPR = round(float(input("Enter when changing the contract LPR interest rate(%): ")), 2)
currentInterest = round(float(input("Enter the fixed interest rate when changing the contract(%): ")), 2)
totalMonth = int(input("Enter total months of loan:"))
residueMonth = int(input("Enter remaining loan months:"))
paymentPlan = int(input("Enter the repayment method. Enter 0 for equal principal and 1 for equal principal and interest:"))
rangeLimit = int(input("Enter whether to restrict the future LPR Interest rate forecast. Unlimited 0, reduced input-1，Add input 1:"))
totalLoan = round(float(input("Enter total loan amount(element): ")), 2)

bp = currentInterest - currentLPR  # Base point calculation
changeTimes = math.floor((totalMonth - residueMonth) / 12)  # Once a year allowed to change interest rate

if paymentPlan == 0:
oldTotalPayment = averageCapital(totalLoan, 1, currentInterest, totalMonth)
oldResidueAmount = oldTotalPayment - averageCapital(totalLoan, 1, currentInterest, totalMonth)[
0:(totalMonth - residueMonth)].sum()
print(oldResidueAmount)
print("LPR The difference between the total expenditure and the original plan is:",
round(LPR(changeTimes, bp, rangeLimit, totalLoan, residueMonth, currentLPR) - oldResidueAmount, 2),
"element")

elif paymentPlan == 1:
oldTotalPayment = averageCapitalPlusInterest(totalLoan, 1, currentInterest, totalMonth)
oldResidueAmount = averageCapitalPlusInterest(totalLoan, 1, currentInterest, totalMonth)*residueMonth
print("LPR The difference between the total expenditure and the original plan is:",
round(LPR(changeTimes, bp, rangeLimit, totalLoan, residueMonth, currentLPR) - oldResidueAmount, 2),
"element")

# Random prediction LPR
def LPR(changeTimes, bp, rangeLimit, totalLoan, resMonth, currentLPR):
plan0 = []
plan1 = []
if rangeLimit == 0:
for i in range(1, changeTimes):
actualRatio = random.random() + bp
currentYearPayment0 = averageCapital(totalLoan, 1, actualRatio, resMonth)[0:12].sum()
currentYearPayment1 = averageCapitalPlusInterest(totalLoan, 1, actualRatio, resMonth) * 12
# The equivalent principal and interest method is directly multiplied by 12 every month to obtain the annual expenditure value
plan0.append(currentYearPayment0)
plan1.append(currentYearPayment1)
actualTotalPayment0 = np.array(plan0).sum()
actualTotalPayment1 = np.array(plan1).sum()
elif rangeLimit == 1:
actualRatio = randAscending(changeTimes, currentLPR + 0.15, currentLPR - 0.15)  # The future change range shall not exceed LPR ± 0.15 at the time of signing the contract
for i in range(0, len(actualRatio)):
currentYearPayment0 = averageCapital(totalLoan, 1, actualRatio[i], resMonth)[0:12].sum()
currentYearPayment1 = averageCapitalPlusInterest(totalLoan, 1, actualRatio[i], resMonth) * 12
plan0.append(currentYearPayment0)
plan1.append(currentYearPayment1)
actualTotalPayment0 = np.array(plan0).sum()
actualTotalPayment1 = np.array(plan1).sum()
elif rangeLimit == -1:
actualRatio = randDecending(changeTimes, currentLPR + 0.15, currentLPR - 0.15)
for i in range(0, len(actualRatio)):
currentYearPayment0 = averageCapital(totalLoan, 1, actualRatio[i], resMonth)[0:12].sum()
currentYearPayment1 = averageCapitalPlusInterest(totalLoan, 1, actualRatio[i], resMonth) * 12
plan0.append(currentYearPayment0)
plan1.append(currentYearPayment1)
actualTotalPayment0 = np.array(plan0).sum()
actualTotalPayment1 = np.array(plan1).sum()
return round(actualTotalPayment0, 2), round(actualTotalPayment1, 2)

# Generating ascending random number sequence
def randAscending(changetimes, uplimit, lowlimit):
se = []
for _ in range(changetimes):
se.append(round(random.uniform(lowlimit, uplimit), 4))
se.sort(reverse=False)
return se

# Generating a sequence of descending random numbers
def randDecending(changetimes, uplimit, lowlimit):
se = []
for _ in range(changetimes):
se.append(round(random.uniform(lowlimit, uplimit), 4))
se.sort(reverse=True)
return se

# Equal principal and interest method
def averageCapitalPlusInterest(principal, principalRatio, anualInterestRate, month):
# Principal represents the total house price, principal ratio represents the percentage of house loan, annual interest rate represents the annual interest rate of house loan, and month represents the month of house loan
mortgage = np.around(principal * principalRatio, 2)  # Calculate the amount of loan required
monthlyPayment = np.around(mortgage * averageCapitalPlusInterestRate(month, monthlyInterestRate(anualInterestRate)),
2)  # Calculate the monthly repayment amount
totalInt = np.around(totalInterest(mortgage, monthlyPayment, month), 2)
mortgageIntoTenThousand = np.around(mortgage / 10000, 2)  # Convert the total amount of loan into ten thousand yuan
print("loan:", mortgageIntoTenThousand, "Ten thousand yuan")  # Output result
print("Annual interest rate:", anualInterestRate, "%")
print("Mortgage months:", month, "month")
print("Monthly repayment:", monthlyPayment, "element")  # Output result
print("Interest payable:", totalInt, "element")
totalPayment = np.around(monthlyPayment * month, 2)  # Total repayment

# Calculation of monthly interest rate with equal principal and interest method
def monthlyInterestRate(anualInterestRate):
return (anualInterestRate / 12) / 100  # Annual interest rate /12

# Calculation of proportion coefficient with equal principal and interest method
def averageCapitalPlusInterestRate(month, monthlyInterestRate):
R = monthlyInterestRate
N = month
I = R * math.pow(1 + R, N) / (math.pow(1 + R, N) - 1)
return I

def totalInterest(mortgage, monthlyPayment, month):
return monthlyPayment * month - mortgage

# Equal principal method
def averageCapital(principal, principalRatio, anualInterestRate, month):
# Principal represents the total house price, principal ratio represents the percentage of house loan, annual interest rate represents the annual interest rate of house loan, and month represents the month of house loan
monthlyPayment = np.zeros(month)  # Initialize monthly repayment amount
cont = 0
mortgage = np.around(principal * principalRatio, 2)  # Calculate the amount of loan required
mortgageIntoTenThousand = np.around(mortgage / 10000, 2)  # Convert the total amount of loan into ten thousand yuan
print("loan:", mortgageIntoTenThousand, "Ten thousand yuan")  # Output result
print("Annual interest rate:", anualInterestRate, "%")
print("Mortgage months:", month, "month")
for i in range(0, month):
monthlyPayment[i] = np.around((mortgage / month) + (mortgage * monthlyInterestRate2(anualInterestRate)) - (
i * (mortgage / month) * monthlyInterestRate(anualInterestRate)), 2)
# Monthly repayment amount
cont += np.around(monthlyPayment[i], 2)

print("The first", i + 1, "Monthly repayment:", monthlyPayment[i], "element")  # Output result
totalPayment = np.around(sum(monthlyPayment), 2)  # Calculation of total repayment
print("Total repayment:", totalPayment, "element")

# Calculating monthly interest rate with equal principal method
def monthlyInterestRate2(anualInterestRate):
return (anualInterestRate / 12) / 100  # Annual interest rate /12

if __name__ == "__main__":
#print(LPR(25, 0.833, -1, 2730000, 300, 4.9))
#print(averageCapitalPlusInterest(2000000,1,4.3,360))
LPRCalculator()
```  Published 11 original articles, won praise and 10000 visitors+

Posted by wilburforce on Wed, 04 Mar 2020 03:34:06 -0800