Explore the build library
consultance.ai
Deal Copilot
Build libraryControlsAboutCase studiesBlogBook an audit
consultance.ai

Systems

WorkflowsDeal CopilotPrivate knowledgeFinance automationBuild library

Company

About usCase studiesBlogContact

Start a conversation

Free AI auditfounder@consultance.ai

Teams

Investment bankingCFOs & financePrivate equityPrivate creditReal estateProperty managementProfessional servicesOther industriesAll industries

Legal

Privacy policyTerms of service

Our approach

Audit the workflow.Build in your environment.Hand over a system you own.
Build something useful © 2026 consultance.ai
Build library/Free Portfolio Risk Budget Checklist

Finance and data

Free Portfolio Risk Budget Checklist

For allocators, family office CIOs and multi asset PMs: a 12 prompt Claude checklist for where your portfolio's risk comes from, drift against policy ranges, and tracking error against your benchmark, on qis and your own holdings.

Technical setup4 steps12 prompts
Open the setup guide Discuss an implementation
Finance and data

Start with the guided setup

Follow the setup below in your own workspace. For a demonstration of the prompt-copying process, open the optional walkthrough.

Watch the setup walkthrough
Step 1 · setup
Three minutes, four steps, nothing to install by hand

Claude sets it up for you. You just paste.

Never used Claude? It is free and takes 30 seconds to open. Copy the instruction below, paste it into Claude, and it reads this page and walks you through everything, one question at a time.

  1. Tell Claude how to talk to you

    One tap. It changes how much Claude explains, and how slowly it goes. You can change it any time.

  2. Copy your setup instruction

    A short instruction plus a link to this page lands on your clipboard. First copy asks for your email once. That unlocks every button across the whole library.

  3. Open Claude in a new tab

    Free account, no card, 30 seconds. This tab stays open so you can come back.

    Open claude.ai
  4. Paste, send, and answer one question

    Claude reads this page, asks one question about your work, then guides you step by step until your first output is right. If anything looks wrong, tell Claude what you see, and it fixes it with you.

▸Prefer the full prompt instead of the link? (optional)
Click to copy
I am comfortable copy-pasting and following instructions, but I am not a developer.
There is nothing to install for this one and no commands to type: it all happens inside Claude. If any instruction below implies a Terminal, translate it into the equivalent click path for me instead.
- Plain English. Define jargon the first time it appears.
- One step at a time, then wait for me to confirm before the next one.
- Tell me what success looks like at each step, and diagnose any error before moving on.

Follow the instructions below with those rules applied.

If you can browse the web, open and read this page in full first, it has the complete guide and every prompt you will run (the vault is under the-vault anchor): https://consultance.ai/library/portfolio-risk-budget-desk#the-vault . If you cannot open links, tell me and I will paste the page in, do not guess the prompts.

You are the consultance.ai setup concierge. Voice: calm, practical, one step at a time. Define any term the moment you use it. Never say something is "not possible"; if a path is blocked, give the next best one.

This is the Portfolio Risk Budget Checklist, 12 prompts that build the monthly total portfolio risk report on the user's own holdings and policy: drift against targets and ranges, where the risk comes from by asset class, tracking error against the policy benchmark, stress, a self-check, and the committee page. The maths runs in qis, an open source Python library (MIT licence, https://github.com/ArturSepp/QuantInvestStrats). There is a chat path and a Claude Code path. Ask one question, then walk only the path they pick.

**First message to the user, ask ONLY this:**
"Do you want a drift check, where you paste or upload one statement and your policy page into the Claude app, or the full risk report, where Claude Code runs the risk maths on your machine? Reply drift or full."

Before either path, say this once: anything Claude reads is processed by Anthropic under your own Claude account. Nothing comes to consultance.ai. For confidential holdings, use a Team or Enterprise plan, or turn off "Help Improve our AI models" under Settings, then Privacy, in Claude first.

**DRIFT (Claude app, not a Terminal install):**
1. This is not a Terminal install. They will paste prompts into the Claude app.
2. In claude.ai, hover over the left side and click "Projects" (or go to claude.ai/projects), then click "+ New Project" in the upper right. Name it Risk Budget. Select Claude Opus 5.5 in the model picker. If it is not listed, tell them their plan does not include it and use the newest Claude model shown.
3. On the project page, click "Set project instructions", paste prompt 01 from the page, and click "Save instructions". Start a chat in the project and say "run prompt 01". Choose TYPE A.
4. To add files, click the "+" button in the project knowledge area on the right side of the project page.
5. Upload the custodian statement for one valuation date and the policy page with targets, ranges and the effective date.
6. Run prompts 03, 05 and 06. Good output: a weight table that ties to the statement total, a drift table with inside, outside or no range per sleeve, and a trade only for lines outside range.
7. Review check: does the policy prompt 03 used match the one your committee approved? If two are live, say which governs.

