Full sync - all projects, memory, configs
This commit is contained in:
110
tools/re-breakeven.py
Normal file
110
tools/re-breakeven.py
Normal file
@ -0,0 +1,110 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Find break-even scenarios for rental property cash flow Day 1"""
|
||||
|
||||
# Fixed assumptions
|
||||
MONTHLY_RENT = 2000
|
||||
VACANCY = 0.05
|
||||
EFFECTIVE_MONTHLY = MONTHLY_RENT * (1 - VACANCY) # $1,900
|
||||
PROPERTY_TAX_RATE = 0.007 # ~$2400 on $345K
|
||||
INSURANCE_RATE = 0.004 # ~$1400 on $345K
|
||||
MAINTENANCE_RATE = 0.006 # ~$2000 on $345K
|
||||
DOWN_PAYMENT_PCT = 0.20
|
||||
|
||||
print("=" * 70)
|
||||
print("BREAK-EVEN ANALYSIS: What price + rate = Day 1 cash flow positive?")
|
||||
print("=" * 70)
|
||||
print(f"\nFixed: Rent $2,000/mo | Vacancy 5% | Effective income: ${EFFECTIVE_MONTHLY:,.0f}/mo")
|
||||
print(f"Down payment: 20% | 30-year fixed\n")
|
||||
|
||||
# Calculate monthly mortgage payment
|
||||
def monthly_payment(principal, annual_rate, years=30):
|
||||
r = annual_rate / 12
|
||||
n = years * 12
|
||||
if r == 0:
|
||||
return principal / n
|
||||
return principal * (r * (1 + r)**n) / ((1 + r)**n - 1)
|
||||
|
||||
print(f"{'Price':>10} {'Rate':>6} {'Down':>10} {'Loan':>10} {'P&I':>8} {'Tax/Ins':>8} {'Maint':>7} {'Total':>8} {'Cash Flow':>10} {'Rent/Price':>10}")
|
||||
print("-" * 100)
|
||||
|
||||
results = []
|
||||
for price in range(200000, 360000, 10000):
|
||||
for rate_bps in range(300, 700, 25):
|
||||
rate = rate_bps / 10000
|
||||
|
||||
down = price * DOWN_PAYMENT_PCT
|
||||
loan = price * (1 - DOWN_PAYMENT_PCT)
|
||||
pi = monthly_payment(loan, rate)
|
||||
|
||||
tax_ins = (price * PROPERTY_TAX_RATE + price * INSURANCE_RATE) / 12
|
||||
maint = (price * MAINTENANCE_RATE) / 12
|
||||
|
||||
total_monthly = pi + tax_ins + maint
|
||||
cash_flow = EFFECTIVE_MONTHLY - total_monthly
|
||||
rent_to_price = (MONTHLY_RENT / price) * 100
|
||||
|
||||
results.append((price, rate, down, loan, pi, tax_ins, maint, total_monthly, cash_flow, rent_to_price))
|
||||
|
||||
# Show scenarios that are cash flow positive or near break-even
|
||||
print("\n📗 CASH FLOW POSITIVE SCENARIOS (Day 1):")
|
||||
print("-" * 100)
|
||||
positive = [r for r in results if r[8] >= 0]
|
||||
for r in sorted(positive, key=lambda x: -x[8])[:20]:
|
||||
price, rate, down, loan, pi, tax_ins, maint, total, cf, rtp = r
|
||||
print(f"${price:>9,} {rate:>5.2%} ${down:>9,} ${loan:>9,} ${pi:>7,.0f} ${tax_ins:>7,.0f} ${maint:>6,.0f} ${total:>7,.0f} ${cf:>+8,.0f} {rtp:.2f}%")
|
||||
|
||||
print(f"\n\n📕 YOUR CURRENT DEAL ($345K @ 6.25%):")
|
||||
price, rate = 345000, 0.0625
|
||||
down = price * DOWN_PAYMENT_PCT
|
||||
loan = price * (1 - DOWN_PAYMENT_PCT)
|
||||
pi = monthly_payment(loan, rate)
|
||||
tax_ins = (price * PROPERTY_TAX_RATE + price * INSURANCE_RATE) / 12
|
||||
maint = (price * MAINTENANCE_RATE) / 12
|
||||
total = pi + tax_ins + maint
|
||||
cf = EFFECTIVE_MONTHLY - total
|
||||
print(f"${price:>9,} {rate:>5.2%} ${down:>9,} ${loan:>9,} ${pi:>7,.0f} ${tax_ins:>7,.0f} ${maint:>6,.0f} ${total:>7,.0f} ${cf:>+8,.0f} {(MONTHLY_RENT/price)*100:.2f}%")
|
||||
|
||||
# Find exact break-even rate at different price points
|
||||
print(f"\n\n📊 BREAK-EVEN INTEREST RATE BY PRICE POINT:")
|
||||
print("-" * 50)
|
||||
for price in [200000, 220000, 240000, 260000, 280000, 300000, 320000, 345000]:
|
||||
for rate_bps in range(100, 1000, 1):
|
||||
rate = rate_bps / 10000
|
||||
loan = price * (1 - DOWN_PAYMENT_PCT)
|
||||
pi = monthly_payment(loan, rate)
|
||||
tax_ins = (price * PROPERTY_TAX_RATE + price * INSURANCE_RATE) / 12
|
||||
maint = (price * MAINTENANCE_RATE) / 12
|
||||
total = pi + tax_ins + maint
|
||||
cf = EFFECTIVE_MONTHLY - total
|
||||
if cf <= 0:
|
||||
# Previous rate was break-even
|
||||
be_rate = (rate_bps - 1) / 10000
|
||||
print(f" ${price:>9,} → break-even at {be_rate:.2%} or lower")
|
||||
break
|
||||
else:
|
||||
print(f" ${price:>9,} → cash flows positive even at 10%+")
|
||||
|
||||
# Find exact break-even price at different rates
|
||||
print(f"\n\n📊 BREAK-EVEN PRICE BY INTEREST RATE:")
|
||||
print("-" * 50)
|
||||
for rate_pct in [3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.25]:
|
||||
rate = rate_pct / 100
|
||||
for price in range(400000, 100000, -1000):
|
||||
loan = price * (1 - DOWN_PAYMENT_PCT)
|
||||
pi = monthly_payment(loan, rate)
|
||||
tax_ins = (price * PROPERTY_TAX_RATE + price * INSURANCE_RATE) / 12
|
||||
maint = (price * MAINTENANCE_RATE) / 12
|
||||
total = pi + tax_ins + maint
|
||||
cf = EFFECTIVE_MONTHLY - total
|
||||
if cf >= 0:
|
||||
print(f" {rate_pct:.2f}% → max price ${price:>9,} (rent/price: {(MONTHLY_RENT/price)*100:.2f}%)")
|
||||
break
|
||||
else:
|
||||
print(f" {rate_pct:.2f}% → no viable price found")
|
||||
|
||||
# The 1% rule check
|
||||
print(f"\n\n📊 1% RULE CHECK:")
|
||||
print(f" $2,000 rent × 100 = $200,000 max purchase price")
|
||||
print(f" Your deal: $345,000 = {(2000/345000)*100:.2f}% (needs to be ≥1.0%)")
|
||||
print(f" To hit 1% at $345K, rent needs to be: ${345000*0.01:,.0f}/mo")
|
||||
print(f" To hit 0.8% at $345K, rent needs to be: ${345000*0.008:,.0f}/mo")
|
||||
Reference in New Issue
Block a user