MacroStress
MacroStress answers one question: how much does a portfolio lose under a given macroeconomic scenario? An analyst or an agent names paths for a few macro variables (say, the policy rate at 21 % for the next year) and the shocks behind them. A BVAR estimated on history completes consistent paths for the other variables, satellite models turn those paths into drivers (equity prices, bond spreads, industry overdue shares, housing prices), and every position is repriced along the same draws. The output is a loss distribution with $P_5$, $P_{50}$, $P_{95}$, ES95 and the scenario severity $\delta$. The method is described in docs/scenario-formalization.md (Russian).
The server speaks MCP, so any client can drive it: Claude Desktop, Cursor, Claude Code. A
DeepSeek Harness plugin in dsh/ adds three skills and a workspace snapshot for the agent
prompt. All state lives in one workspace/ directory; there is no web app, no database, and no
scheduler.
What it does
| Part | What it does |
|---|---|
| Series | Monthly series from MOEX, the Bank of Russia, Rosstat, and FRED, with the release date of every value |
| Macro model | BVAR with stochastic volatility, sign restrictions, conditional forecasts, scenario severity, and checks on historical episodes |
| Drivers | Object catalogs, hierarchical satellite models, out-of-sample checks, driver paths on the macro draws |
| Scenario | A $(N, C, D, O)$ file with validation and paths: conditional forecast and drivers on the same draws |
| Positions | Equity, bond, credit or deposit, housing |
| Run and report | Positions along scenario paths, with $P_5$, $P_{50}$, $P_{95}$, ES95, and $\delta$ |
| Extensions | A new asset type is a plugin: python -m mst.plugin new, contract checks, a demo run |
| DSH plugin | Scenario from the corpus, report, drivers; the prompt section built from workspace.json |
MCP tools: jobs, series, corpus, scenario, run, portfolio, model. The reference is
in docs/tools.md (Russian).
Install
Python 3.12 or newer and uv are enough.
git clone https://github.com/LeoLourson/MacroStress-DSH
cd MacroStress-DSH
uv sync
uv run macrostress --workspace C:/data/macrostress
The server speaks over stdio and prints only errors; it waits for a client. Configuration for Claude Desktop, Cursor, and any other MCP client is in docs/mcp.md. The DeepSeek Harness plugin is covered in docs/install.md.
First session
Once a client is connected, it sees seven tools. Long operations start jobs: a tool returns a
job at once, and jobs shows the progress.
jobs(action="state")— what is in the workspace: model versions, corpus index, jobs.series(action="update")— download the macro series. FRED needs a key inFRED_API_KEY.jobs(action="status", id=...)andjobs(action="log", id=...)— wait for the job.model(kind="macro", action="estimate", as_of="2026-10-29")— estimate the macro model on the data known at that date. The version is a hash.series(action="update", quantity="share_price")— find the objects of a quantity and download their series; the same forbond_spread,overdue_share,housing_price_primary,housing_price_secondary.model(kind="satellites", action="estimate", version=<macro hash>)— estimate the satellites on that macro version.model(kind="satellites", action="describe", version=<hash>)— which drivers passed the out-of-sample check and why the rest were rejected.corpus(action="search", query=..., as_of=...)— fragments known at the date;corpus(action="index")rebuilds the index as a job.scenario(action="save", id=..., spec={...})— save a scenario;scenario(action="validate", id=...)— list everything that blocks the calculation.portfolio(action="save", id=..., spec={...})— save a portfolio;portfolio(action="check", id=..., scenario=...)— check it against the scenario.run(action="start", scenario=..., portfolio=..., draws=..., seed=...)— start a run;run(action="result", id=...)— read $P_5$/$P_{50}$/$P_{95}$, $\delta$, and coverage.
Documentation
The documentation is in Russian, except docs/mcp.md, which is in English.
- docs/mcp.md — any MCP client, the first session, troubleshooting;
- docs/install.md — the Python package and the DeepSeek Harness plugin;
- docs/architecture.md — packages, workspace, versions, jobs;
- docs/tools.md — MCP tools and
python -m mst.*commands; - docs/plugins.md — a new asset type as a plugin;
- docs/platform.md — the contracts: position, paths, model, registry;
- docs/scenario-formalization.md — the method and what the code implements.
Every package folder has its own README that names its files.
Development
uv sync
uv run pytest -q -m "not slow"
uv run ruff check .
The slow tests estimate the BVAR and take minutes; the night workflow runs the full suite.
CI runs the fast suite on Linux and Windows with Python 3.12 and 3.13.
Status
0.1.0, beta. Interfaces may change before 1.0. The data sources are the Russian market (MOEX, the Bank of Russia, Rosstat) plus FRED for global series.
Contributing and license
Contributing rules and the release process are in CONTRIBUTING.md; vulnerabilities go through SECURITY.md. The code is MIT-licensed, see LICENSE. Series from MOEX, the Bank of Russia, Rosstat, FRED, and BIS are not part of this repository: you load them under the terms of each source, and the license does not cover that data. Citations are described in CITATION.cff.
Metadata
Release files for macrostress 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| macrostress-0.1.0.tar.gz | 175.8 kB | With provenance | Details for macrostress-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| macrostress-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for macrostress-0.1.0-py3-none-any.whl |
Total release size: 391.9 kB
Release files / macrostress-0.1.0.tar.gz
| Download URL | macrostress-0.1.0.tar.gz |
|---|---|
| Size | 175.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
aa1744292936debf2810c7ebb1911ee256ba4723b5ef6dfb984455962c7eca69
|
|
BLAKE2b-256 checksum How to use checksums |
432b1f04bf3afec1e6ac62f26171731fd1a74bab36d4148d6c8c56fe0ed54a5e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 29, 2026.
Transparency logRelease files / macrostress-0.1.0-py3-none-any.whl
| Download URL | macrostress-0.1.0-py3-none-any.whl |
|---|---|
| Size | 216.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
360db93f2ba8a1a1419cdbb05d08f7729c4db21b87f570567b28a27251cf0c23
|
|
BLAKE2b-256 checksum How to use checksums |
f59ebbbbc09188ad7eb369f914a7f16fe95d1bb1622288bb17a0c07714572529
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 29, 2026.
Transparency logSecurity for macrostress 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for macrostress-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 29, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.