Property Evaluation & Mortgage Modeling Guide

Purpose: Evaluate Tasmania properties for CVTas site selection and model different financing strategies.

Quick Start

1. Browse Properties

# View all properties (ordered by score)
GET /api/properties/properties/

# Filter by region
GET /api/properties/properties/?region=5

# Search by location
GET /api/properties/properties/?search=Huon

# Get property details
GET /api/properties/properties/12/

2. Check Affordability

POST /api/properties/properties/12/check_affordability/
{
  "capital_available": "977000",
  "max_lvr": "55.00",           # 40%, 55%, or 60%
  "has_foreign_ownership": false,
  "interest_rate": "6.45",       # Current rate
  "term_years": 10               # We expect hyperinflation
}

Returns: Full breakdown of upfront costs, loan amounts, and repayments.

3. Compare Properties

POST /api/properties/properties/compare/
{
  "property_ids": [12, 15, 23]
}

Key Concepts

Mortgage Modeling Philosophy

We don't import static loan scenarios. Instead, we calculate mortgages dynamically:

Why? - Flexibility: Model any property with any capital structure - Real-time: Adjust LVR, interest rate, term on the fly - Strategic: Compare conservative (40% LVR) vs aggressive (60% LVR) - Budget integration: Feed repayments into cash flow projections

Example:

from backend.finance.services import PropertyAffordabilityService
from decimal import Decimal

# Check if we can afford a $650k property with $977k capital
result = PropertyAffordabilityService.check_affordability(
    property_price=Decimal('650000'),
    capital_available=Decimal('977000'),
    max_lvr=Decimal('55.00'),
    has_foreign_ownership=False,
    interest_rate=Decimal('6.45'),
    term_years=10
)

print(f"Affordable: {result['affordable']}")
print(f"Monthly payment: ${result['repayments']['monthly']}")
print(f"Capital surplus: ${result['capital_surplus_or_deficit']}")

LVR (Loan-to-Value Ratio) Strategies

Strategy LVR Use Case Trade-off
Conservative 40% Low risk, max cash reserves Higher upfront capital needed
Standard 55% Balanced approach Default for planning
Aggressive 60% Maximize leverage Higher monthly repayments

Foreign Ownership: 60% max LVR, +8% stamp duty surcharge

Why 10-Year Fixed Mortgages?

We expect significant hyperinflation. Locking in today's interest rates for 10 years protects against future rate increases.

Property Data Model

Property Scoring System

Each property evaluated by 2+ evaluators (Wanasai, Pip) across 5 dimensions (1-10 scale): - Location: Regional suitability - Self-sustainability: Food production potential - Cost/value/opportunity: ROI assessment - Robustness: X-risk resilience - Glamor: Aesthetic/inspirational value

Overall Score: Composite 0-41 scale

Regional Analysis

10 Tasmania regions scored on 11 criteria (1-5 scale): - Land cost - Seismic risk - Fire risk - Climate/water - Agriculture viability - Internet connectivity - Renewables potential - Remoteness/access - Defensibility - Talent/airport proximity - Politics/regulation

Integration with Budget System

Linking Properties to Budget

from backend.finance.models import PropertyPurchase
from backend.properties.models import Property

# Create a property purchase linked to evaluated property
purchase = PropertyPurchase.objects.create(
    property_id=12,  # Link to Property from evaluation system
    name="Huon Valley Farm",
    purchase_price=650000,
    has_mortgage=True,
    mortgage_amount=357500,
    mortgage_interest_rate=6.45,
    mortgage_term_years=10,
    status='UNDER_OFFER'
)

Cash Flow Impact

Mortgage repayments automatically feed into: - Monthly expense projections - Monte Carlo budget simulations - Capital reserve planning

API Endpoints Reference

Endpoint Method Purpose
/api/properties/properties/ GET List properties (filtered, sorted)
/api/properties/properties/{id}/ GET Property detail + scores
/api/properties/properties/{id}/check_affordability/ POST Calculate affordability
/api/properties/properties/compare/ POST Side-by-side comparison
/api/properties/regions/ GET List regions with scores
/api/properties/financial-scenarios/ GET Example scenarios (reference)
/api/properties/capital-contributions/ GET Capital timeline

Common Tasks

Find Top Affordable Properties

from backend.properties.models import Property
from backend.finance.services import PropertyAffordabilityService
from decimal import Decimal

capital = Decimal('977000')
affordable = []

for prop in Property.objects.filter(price_aud_high__isnull=False).order_by('-overall_score'):
    result = PropertyAffordabilityService.check_affordability(
        property_price=prop.price_aud_high,
        capital_available=capital,
        max_lvr=Decimal('55.00')
    )
    if result['affordable']:
        affordable.append({
            'property': prop.uuid,
            'score': prop.overall_score,
            'price': prop.price_aud_high,
            'monthly': result['repayments']['monthly']
        })
    if len(affordable) >= 5:
        break

Model Different LVR Scenarios

scenarios = [
    ('Conservative 40%', Decimal('40.00')),
    ('Standard 55%', Decimal('55.00')),
    ('Aggressive 60%', Decimal('60.00'))
]

for name, lvr in scenarios:
    result = PropertyAffordabilityService.check_affordability(
        property_price=Decimal('650000'),
        capital_available=Decimal('977000'),
        max_lvr=lvr
    )
    print(f"{name}:")
    print(f"  Loan: ${result['max_loan_amount']}")
    print(f"  Upfront: ${result['total_upfront_cost']}")
    print(f"  Monthly: ${result['repayments']['monthly']}")

Data Sources

Current Data

  • 56 properties: Manually evaluated from realestate.com.au, Domain
  • 10 regions: Tasmania regional analysis
  • 2 evaluators: Wanasai, Pip

Import Commands

# Import regional scoring
python manage.py import_regions --file data/regions_10_tas_nz.csv

# Import properties (auto-links regions)
python manage.py import_properties --file data/site_property_scoring_tas.csv

# Import capital contributions
python manage.py import_capital_contributions --file data/capital_contributions.csv

Design Principles

  1. No-loss approach: All CSV fields preserved, nullable to handle incomplete data
  2. Dynamic calculations: Don't store what can be computed (mortgage payments)
  3. Flexible modeling: Support any financing scenario via parameters
  4. Budget integration: Property decisions flow into financial planning
  5. Real-time affordability: Check viability instantly with current capital

Future Enhancements

  • [ ] GIS integration (PostGIS) for spatial analysis
  • [ ] Property comparison dashboard UI
  • [ ] Automated property scraping (realestate.com.au API)
  • [ ] Climate risk overlay (fire, flood, sea level)
  • [ ] Drive time calculations (to Hobart/Launceston)
  • [ ] Permaculture suitability scoring per property
  • [ ] Multi-property portfolio optimization

Questions?

See also: - docs/planning/DAY5_PLAN.md - Technical implementation plan - backend/finance/services.py - Mortgage calculator source - backend/properties/models.py - Data model reference