Skip to content
StockMarketAgent
§ Tool · Valuation sensitivity

Sensitivity matrix calculator

A meta-calculator that sits on top of the eleven valuation kernels. Pick a model, a row axis, and a column axis — then re-run the backend kernel across every assumption offset and watch the fair-value range move. Every cell is an independent recomputation, so the corners where the model structurally breaks show up instead of hiding behind a smooth interpolation.

§ What this is warning you about first

A sensitivity table is only useful when every cell is a real recomputation. Scaling one midpoint by an offset hides nonlinear failures — WACC below terminal growth, negative terminal cash flow, archetype exclusions. This grid re-runs the kernel per cell, so those failures surface as explicit states, not a fake heatmap.

5 × 5
Default offset grid
Recompute
No midpoint scaling
Whitelisted
Axes · per model catalog
3 → 9
Grid bound
v1
valuation-calculators.v1
Lens/en/tools/sensitivity-matrix-calculator
Row · Ke (moderate)rate · ±ppcomputing…
Col · Terminal growthrate · ±ppcomputing…
5 × 5 = 25 kernel re-runs · base cell = (2, 2) · methodology_version = valuation-calculators.v1
§ Sensitivity matrix · Discounted Earnings

Ke (moderate) × Terminal growth

Each cell is a complete backend kernel recomputation, not a scaled midpoint. Click any cell for its per-cell audit.

No cells returned.

vs base cell−20%+±2.5%++20%+
base (offset 0,0)excludedfailed
§ Matrix contract

Shared infrastructure — not a separate model id

The sensitivity service wraps the same eleven kernels behind the per-model pages. It re-runs the chosen model at every cell; the catalog response declares each model's whitelisted axes so API clients build pickers without hardcoding.

Slug/en/tools/sensitivity-matrix-calculator
EndpointPOST /api/v1/valuation-calculators/sensitivity
Cell methodReal kernel recomputation per cell — no synthesis-output scaling
Grid boundsMIN 3×3 · DEFAULT 5×5 · MAX 9×9 (5×5 = 25 kernel calls)
Default offsetsRates ±2pp · multiples ±15% · currency ±10% (unit-aware)
Base cell{ row: 2, column: 2 } — byte-for-byte identical to the standalone model
Cell shape{ fairValue: {low,mid,high}|null, status, exclusionReason, reliability, inputs }
Cell statuscomputed · excluded · failed (inherited from the kernel)
Failure modeswacc_below_terminal · negative_base_fcff · justified_pb_undefined · no_root_in_bracket
Methodologyvaluation-calculators.v1
§ Notes

The service never throws. Invalid axes, oversize grids, and unknown fields surface as a structured warnings list with an empty cells array — REST callers render a graceful empty grid instead of a 500. The per-stock analysis reports build their published sensitivity heatmaps from this exact service, so what you compute here reconciles cell-by-cell with the reports for the same inputs.

All-model workbook →Read methodologymethodology_version = valuation-calculators.v1
§ FAQ

Five things worth knowing

Q01Does every cell really re-run the model — or is it a scaled midpoint?+
Every cell is a full kernel recomputation against the perturbed inputs. Most free sensitivity tables (and a lot of institutional spreadsheets) take the midpoint fair value and multiply it by (1 + offset) for each cell — a smooth, monotone grid that is always defined and always plausible-looking. That hides every interesting failure: WACC dropping below terminal growth, growth producing negative cash flow, an archetype gate firing. This grid re-runs the entire kernel per cell, so those discontinuities surface as explicit cell states instead of a fake heatmap.
Q02Why is the centre cell guaranteed to match the standalone calculator?+
Offset 0 means "do not override the field". The base cell (the 0,0 offset location) receives the original payload unchanged, so it reproduces the standalone model byte-for-byte — same fair value, same reliability, same audit. If you see $87.42 in the discounted-earnings calculator, the centre cell of a sensitivity run on the same inputs reads exactly $87.42. If it ever disagrees, that is a data-pipeline bug worth reporting, not a rounding artefact.
Q03Why can I only pick certain axes for each model?+
Each model declares a whitelist of fields that are meaningful and safe to perturb — published in the catalog response so API clients can build dynamic axis pickers. Perturbing shares outstanding by ±2pp is meaningless; perturbing some fields would silently break model invariants. Ask for an axis outside the whitelist and the service returns a graceful empty grid with a structured warning rather than throwing.
Q04What do the grey and red cells mean — are those errors?+
No. A grey cell is excluded: the applicability gate fired on the perturbed input (wrong archetype, a required input missing). A red cell is failed: the math returned a degenerate result (Ke or WACC crossed terminal growth, ROE fell below growth so justified P/B is undefined). Both carry a machine-readable reason. The most informative cells are often these — they tell you the model has a discontinuity within a small assumption distance, a stability signal a midpoint-scaled table would smooth right over.
Q05How do I read robustness off the grid?+
Look at how far the corners drift from the centre. If the whole grid stays within roughly ±10% of the base cell, the valuation is robust to your two most important assumptions. If the midpoint turns into a third of itself a couple of cells away — or hits an excluded/failed corner — the model is unstable there and the central estimate deserves more caution.