Внедрение калькулятора ренты против покупки New York Times
Я заинтересован в том, чтобы воспроизвести калькулятор ренты против покупки New York Times. Однако я изо всех сил пытаюсь воспроизвести рассчитанные затраты даже в самых простых случаях.
В приведенном ниже примере я пытаюсь воспроизвести "Периодические расходы" в случае "Купить" для настроек по умолчанию, с которых я изменил налог на имущество на ноль, а также для всех других ежемесячных расходов (т. Е. На обслуживание, страхование домовладельца). и ежемесячные коммунальные платежи):
import attr
@attr.s
class RentVsBuyCalculator(object):
# Home Price
home_price = attr.ib(default=250000)
# How Long Do You Plan to Stay?
stay_years = attr.ib(default=9)
# What Are Your Mortgage Details?
mortgage_rate = attr.ib(default=0.0367)
down_payment = attr.ib(default=0.20)
mortgage_length = attr.ib(default=30)
# What does the Future Hold?
home_price_growth_rate = attr.ib(default=0.03)
rent_growth_rate = attr.ib(default=0.025)
investment_return_rate = attr.ib(default=0.04)
inflation_rate = attr.ib(default=0.02)
# Taxes
property_tax_rate = attr.ib(default=0.0135)
marginal_tax_rate = attr.ib(default=0.20)
# Closing Costs
closing_costs_buying = attr.ib(default=0.04)
closing_costs_selling = attr.ib(default=0.06)
# Maintenance and Fees
maintenance = attr.ib(default=0.01)
homeowners_insurance = attr.ib(default=0.0046)
monthly_utilities = attr.ib(default=100)
# Additional Renting Costs
security_deposit = attr.ib(default=1) # Number of months security deposit
brokers_fee = attr.ib(default=0) # Broker's fee
renters_insurance = attr.ib(default=0.0132)
@property
def annuity(self):
'''Yearly payment for the mortgage'''
PV = (1 - self.down_payment) * self.home_price # Present value of the mortgage
r = self.mortgage_rate # Rate per year
n = self.mortgage_length # Number of years
return r * PV / (1 - (1 + r)**(-n))
@staticmethod
def future_value(P, i, n):
return P * ((1 + i)**n - 1)/i
@property
def recurring_costs_buy(self):
# Total property tax over years to stay
property_tax = self.property_tax_rate * \
self.future_value(P=self.home_price, i=self.home_price_growth_rate, n=self.stay_years) * \
(1 - self.marginal_tax_rate)
maintenance_and_fees = self.home_price * (self.maintenance + self.homeowners_insurance) + \
self.monthly_utilities * 12
return property_tax + (maintenance_and_fees + self.annuity) * self.stay_years
calc = RentVsBuyCalculator(property_tax_rate=0,
marginal_tax_rate=0,
maintenance=0,
homeowners_insurance=0,
monthly_utilities=0)
print(calc.annuity)
print(calc.recurring_costs_buy)
Если я запускаю этот скрипт, он печатает
11107.107572459248
99963.96815213324
Первый представляет собой аннуитет, подлежащий выплате в конце каждого года (хотя на практике он распределяется в ежемесячных платежах, но указанная процентная ставка является номинальной процентной ставкой). Я проверил это с помощью калькулятора на http://www.moneychimp.com/calculator/annuity_calculator.htm:
Последняя цифра, 99 964 долл. США, - это сумма, которую я ожидал бы для "Периодических расходов" для сценария "Покупка". Однако, если я запускаю калькулятор, я получаю немного меньшее число, а именно $99,055:
Как калькулятор New York Times приходит на этот номер? Есть что-то, что я пропускаю?