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.