The engine estimates a single instantaneous market-value change from fixed sensitivities. It is an educational approximation for positive, long-only equity, bond and cash holdings, not a full repricing system or a calibrated forecast.
Starting values and portfolio scope
Each holding starts with its market value already expressed in USD. A EUR-denominated asset worth one million dollars enters as 1000000, not as its number of euros. The currency field indicates the unhedged local denomination used for the later translation shock. An actual hedge requires its own treatment outside this tool; changing the currency selector does not construct a hedge.
The workbench accepts between one and thirty rows. Values must be nonnegative and the combined starting value must be positive. Short positions, borrowing, derivatives, structured payoffs, private-asset valuations and actual default events require other methods. Keep unsupported assets visible with the unmodeled type rather than forcing them into a convenient equity or cash category.
The CSV and sensitivity fields
CSV files use the exact header names below. Every numeric field is required, including a zero for a sensitivity that does not apply. The interface disables irrelevant sensitivity cells but preserves their recorded values; those values are ignored unless the holding type is changed to a type that uses them. Imported rows are checked as a complete set before replacing the existing portfolio.
A file can contain at most thirty holdings and must be smaller than 200 KB. Quoted names and embedded commas are handled by the pinned Papa Parse library. Malformed rows, duplicate headings, blank required numeric fields and unsupported types or currencies are rejected. Extra columns are ignored and will not be retained in exported input files.
| Column | Meaning | Accepted range |
|---|---|---|
| label | Position or sleeve identifier | 1 to 60 characters |
| type | equity, bond, cash or unmodeled | Exact lowercase value |
| value | Starting USD-equivalent market value | 0 to 1 trillion per row |
| currency | Unhedged local denomination | USD, EUR, GBP or JPY |
| beta | Equity response multiplier | 0 to 3 |
| duration | Modified rate duration | 0 to 30 |
| convexity | Rate convexity coefficient | 0 to 1000 |
| spreadDuration | Spread duration | 0 to 30 |
Local price-change formulas
Equity local return is beta multiplied by the assumed equity percentage change. A beta-one holding therefore follows that shock exactly in this model. Beta is supplied by the reader; it is not estimated, checked against a time series or assumed stable because a number fits inside the input range. Company-specific events, style differences and changing sensitivities are outside the equation.
Bond local return in decimal units is -D * dy + 0.5 * C * dy * dy - SD * ds. D is rate duration, C is rate convexity and SD is spread duration. Both rate and spread shocks are entered in basis points, then divided by 10000. Convexity applies only to the government-rate shift; there is no spread convexity, rate-spread cross term, curve twist, migration or jump-to-default component.
Cash has a zero local price return under this simplified instantaneous convention. It may still change in USD value through currency translation. Income, accruals, management fees, transaction costs and the passage of time are excluded for every type. The tool rejects an approximation that gives a local return at or below minus 100%, but passing that guard does not establish that a large-shock approximation is accurate.
Currency translation and quote direction
The FX shock measures the percentage change in the USD value of one unit of the selected foreign currency. A negative EUR assumption means a euro buys fewer dollars. USD holdings receive a zero FX shock. Total USD return is (1 + local decimal return) * (1 + FX decimal change) - 1. The multiplication retains the interaction that simple addition would omit.
For a hypothetical 8% local gain and a 5% currency decline, 1.08 multiplied by 0.95 minus one gives 2.6%. This is an identity under the stated quote direction, not an estimate of a future exchange rate. The values and the translation convention must describe the same reporting currency and observation endpoints.
Coverage and denominators
Modeled P/L is the sum of the calculated dollar changes for covered rows. Contribution to total divides that modeled P/L by all starting portfolio value, including unmodeled rows. Modeled-sleeve return instead divides by covered starting value. These measures answer different questions and are labelled separately in both the interface and export.
Value coverage is covered starting value divided by total starting value. An unmodeled row with a positive value prevents a full ending portfolio value from being reported. Its return is unknown, not zero. If every positive-value row is unmodeled, return and P/L estimates are displayed as not estimated. Zero-valued unsupported rows do not create missing economic value.
Even 100% value coverage is narrower than complete risk coverage. A bond row can be mapped and still lack default, liquidity, basis or optionality effects. Review both the share of positions mapped and the adequacy of the valuation method for the question. The coverage statistic alone is not a certification of a risk report.
Scenario bounds and reverse stress
Accepted equity changes range from -60% to +60%; parallel rate shifts from -300 to +300 basis points; spread shifts from -300 to +1000 basis points; and supported currency changes from -50% to +50%. These are interface bounds, not historical quantiles, plausibility limits or validated statistical confidence levels. A scenario comparison retains any failed approximation as an explicit error instead of substituting a zero loss.
The reverse tool solves one linear equity factor while holding other-position P/L fixed. Target P/L equals minus starting portfolio value multiplied by the positive loss-budget percentage. Required equity shock in percent equals (target minus other P/L) divided by (equity value multiplied by beta divided by 100). A zero sensitivity has no unique solution. An algebraic answer outside the supported equity range is labelled outside-range, not validated.
Reproduction and revision
The reference download freezes engine version 1.0.0, its default holdings, every preset and four worked cases. The displayed chart uses this reference portfolio rather than the user's edited holdings. The live result tables use the current inputs. Preserve the report export, its assumptions and engine identifier when reviewing a calculation later.
Automated release checks cover arithmetic identities, rejected inputs, uncovered positions, local links, structured data and browser interactions. They test implementation behavior, not the predictive validity of the model or the adequacy of any investment decision. A substantive specification change requires a version update, new reference output and a dated revision note. This first publication is dated 16 October 2026.
Review checkpoints
- Start with USD-equivalent values and an explicit currency convention.
- Check both position coverage and omitted risk factors.
- Keep sensitivity calculations separate from forecasting, execution and regulatory validation.
Source notes
Continue the analysis
Mapping Portfolio Holdings to Risk Factors
Create an auditable bridge from securities and contracts to signed factor exposures, consistent units, and reconciled scenario results.
Where duration and convexity stop explaining the loss
Audit rate-shock units, duration conventions, curve shape, embedded options, and the gap between approximations and bond revaluation.
Coverage and Missing Positions in a Stress Test
Measure what a stress calculation includes, expose unsupported holdings, and interpret partial losses without silently treating missing risk as zero.
Challenge the model, not just its arithmetic
Separate implementation tests from economic validation, construct informative challengers, and document unresolved limitations and permitted uses.
First edition, 16 October 2026. Hypothetical values are teaching inputs, not observed portfolio or provider results.