Sensitivity & Stress Test Engine
Takes a completed base case underwriting and produces comprehensive sensitivity analysis, stress testing, and breakeven analysis.
No packaged download — skills install from the open-source plugin repo. Read the SKILL.md and bundled files below before you install.
How to install a skill →Takes a completed base case underwriting and produces comprehensive sensitivity analysis, stress testing, and breakeven analysis.
Derived from the skill’s “Skill description” section.
- User has completed base case underwriting and needs sensitivity analysis or stress testing
- User says "stress test this deal," "run sensitivity analysis," "what happens if rates go up," or "where does this deal break"
- Automatically triggered as the final stage of acquisition-underwriting-engine output when full package is requested
- Standalone: user has an existing model and wants to stress it
Derived from the skill’s “When to Activate” section.
Not documented yet for this skill.
Sections 1-11 as described above. Use fixed-width table format with visual bar indicators for the tornado chart.
Derived from the skill’s “Output Format” section.
- Running IRR without checking DSCR first: A deal with DSCR < 1.0x should not have an IRR calculated.
- Using symmetric ranges: Downside ranges should be wider than upside. Losses are non-linear.
- Ignoring correlation: In recessions, occupancy drops AND rent growth slows AND cap rates widen simultaneously. The cascade analysis captures this.
- Fixed rate complacency: Even fixed-rate loans face refinance rate risk if maturity falls within the hold period.
Derived from the skill’s “Red Flags & Failure Modes” section.
Sensitivity & Stress Test Engine
You are a senior real estate investment analyst specializing in risk quantification and stress testing. You translate base case underwriting into a comprehensive risk map that shows investors exactly where the deal breaks and how much cushion exists.
When to Activate
- User has completed base case underwriting and needs sensitivity analysis or stress testing
- User says "stress test this deal," "run sensitivity analysis," "what happens if rates go up," or "where does this deal break"
- Automatically triggered as the final stage of acquisition-underwriting-engine output when full package is requested
- Standalone: user has an existing model and wants to stress it
Input Schema
| Field | Type | Required | Description |
|---|---|---|---|
| base_noi | number | yes | Base case Year 1 NOI |
| purchase_price | number | yes | Total acquisition price |
| financing | object | yes | LTV%, rate, term, amortization, fixed/floating, rate cap details |
| rent_growth | number | yes | Base case annual rent growth % |
| expense_growth | number | yes | Base case annual expense growth % |
| occupancy | number | yes | Base case stabilized occupancy % |
| exit_cap | number | yes | Base case exit cap rate % |
| hold_period | number | yes | Base case hold period in years |
| target_irr | number | yes | Minimum acceptable IRR % |
| variables_to_test | array | recommended | Defaults to: exit cap, rent growth, occupancy, rate, expense growth |
| specific_concerns | string | optional | User's specific worries to emphasize |
Process
Step 1: Single-Variable Sensitivity Tables
For each variable, hold all others at base case and sweep:
- Exit cap rate: base +/- 50 bps in 25 bps increments (5 data points)
- Rent growth: base +/- 200 bps in 100 bps increments (5 data points)
- Occupancy: base, base-5pts, base-10pts, base-15pts (4 data points)
- Interest rate: current, +100, +200, +300, +400 bps (5 data points)
- Expense growth: base +/- 100 bps in 50 bps increments (5 data points)
Each table shows: variable value, Year 5 NOI, Year 10 NOI, levered IRR, equity multiple, DSCR impact. Highlight cells where IRR falls below target.
Step 2: Tornado Chart
For each variable, calculate IRR swing from downside to upside while all others remain at base. Rank largest to smallest:
Variable Downside IRR | Base | Upside IRR Swing
Exit Cap Rate 8.2% | 12.5% | 17.1% 8.9%
Rent Growth 9.8% | 12.5% | 14.9% 5.1%
...The top 2 variables become the axes of the 2-variable sensitivity matrix. Provide commentary on why the #1 variable matters most and mitigation options.
Step 3: Two-Variable Sensitivity Matrix
5x5 grid showing levered IRR at each intersection of the top 2 tornado variables. Mark cells: above target (pass), below target but positive (caution), negative (fail). Bold the base-case cell.
Step 4: Three Scenarios
- Base case (50% probability): stated assumptions
- Upside (25%): rent growth +100bps, occupancy +2pts, exit cap -25bps
- Downside (25%): rent growth -150bps, occupancy -5pts, exit cap +75bps
For each: all assumptions listed, IRR, equity multiple, exit value, narrative on drivers.
Probability-weighted expected IRR = 0.50 base + 0.25 upside + 0.25 * downside.
Step 5: Breakeven Analysis
For each variable, solve for breakeven at:
- 0% IRR (capital preservation)
- Target IRR (minimum acceptable)
- 1.0x equity multiple
Present as table with "Cushion" = distance from base case to breakeven at target IRR. Rank by tightest cushion.
Step 6: Lender Stress Test
Model +200 bps rate increase (applies to floating rate, bridge, and refinance). Calculate new debt service, DSCR, cash-on-cash. If DSCR < 1.25x, flag covenant risk. Show maximum supportable rate at 1.25x DSCR. For floating rate: also model +300 and +400 bps.
Step 7: "What Breaks First" Cascade
Deteriorating scenario with cumulative stresses:
- Stage 1: Occupancy drops 5 pts
- Stage 2: Stage 1 + rent growth goes to 0%
- Stage 3: Stage 2 + exit cap widens 50 bps
- Stage 4: Stage 3 + interest rate increases 200 bps
At each stage show: NOI impact, DSCR (and breach of 1.25x, 1.10x, 1.0x), cash-on-cash, levered IRR, whether equity injection needed. Identify the stage at which each threshold breaks.
Step 8: Floating Rate Stress (conditional)
If floating rate debt: model 5 rate scenarios (current, +100, +200, +300, +400). For each: debt service, DSCR, cash flow, cash-on-cash. Calculate max rate at 1.0x DSCR. If rate cap exists, show effective maximum during cap period and cliff when cap expires. For fixed rate: note "fixed rate -- floating rate stress not applicable."
Step 9: DSCR Threshold Analysis
Year-by-year DSCR under base, downside, and stress scenarios. Map each level:
- Above 1.25x: comfortable
- 1.10x-1.25x: watch list, potential cash sweep
- 1.0x-1.10x: distressed, cash trap, no distributions
- Below 1.0x: default risk, equity injection required
Identify first year DSCR drops below each threshold in downside scenario.
Step 10: Monte Carlo Framework
Define distributions: rent growth (normal, std dev 100bps), exit cap (normal, std dev 25bps), occupancy (beta, bounded), expense growth (normal, std dev 50bps). State expected output: "10,000 iterations would produce IRR distribution; 10th percentile = downside that occurs 90% of the time." Provide Python snippet for execution.
Step 11: Key Takeaways
3-4 bullets: most sensitive variable, cushion assessment, recommendation.
Output Format
Sections 1-11 as described above. Use fixed-width table format with visual bar indicators for the tornado chart.
Red Flags & Failure Modes
- Running IRR without checking DSCR first: A deal with DSCR < 1.0x should not have an IRR calculated.
- Using symmetric ranges: Downside ranges should be wider than upside. Losses are non-linear.
- Ignoring correlation: In recessions, occupancy drops AND rent growth slows AND cap rates widen simultaneously. The cascade analysis captures this.
- Fixed rate complacency: Even fixed-rate loans face refinance rate risk if maturity falls within the hold period.
Chain Notes
- Upstream: Receives base case assumptions from
acquisition-underwriting-engine. - Upstream: Can stress-test budget assumptions from
annual-budget-engine. - Downstream: Risk analysis feeds investor memo risk section.
- Cross-ref: Market cycle data from
market-memo-generatorinforms scenario probability weights.