Skip to main content

Investment Analytics Guide

Complete guide to analyzing real estate investments with PropAPIS data.

Key Investment Metrics

Cap Rate (Capitalization Rate)

Measures annual return on investment:

cap_rate = (Net Operating Income / Property Price) * 100

# Example
annual_rent = 24000
operating_expenses = annual_rent * 0.30 # 30% rule
noi = annual_rent - operating_expenses
property_price = 300000

cap_rate = (noi / property_price) * 100 # 5.6%

Cash-on-Cash Return

Measures return on actual cash invested:

annual_cash_flow = noi - annual_debt_service
cash_invested = down_payment + closing_costs

cash_on_cash = (annual_cash_flow / cash_invested) * 100

Gross Rent Multiplier (GRM)

Quick valuation metric:

grm = property_price / annual_rent

# Lower GRM = better deal
# Typical GRM: 8-15 depending on market

Complete Analysis Example

from propapis import PropAPIS

api = PropAPIS(api_key='your_api_key')

def analyze_investment(address):
# Get property data
prop = api.platforms.zillow.get_property(address)

# Investment parameters
purchase_price = prop.price
annual_rent = prop.rent_zestimate * 12

# Financing (80% LTV, 6.5% interest, 30-year)
down_payment_pct = 0.20
interest_rate = 0.065
loan_term_years = 30

down_payment = purchase_price * down_payment_pct
loan_amount = purchase_price - down_payment

# Calculate monthly payment
monthly_rate = interest_rate / 12
n_payments = loan_term_years * 12
monthly_payment = loan_amount * (monthly_rate * (1 + monthly_rate)**n_payments) / ((1 + monthly_rate)**n_payments - 1)

annual_debt_service = monthly_payment * 12

# Operating expenses (30% rule)
operating_expenses = annual_rent * 0.30

# Calculate metrics
noi = annual_rent - operating_expenses
cap_rate = (noi / purchase_price) * 100
annual_cash_flow = noi - annual_debt_service
cash_on_cash = (annual_cash_flow / down_payment) * 100
grm = purchase_price / annual_rent

# Print analysis
print(f"Investment Analysis: {prop.address}")
print(f"\nProperty Details:")
print(f" Purchase Price: ${purchase_price:,}")
print(f" Annual Rent: ${annual_rent:,}")
print(f" Bedrooms: {prop.bedrooms} | Sqft: {prop.sqft:,}")

print(f"\nFinancing:")
print(f" Down Payment (20%): ${down_payment:,}")
print(f" Loan Amount: ${loan_amount:,}")
print(f" Monthly Payment: ${monthly_payment:,.0f}")

print(f"\nIncome & Expenses:")
print(f" Annual Rent: ${annual_rent:,}")
print(f" Operating Expenses (30%): ${operating_expenses:,.0f}")
print(f" Net Operating Income: ${noi:,.0f}")
print(f" Annual Debt Service: ${annual_debt_service:,.0f}")
print(f" Annual Cash Flow: ${annual_cash_flow:,.0f}")

print(f"\nInvestment Metrics:")
print(f" Cap Rate: {cap_rate:.2f}%")
print(f" Cash-on-Cash Return: {cash_on_cash:.2f}%")
print(f" GRM: {grm:.1f}")
print(f" Monthly Cash Flow: ${annual_cash_flow/12:,.0f}")

# Investment recommendation
if cap_rate >= 7 and cash_on_cash >= 8:
print(f"\n✓ STRONG INVESTMENT")
elif cap_rate >= 5 and cash_on_cash >= 5:
print(f"\n○ MODERATE INVESTMENT")
else:
print(f"\n✗ WEAK INVESTMENT")

return {
'cap_rate': cap_rate,
'cash_on_cash': cash_on_cash,
'monthly_cash_flow': annual_cash_flow / 12
}

# Analyze property
metrics = analyze_investment('123 Main St, Austin, TX')

Market Comparison

Compare multiple markets:

def compare_markets(markets):
results = []

for market in markets:
# Get market data
data = api.platforms.zillow.get_market_trends(location=market)

# Get sample properties
listings = api.platforms.zillow.search_listings(
location=market,
property_type='Single Family',
max_results=50
)

# Calculate average cap rate
cap_rates = []
for prop in listings:
if prop.rent_zestimate and prop.price:
annual_rent = prop.rent_zestimate * 12
noi = annual_rent * 0.70 # After expenses
cap_rate = (noi / prop.price) * 100
cap_rates.append(cap_rate)

avg_cap_rate = sum(cap_rates) / len(cap_rates) if cap_rates else 0

results.append({
'market': market,
'median_price': data.median_price,
'growth': data.yoy_change,
'avg_cap_rate': avg_cap_rate
})

# Rank by investment score
for r in results:
r['score'] = r['avg_cap_rate'] + (r['growth'] / 2)

results.sort(key=lambda x: x['score'], reverse=True)

print("Market Investment Rankings:")
for i, r in enumerate(results, 1):
print(f"{i}. {r['market']}")
print(f" Cap Rate: {r['avg_cap_rate']:.2f}% | Growth: {r['growth']:+.1f}%")

return results

Finding Undervalued Properties

Screen for below-market deals:

def find_undervalued_properties(market, discount=0.15):
# Search active listings
listings = api.platforms.zillow.search_listings(
location=market,
status='active',
max_results=1000
)

undervalued = []

for prop in listings:
# Compare to Zestimate
if prop.zestimate and prop.price < prop.zestimate * (1 - discount):
discount_pct = ((prop.zestimate - prop.price) / prop.zestimate) * 100

undervalued.append({
'address': prop.address,
'price': prop.price,
'zestimate': prop.zestimate,
'discount': discount_pct
})

# Sort by discount
undervalued.sort(key=lambda x: x['discount'], reverse=True)

print(f"Undervalued Properties in {market}:")
for prop in undervalued[:10]:
print(f"{prop['address']}")
print(f" Price: ${prop['price']:,} | Est: ${prop['zestimate']:,}")
print(f" Discount: {prop['discount']:.1f}%")

return undervalued

Quick Start

from propapis import PropAPIS

api = PropAPIS(api_key='your_api_key')

# Get property for analysis
prop = api.platforms.zillow.get_property('123 Main St, Austin, TX')

# Quick metrics
cap_rate = (prop.rent_zestimate * 12 * 0.7 / prop.price) * 100
print(f"Quick Cap Rate: {cap_rate:.2f}%")

For complete API documentation, see our API Reference.