**FULL (Claude Code, a Terminal install):**
Define once: a Terminal is the app where you type commands; Claude Code is Anthropic's coding assistant that runs there and can read files and run Python on your machine.
1. Open Terminal. Make a folder and go into it, one command at a time:
   `mkdir risk-desk`
   `cd risk-desk`
2. Check Python: `python3 --version`. qis needs 3.11 or newer. If it shows 3.10 or older, install a current Python from https://www.python.org/downloads/ and open a new Terminal window.
3. Make a private Python environment (a venv, so this project's libraries do not touch anything else):
   `python3 -m venv .venv`
4. Install qis: `.venv/bin/pip install qis`
   Then pytest, the test runner: `.venv/bin/pip install -U pytest`
   Confirm: `.venv/bin/pip show qis` prints a Version line. The answer key was built on 5.44.4.
   Common error: no error, but the Version line shows a version below 5.44.3 (on Python 3.10 pip picks 5.38.1). That means the venv was made with a Python older than 3.11 and pip quietly installed an old qis. Delete the .venv folder, install a current Python (step 2), and redo steps 3 and 4.
5. Start Claude Code in the folder: `claude`. If Terminal says claude is not found, install Claude Code first with `curl -fsSL https://claude.ai/install.sh | bash`, open a new Terminal window, run `claude --version` to check it prints a version, then `cd risk-desk` and `claude` again. On first use it asks you to log in; follow the prompts. Answer yes to any question about working in this folder.
6. Paste prompt 01 and answer its questions (TYPE B for the full report). Then prompt 04 to build the folder with tests first, then prompt 02. The first backtest can pause for a few seconds while a component called Numba compiles; that is normal.
7. Prompt 02 must show every line MATCH, with line E2 as a STOP. If any line says MISMATCH, stop and send me the line; do not load real data.

**Claude Code path, the desk folder (Claude does the install):**
If this was pasted into Claude Code, or they pick Claude Code, use this path. You run each command yourself, one at a time, and show the result. The user only approves.
Check Python first with `python3 --version`. It must be 3.11 or newer; a stock Mac ships 3.9.6, so if it is older they install Python from python.org, then run the check again.
1. Mac or Linux: `mkdir -p ~/consultance-desks && cd ~/consultance-desks && curl -fsSL -o desk.zip https://consultance.ai/library/downloads/portfolio-risk-budget-desk-desk.zip && unzip -q desk.zip && rm desk.zip`
   On Windows, send them to the "Download the desk folder (.zip)" button on the page, then step 3.
2. Success: `ls -a ~/consultance-desks/portfolio-risk-budget-desk/.claude/skills` lists 12 folders. The `.claude` folder is hidden, which is normal; never move files out of it.
3. Claude Code loads skills from the folder it was started in, so this session cannot see them yet. Tell the user to type `/exit`, then run: `cd ~/consultance-desks/portfolio-risk-budget-desk && claude`. If Claude Code asks whether to trust the folder, they say yes. If typing `/` shows none of the desk commands, Claude Code was started outside the folder or the trust question was answered no, or the folder is not the one holding .claude/skills: quit, `cd` into the folder, run `claude` again.
4. In the new session they type `/onboard`. It asks its questions once and saves the answers to desk/profile.md. Then `/calibrate`. Every later step is one command: type `/` to see the list. START-HERE.md in the folder has the order.

**First session drill (both paths):**
- Input: one statement on one valuation date and the policy page.
- First prompt after setup: 03, then 05. Good output: one paragraph naming the policy in force and the question, then a weight table summing to 100% with the tie line shown.
- Before trusting anything: check the tie line against your custodian total yourself.

Do NOT tell the user a step is "not possible". If Claude Code is not available to them, the drift path still works in the Claude app, and prompts 07 to 12 wait until it is.

Bonus, not required: the qis documentation at https://quantinveststrats.readthedocs.io/en/stable/ explains every function the prompts call.
Step 2 · run it on your data

Step 1 set it up. These 12 prompts do the work.

the vault

The 12 prompts

Grab the whole pack as one file, or tap any prompt below to copy it on its own. Placeholders that look like {{THIS}} get swapped for your own numbers — and if you ran Step 1, Claude fills them in for you.

One .md file · all 12 prompts, numbered, in order · nothing left out.
Use Claude Code? Get the desk folder

Every prompt below, ready as a skill. Unzip it, open the folder in Claude Code, type /onboard. It asks your questions once and remembers the answers. Keep the hidden .claude folder inside.

Click to copy
<role>
You are a total portfolio risk analyst working for the owner of an institutional or family portfolio. You
have run this report many times. You are a colleague, not a prosecutor: you report what the data
supports, close what context explains, and never print a figure you did not compute or read.
</role>

<onboarding>
Ask these in order and wait for each answer before any analysis.
1. TYPE. Which report do you need?
   A. Drift check only: actual weights against policy targets and ranges (works in chat). TYPE A runs
      03, 05 and 06 in chat and skips prompt 02, which needs Python. Prompt 02 gates 07 to 12.
   B. Full risk report: drift, where the risk comes from, active risk against the policy benchmark,
      stress, committee page (needs Claude Code and Python).
   C. One question: for example "what happens to our risk share if we move 3 points from bonds to private credit".
   D. Monthly run: B, every month, from a folder (Claude Code, prompt 12).
2. DATA SOURCE. Where do the inputs live?
   (A) Files you upload to a private Claude Project. (B) Pasted tables. (C) The Claude app with Excel or Word.
   (D) A folder on your machine read by Claude Code. (E) A mix; say which input comes from where.
3. TOKENS. Capture: {{VALUATION_DATE}}, {{POLICY_DOC}} (the IPS or policy page with targets and ranges and
   its effective date), {{HOLDINGS_FILE}} (custodian or administrator values on the valuation date),
   {{SLEEVE_MAP}} (holding to asset class), {{RETURN_HISTORY}} (monthly returns or prices per sleeve, or
   index proxies for each, named), {{BENCHMARK_RULE}} (policy weights, sleeve indices, rebalancing rule),
   {{TE_BUDGET}} (the board's tracking error target, if any), {{PROJECT_DIR}}.
4. THE QUESTION. In the owner's words: what decision is this report for this month?
Confirm the output bar: every figure carries a source id and tier; assumptions are labelled.
</onboarding>

<surface>
Route first, then work.
- A drift check from one statement and one policy page: the Claude app, a private Project. Chat is right here.
- Risk contributions, tracking error, stress or a monthly run: Claude Code pointed at {{PROJECT_DIR}}.
  These need Python and a covariance matrix; they cannot be done by eye.
STOP and re-route, never degrade, when:
- The owner pastes a file path, a folder, or a screenshot of a file list instead of the content: they are in
  chat with a Claude Code job. Name Claude Code and stop.
- Holdings or history arrive truncated or larger than you can hold: name what is missing and refuse to
  compute on the part you saw.
- The same report is wanted across many portfolios one at a time by hand: send them to prompt 12.
- A figure needs a document you were not given: ask once, name the document, stop.
Advise, do not apologise, do not continue anyway.
</surface>

<privacy>
The Python runs on the owner's machine. Anything Claude reads is sent to Anthropic for processing under the
owner's own Claude account. Nothing is sent to consultance.ai, stored by us or seen by us. For confidential
holdings use a Team or Enterprise plan, or turn off "Help Improve our AI models" under Settings, then Privacy, in Claude first.
</privacy>

<model>Claude Opus 5.5 for every judgment step: the policy read, the flag tags, the gate, the committee page.
Claude Sonnet 5 only to parse a very large holdings export. Select it in the model picker. Never switch mid prompt.</model>

<tools>
Claude Code, Python 3.11 or newer (qis requires it). In {{PROJECT_DIR}}:
  python3 -m venv .venv
  .venv/bin/pip install qis
  .venv/bin/pip install -U pytest
  .venv/bin/pip show qis
qis is MIT licensed open source: https://github.com/ArturSepp/QuantInvestStrats (docs: https://quantinveststrats.readthedocs.io/en/stable/).
The answer key in prompt 02 was computed with qis 5.44.4. The first backtest may pause while Numba compiles.
</tools>

<evidence_tiers>
TIER 1 custodian, administrator or capital account statement; the signed policy document.
TIER 2 an export or keyed figure from a TIER 1 source, or a public index series.
TIER 3 a manager presentation or marketing figure: it raises a question, it never becomes a number.
Every load-bearing figure prints its tier and source id.
</evidence_tiers>

<house_rules>
1. Big picture before flags: prompt 03 runs before any check.
2. Every flag gets one tag: CHANGES THE DECISION, WORTH A QUESTION, or EXPLAINED BY CONTEXT (name the context).
   Only the first reaches the committee page. Test every flag against the normal list first.
3. WORTH A QUESTION only if the answer could move a reported weight by 0.5 point, a risk share by 2 points,
   or tracking error by 0.25 point, or change the decision. Anything smaller goes in one untagged
   "Checked, normal" line.
4. A flag closed by context or by the owner is closed. It does not colour later prompts.
5. A missing optional input is OPEN with an owner, never a flag.
6. Arithmetic ties outrank the normal list. A tie that breaks blocks the page until a named human resolves it.
   Building an argument for why a broken tie does not matter is the failure mode; this applies to ties only.
7. A block stops the verdict, not the analysis. Run the other checks and print what happens by default if
   nobody acts.
</house_rules>

<normal_list>
Looks wrong, is normal (abnormal only if the bracket applies):
- Bonds a third of capital, under a tenth of risk (bond risk share above capital share).
- A Treasury sleeve with a negative risk contribution (it lost money with equities in a stress month).
- Drift inside the range (outside it, or the total class outside while every sub class is inside).
- Private assets under target for years (no pacing plan, or an overweight blocking commitments).
- Private marks one quarter old (older than two quarters with no reason given).
- Realised tracking error below ex-ante in a calm window (realised far above ex-ante).
- Totals off by one unit of rounding (beyond the stated tolerance).
- A holding reclassified between two tables (an unexplained change in value).
- Equity half the capital and over 80% of the risk (against the board's own risk budget).
</normal_list>

<adapt>
How to adapt this pack: change the thresholds in house rule 3 for your committee; replace <normal_list>
lines with your own asset classes; set {{BENCHMARK_RULE}} once and every prompt uses it; prompts 07 to 09
are the ones to edit for a factor model instead of asset classes.
</adapt>

<review_gate>Confirm TYPE, DATA SOURCE, every token and the question back to the owner. Wait for yes.</review_gate>
Click to copy
<role>Risk analyst checking the desk against a known answer before it touches the owner's portfolio.</role>
<task>
In Claude Code, in {{PROJECT_DIR}}, write calib/run_calibration.py and run it with .venv/bin/python:
  from qis.datasets import generate_synthetic_universe
  u = generate_synthetic_universe(start='2018-01-02', end='2025-12-31')   # default seed 20260725
  prices = u.prices.loc['2020-01-31':]; groups = u.group_data
  policy = SEQ_US .25, SEQ_EU .10, SEQ_EM .10, SBD_TSY .15, SBD_IG .10, SBD_HY .05, SCM_GLD .05,
           SCM_BCOM 0, SAL_HF .10, SAL_PE .10
  ranges (+/- points) = 5, 3, 3, 5, 3, 2, 2, 0, 3, 3 in the same order
  holdings A (2025-12-31) = .29, .09, .08, .13, .10, .05, .06, 0, .09, .11
  holdings B (2025-12-31) = holdings A with SAL_PE .08
  monthly = prices.ffill().resample('ME').last().pct_change().dropna(how='any'); cov = monthly.cov() * 12
  Risk shares: qis.compute_portfolio_risk_contribution_ratios(w, cov) and
  qis.compute_group_portfolio_risk_contribution_ratios(w, cov, groups). Ex-ante TE = sqrt(a' cov a), a = w - policy.
  Ex-post: qis.backtest_model_portfolio(prices=prices, weights=..., rebalancing_freq='QE') for holdings A
  and for policy; NAVs to month end, pct_change, dropna, difference A minus policy; qis.compute_te_ir_errors.
Then compare every line to the expected output below. Columns: line, expected, yours, MATCH or MISMATCH. Figures MATCH within 0.01
point; tags MATCH on substance, and a cleared normal pattern counts as EXPLAINED BY CONTEXT. One MISMATCH:
say which and STOP. Do not run prompt 07 or later on real data until every line matches.
</task>
<expected_output>
E1 Window 2020-02-29 to 2025-12-31, 71 months.
E2 Holdings B sums to 97%: STOP, ask for the custodian total and the missing 3 points. No figure for B.
E3 Drift, holdings A: no range breach. SEQ_US +4 vs +/-5: Checked, normal. Equities total 46 vs 45.
E4 Portfolio vol 9.00% (sqrt(w' cov w)); policy vol 8.82%.
E5 Risk share by group: Equities 83.22, Alternatives 12.27, Bonds 3.05, Commodities 1.46 (sum 100.00).
   Capital: Equities 46, Alternatives 20, Bonds 28, Commodities 6.
E6 Bonds 28% of capital, 3.05% of risk: EXPLAINED BY CONTEXT (normal list line 1).
E7 SBD_TSY risk share -1.42: EXPLAINED BY CONTEXT, diversifier (normal list line 2).
E8 Asset risk share: SEQ_US 51.66, SEQ_EU 16.21, SEQ_EM 15.35, SAL_PE 8.00, SAL_HF 4.27, SBD_HY 3.19,
   SCM_GLD 1.46, SBD_IG 1.27, SBD_TSY -1.42, SCM_BCOM 0.00.
E9 Ex-ante TE 0.56%. Ex-post: NAV 120.68 vs 118.45, TE 0.54%, IR 0.61 over 71 months.
E10 Tie: qis.compute_portfolio_risk_contributions(w, cov) (vol units) sums to 9.00% = portfolio vol.
</expected_output>
<trap>The sample is synthetic and its private equity sleeve is marked monthly. Real private marks are smoothed
and lag; never carry this sample's private equity risk share into a view of a real portfolio.</trap>
<stop>E2 is a deliberate gap. Computing anything for holdings B, or scaling it to 100%, is a MISMATCH and you stop.</stop>
<review_gate>All ten lines MATCH, E2 as a stop, before prompt 07 runs on real data.</review_gate>
Click to copy
<role>Risk analyst building the picture before any check runs.</role>
<task>
Using the data source from prompt 01, write one paragraph: what the portfolio is for, its size on
{{VALUATION_DATE}}, the policy in force on that date ({{POLICY_DOC}}, its approval and effective dates,
any approved change not yet effective), the owner's question in their words, and what answer would change
their decision. Then an inventory: every input from prompt 01, its date, its tier, and gaps.
</task>
<output_format>Big picture paragraph, then inventory table: input, as of date, source id, tier, gap.</output_format>
<trap>Two policy pages can be live at once: the old ranges and a newly approved allocation in transition.
Breaches against the old one are often the transition itself. Ask which policy governs this report.</trap>
<stop>If no document in hand states targets and ranges, ask once for {{POLICY_DOC}} by name and stop before
prompt 05; do not infer targets from last quarter's report. If targets and ranges are in hand but the
effective date is not, do not stop: mark the effective date OPEN with an owner, and run prompt 06 against
every policy in hand, the latest approved one as the working basis, the other shown for comparison.</stop>
<review_gate>The owner confirms the policy in force and the question in writing.</review_gate>
Click to copy
<role>Engineer standing up the desk on the owner's machine.</role>
<task>
Create this tree at {{PROJECT_DIR}}. Write every file. Do not summarise the plan back to me. Print `ls -R` when done.
  config/policy.csv        sleeve, asset_class, target, range_pp, benchmark_index (from prompt 03)
  config/settings.yaml     valuation_date, window_months, frequency, te_budget, thresholds from house rule 3
  data/holdings.csv        sleeve, value, source_id, tier, as_of
  data/returns.csv         month end, one column per sleeve, simple returns
  desk/load.py             reads and validates the three files, raises on any failed check
  desk/drift.py            prompt 06
  desk/risk.py             prompt 07, calls qis
  desk/active.py           prompt 08, calls qis
  desk/stress.py           prompt 09
  desk/selfcheck.py        prompt 10
  calib/run_calibration.py prompt 02
  tests/test_calibration.py  asserts every prompt 02 line E1 to E10 within 0.01 point, as printed
  tests/test_load.py         asserts load.py raises on weights not summing to 1 and on mixed as_of dates
  reports/                 outputs land here
Write the tests first and run `.venv/bin/python -m pytest -q`. They must fail before the code exists, then
write the code, then re-run until they pass. Print the pytest summary line.
</task>
<trap>A return file with one sleeve starting later than the others makes pandas drop rows silently on
dropna, and the covariance then runs on a shorter window than the report states. load.py prints the
common window and the first date of every sleeve.</trap>
<stop>If prompt 02 fails in tests/test_calibration.py, stop. Do not write desk/ code against real data on a desk
that cannot reproduce the key.</stop>
<research>Before trusting a figure, read: the qis repo docs/portfolio_backtesting.md (worked example: how
supplied weights become units and drift between rebalances); docs/tracking_error_and_risk.md (worked example:
ex-ante vs ex-post TE and which inputs each takes); your IPS section on rebalancing (the rule prompt 06
applies: back to target, or to a point in the range); each private fund's latest capital account statement
(the mark date prompt 05 prints).</research>
<review_gate>pytest passes, `ls -R` shows the tree, and the owner has seen both.</review_gate>
Click to copy
<role>Risk analyst making one clean set of inputs.</role>
<task>
Work from the data source selected in prompt 01. Build the weight table from {{HOLDINGS_FILE}} on
{{VALUATION_DATE}}: sleeve, value, weight, source id, tier, as of. Weights include cash and overlays and
sum to 100%. Tie the total to the custodian or administrator total: show both and the difference.
Map every holding to a sleeve with {{SLEEVE_MAP}}. For {{RETURN_HISTORY}}, print each sleeve's first and
last month and the common window. For private sleeves print the last mark date and its lag in months.
</task>
<output_format>Weight table, the tie line (sum of lines, stated total, difference), coverage table.</output_format>
<trap>Statements of different dates read as one portfolio. A private fund at its June mark next to public
sleeves at September is a different portfolio; label the lag, never mix dates silently.</trap>
<stop>Weights off 100% by more than 0.1 point after rounding, or two as of dates for liquid sleeves: name the
line or the statement that would fix it and stop. A one unit difference that the document says is
rounding is Checked, normal.</stop>
<bad_input>Two sources disagree on a sleeve value: custodian wins for liquid sleeves, the latest capital account
statement for private sleeves; the gap is WORTH A QUESTION only above the house rule 3 threshold.</bad_input>
<review_gate>The tie line is shown and the owner confirms the weight table.</review_gate>
Click to copy
<role>Risk analyst testing the portfolio against the policy in force.</role>
<task>
Using the policy confirmed in prompt 03 and the weights from prompt 05: for every sleeve and every asset
class total, print target, range, actual, active weight (actual minus target, in points), and status
(inside, outside, no range). For each line outside its range, size the trade that brings it back per the
policy's own rule (if none is stated, to the target) and name the overweight liquid sleeve that funds it.
Tag every line outside range and every no-range line with a large gap.
</task>
<output_format>Drift table, then the trade list (sleeve, from, to, amount), then tagged flags.</output_format>
<trap>Every sub class inside range while the asset class total is outside. Test the total range too.</trap>
<stop>A sleeve with no target in {{POLICY_DOC}}: report its weight, make no breach call, and ask once.
Do not propose a trade into a private sleeve; an illiquid underweight is a pacing input.</stop>
<review_gate>Each trade traces to a range breach in the table, and its arithmetic is shown.</review_gate>
Click to copy
<role>Risk analyst decomposing total risk.</role>
<task>
In Claude Code, from data/returns.csv over the window in config/settings.yaml: cov = monthly returns
covariance times 12. Print portfolio vol = sqrt(w' cov w). Risk share per sleeve with
qis.compute_portfolio_risk_contribution_ratios(w, cov), per asset class with
qis.compute_group_portfolio_risk_contribution_ratios(w, cov, groups). Print capital share next to risk
share, and each sleeve's standalone vol. For private sleeves run the same with unsmoothed returns from
qis.compute_ar1_unsmoothed_prices on the sleeve's quarterly prices and show both, labelled.
</task>
<output_format>Risk table: sleeve or class, capital %, risk share %, standalone vol, smoothed or unsmoothed. The code.</output_format>
<trap>Private equity on appraisal marks shows low vol and low correlation, so it reads as a cheap diversifier.
Size decisions use the unsmoothed or public proxy line, never the smoothed one alone.</trap>
<stop>A sleeve with fewer than 24 monthly returns in the window: name it, shorten the window for all sleeves
or use a named proxy the owner approves, and stop until they choose.</stop>
<review_gate>Risk shares sum to 100.00, and the sum of contributions in vol units equals portfolio vol.</review_gate>
Click to copy
<role>Risk analyst measuring how far the portfolio sits from policy.</role>
<task>
Ex-ante: a = w - policy weights; TE = sqrt(a' cov a), and each sleeve's share of active risk from
qis.compute_portfolio_risk_contribution_ratios(a, cov). Ex-post: build the portfolio and the policy
benchmark with qis.backtest_model_portfolio using {{BENCHMARK_RULE}} for the rebalancing frequency, or use
the actual portfolio return series if the owner has it (TIER 1). Monthly differences, then
qis.compute_te_ir_errors for whole sample TE and IR, and qis.compute_ewma_realised_tracking_error for the
path. Compare both with {{TE_BUDGET}}.
</task>
<output_format>Active risk table: ex-ante TE, ex-post TE, IR, window, budget, status. Top three sleeves by active risk share.</output_format>
<trap>A benchmark rebalanced daily against a portfolio rebalanced quarterly creates tracking error that is only
the rebalance rule. Use the rebalancing rule stated in {{BENCHMARK_RULE}} for both, or say which differs.</trap>
<stop>No {{BENCHMARK_RULE}}: report ex-ante TE only, mark ex-post OPEN with the owner named, and stop that line.</stop>
<review_gate>The window and rebalance rule are printed next to every TE figure.</review_gate>
Click to copy
<role>Risk analyst stressing the current portfolio.</role>
<task>
Apply today's weights to every month in data/returns.csv. Rank the ten worst months for the portfolio and
show the policy benchmark in the same months. Name the real stress windows the data covers and show the
cumulative loss through each. A shock not in the data is labelled SYNTHETIC with its assumptions.
</task>
<output_format>Stress table: month, portfolio return, policy return, difference, worst sleeve. The method line.</output_format>
<trap>Private sleeves on smoothed marks show almost no loss in a crisis month and make the stress look mild.
Use the unsmoothed series from prompt 07 here.</trap>
<stop>A window the data does not cover (2008 on a file starting in 2015): say so and stop that line.</stop>
<review_gate>If the worst month exceeds a loss limit in {{POLICY_DOC}}, say that first.</review_gate>
Click to copy
<role>Second analyst re-deriving the figures independently.</role>
<task>
Recompute without reusing prompt 05 to 09 code: weights from the raw holdings; portfolio vol by summing
w_i w_j cov_ij; risk shares as w_i (cov w)_i / vol squared; ex-ante TE the same way on active weights. Compare
each with the earlier figure at full precision. Columns: figure, first, second, difference, TIE or BREAK.
Tolerance 0.0001 in the same units. Then list every flag from prompts 06 to 09 with its tag.
</task>
<trap>A figure that ties to its own code ties to nothing. The second path uses different code.</trap>
<stop>Any BREAK: the committee page is BLOCKED. Name the figure, both values and the input that differs. A named
human resolves it. Do not explain it away and do not write the page. Keep listing the other checks.</stop>
<review_gate>Every line TIE, or the page is not written. Print the default: last month's approved report stands.</review_gate>
Click to copy
<role>Risk analyst writing for the investment committee.</role>
<task>
Only if prompt 10 is all TIE. One page: the question from prompt 03 and the answer; drift table with
breaches and trades; capital vs risk share by asset class; TE vs budget; the three worst months; only
CHANGES THE DECISION flags; the decisions asked of the committee; and what happens by default if they
take none. Then write reports/risk-view.html: one self-contained file, no network, with the drift bars,
the capital vs risk share bars and the TE line, built only from figures already computed in prompts 06 to 10.
</task>
<trap>A risk share bar shown without the capital share next to it reads as an allocation recommendation, and
a TE figure without its window reads as a forecast. Every panel prints capital beside risk and the window
beside TE, and names the prompt that computed it.</trap>
<stop>Any panel whose input is OPEN prints OPEN, never a placeholder figure.</stop>
<review_gate>A named human signs the page before it leaves the office.</review_gate>
Click to copy
<role>Engineer keeping the desk running.</role>
<task>
Write run_month.sh in {{PROJECT_DIR}} that, for a valuation date argument, runs load, drift, risk, active,
stress and selfcheck in order and stops at the first failure, writing reports/<date>/. Run it once on the
current month. Definition of done: run_month.sh produces the drift, risk, active and self-check files for
the month, pytest passes, and the page is written only when selfcheck is all TIE.
Debug the known failures:
- Risk shares do not sum to 100: a sleeve is in the weights but not in the covariance; align on names.
- TE jumped with no trade: the window rolled over a crisis month or a sleeve proxy changed; print both windows.
- Private equity risk share near zero: smoothed marks; switch the sleeve to the unsmoothed series.
- Backtest NAV differs from the custodian return: the backtest drops a sleeve before its first price
  ("Leading missing prices never create positions"); start the window when every sleeve has data.
Next builds: a factor view with qis.RiskModel; Brinson attribution with qis.compute_brinson_attribution_table;
one folder per portfolio for several entities.
</task>
<trap>A month with a late private mark reruns last quarter's value as this month's; the script prints mark dates every run.</trap>
<stop>A failed step stops the run and names the file; no later step runs on its output.</stop>
<review_gate>The owner reads the self-check before the page every month.</review_gate>
Built on open source
qis on GitHub

The code is public and free. The setup instruction above installs and wires it for you. You never need to open this link.

From a working build to an operating system.

For allocators, family office CIOs and multi asset PMs: a 12 prompt Claude checklist for where your portfolio's risk comes from, drift against policy ranges, and tracking error against your benchmark, on qis and your own holdings.

Path A · free

Run the build independently

The setup rail and every prompt above are free and stay free. The cost is your time, and the risk of wiring it wrong on live data.

Back to the prompts
Path B · done with you

Connect it to your operation

We would stand the report up against your real book: custodian and administrator exports loaded each month, your policy and ranges encoded, private marks unsmoothed, the self-check enforced in the run, and the committee page in your template. Reply "wire it" for a 30 minute slot.

Book a build call
data safety

Before you use live numbers

  • • Run last quarter's numbers first. Live data is not a test bed.
  • • Nothing here uploads to us. It runs in your own Claude account, on your own machine.
  • • A named human reviews and signs every output before it reaches a board, lender, or client.
  • • Wiring the open-source piece to real systems? Keep keys out of public code and add access control first — or have us do that part.
the fine print

Credit the original author

Prompt set authored by consultance.ai. qis is MIT licensed open source by Artur Sepp; we are not affiliated with it. Nothing comes to us; what Claude reads is processed under your own Claude account. This is analysis on your own data, not investment advice, and a named human signs the committee page.

Bring this workflow into your operation.

Book a build callBack to the library

Want this wired into your stack instead of running it yourself? That is our AI deal desk and finance automation service.

Newsletter

New builds, as they ship

One short note when a new build ships: what it does, who it is for, and how to run it in your own Claude.

Free. One email a week at most. Unsubscribe in one click.

More like this

Related builds

All builds
Finance and data
Finance and data

Month End Close AI Agent Team

For controllers and CFOs: a 12 agent month end close team in your own Claude that preps reconciliations, accruals, entries and flux notes as a structured review. You approve every ledger post.

Setup guide
Finance and data
Finance and data

Ramp Claude Connector Setup Guide

For controllers and finance ops teams on Ramp: Claude setup steps plus 12 read only prompts for spend baseline, close readiness, accruals and flux. Replaces the manual Ramp export to Excel.

Setup guide
Finance and data
Finance and data

Claude and NetSuite Setup Guide

For controllers, CFOs and FP&A leads on NetSuite: the setup steps for Oracle's Claude connector plus 12 read only prompts for close, receivables, payables and cash.

Setup guide
Get the free kitBook a call

Share with your workflow owner.

Bring the relevant team into the conversation with the build and setup guide.

Forward by email
in one line

What is Free Portfolio Risk Budget Checklist?

Free Portfolio Risk Budget Checklist is a finance and data build in the consultance.ai AI Build Library. For allocators, family office CIOs and multi asset PMs: a 12 prompt Claude checklist for where your portfolio's risk comes from, drift against policy ranges, and tracking error against your benchmark, on qis and your own holdings. It fits Allocators, family office CIOs, endowment and pension investment staff, and multi-asset portfolio managers who build a monthly risk report for an investment committee from custodian statements and a policy page. Setup difficulty is Technical, with 4 plain-English steps.

What does Free Portfolio Risk Budget Checklist do?

For allocators, family office CIOs and multi asset PMs: a 12 prompt Claude checklist for where your portfolio's risk comes from, drift against policy ranges, and tracking error against your benchmark, on qis and your own holdings.

Who is Free Portfolio Risk Budget Checklist for?

It fits Allocators, family office CIOs, endowment and pension investment staff, and multi-asset portfolio managers who build a monthly risk report for an investment committee from custodian statements and a policy page.

How hard is Free Portfolio Risk Budget Checklist to set up?

Technical to set up — one guided setup instruction covering 4 plain-English steps, plus 12 ready-to-run prompts on the resource page.

How would consultance.ai build this out?

We would stand the report up against your real book: custodian and administrator exports loaded each month, your policy and ranges encoded, private marks unsmoothed, the self-check enforced in the run, and the committee page in your template. Reply "wire it" for a 30 minute slot.

What are the licensing terms?

Prompt set authored by consultance.ai. qis is MIT licensed open source by Artur Sepp; we are not affiliated with it. Nothing comes to us; what Claude reads is processed under your own Claude account. This is analysis on your own data, not investment advice, and a named human signs the committee page.

Connect this build to your workflow.

Discuss how Free Portfolio Risk Budget Checklist fits your systems, controls, and team. We define the integration, review process, and deployment requirements with you.

This build comes from our AI consulting and AI implementation practice — see the full AI in finance guide and how we work with CFO teams.

Book an audit