Skip to Content
GuidesInvestment analytics

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.