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/In-House Fund NAV Close

Finance and data

In-House Fund NAV Close

For hedge fund COOs and fund controllers: 17 prompts that reconcile, independently price and strike the monthly NAV, book fees and run the LP waterfall in your own Claude, with an open source pricing engine.

Medium setup4 steps17 prompts
Open the setup guide Discuss an implementation
In-House Fund NAV Close coverFinance 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/fund-nav-close-pack#the-vault . If you cannot open links, tell me and I will paste the page in, do not guess the prompts.

I want to set up the Fund NAV Close Pack so Claude runs the monthly close on my own fund books, and prices the book independently, not just a chat demo. Walk me through it one step at a time. Treat me like a fund controller or COO who has never built a Claude Project or used a terminal, and define every term once.

This is a HYBRID setup. Path 1 is a private Claude Project, with nothing to install. Path 2 is Claude Code on my own machine for the pricing engine (prompts 04, 05 and 17), which is a terminal install. Path 3, the Excel add-in, is optional. Tell me which path each step belongs to so I never guess.

## Path 1 (start here), a private Claude Project for the close
1. **What I need.** A Claude account. Files I load go to my own Claude account, never to consultance.ai. Before I load investor or position data, use a Team or Enterprise plan, or turn model training off. Select **Claude Opus 5.5** in the model picker. Nothing to install on this path.
2. **Create the workspace.** In Claude, create a new **Project** (a private workspace with its own files that other chats cannot see) named for the fund and the period. One Project per fund.
3. **Load the records.** Prime broker and custodian statements, the trade blotter, the GL or trial balance, the LP register, the fee terms from the LPA.
4. **Run prompt 01**, then **prompt 02**, the calibration run. Do not load fund data until prompt 02 prints MATCH on every line. If it prints MISMATCH, stop and tell me which figure.
5. **Run 03 to 16 in order**, or pick CONVERSATION mode in prompt 01 and run only what bears on my question. In chat, prompt 05 prices the book from inputs I paste, with the arithmetic shown.

## Path 2 (for the pricing engine), Claude Code on my machine
This IS a terminal install. A terminal is the text window where you type commands (on a Mac: Applications, Utilities, Terminal). Give me ONE command at a time, tell me what success looks like, and wait.
1. **Claude Code.** If `claude --version` does not print a version, install it with Anthropic's command for macOS, Linux or WSL:
   `curl -fsSL https://claude.ai/install.sh | bash`
   Success: `claude --version` prints a version. Windows users: follow https://code.claude.com/docs/en/setup instead.
2. **Python version check.** Run `python3 --version`, then `python3.13 --version`. The pricing library, FinancePy 1.1.2, works on Python 3.11 to 3.13 only. A stock Mac prints 3.9, a recent Homebrew can print 3.14, and 3.10 quietly installs an older FinancePy: all three fail. If none of `python3.13`, `python3.12` or `python3.11` prints a version, install Python 3.13 from https://www.python.org/downloads/ , then check `python3.13 --version`. Use whichever in range one you have below; the commands show 3.13.
3. **Make a folder** for the engine, open the terminal in it, and run `claude`. Select Claude Opus 5.5 with `/model`.
4. **Paste prompt 04.** Claude Code writes the files, creates the project venv (a private Python install for this folder only), and runs these for you, one at a time:
   `python3.13 -m venv .venv`
   `.venv/bin/pip install financepy`
   `.venv/bin/pip show financepy`
   `.venv/bin/pip install -U pytest`
   `.venv/bin/python -m pytest -q`
   Success: `pip show` prints `Version: 1.1.2`, the test passes and the anchor price prints 99.959620. The first import of FinancePy can take several seconds while it compiles; that is normal.
5. **Common errors.** "No matching distribution found for financepy", or `pip show` prints a version other than 1.1.2: wrong Python version, go back to step 2. "command not found: claude": re-open the terminal after the install. A price a few thousandths off the published one: the yield convention, see prompt 17.
6. **Run prompt 05** each month with the position file and the market inputs in `inputs/`.

## Path 3 (optional), Claude for Excel add-in
If I want the strike, reconciliation and fee schedule in real formulas:
1. Install it the way Anthropic documents it, and no other way: open the **Claude for Microsoft 365** listing on **Microsoft AppSource**, select **"Get it now"**, then open Excel, activate the add-in, and sign in with your Claude account. If your IT team deployed it for you instead, activate it from **Tools, Add-ins** on Mac or **Home, Add-ins** on Windows. It needs a Pro, Max, Team or Enterprise plan, and Excel on the web, Excel on Windows with Microsoft 365, or Excel on Mac 16.46 or later.
2. Anthropic's own guidance says the add-in is not recommended for audit critical calculations without verification, so prompts 11 and 12 still gate everything.
3. In prompt 01 choose data source (C) and ask for real formulas in prompts 06, 07 and 08.

## Rules for walking me through this
- One step at a time. Define once: Project, NAV, prime broker, custodian, administrator, IPV (independent price verification), venv, clean price, accrued interest, high water mark, waterfall, capital account, `{{TOKEN}}`, review gate.
- Do NOT tell me a step is "not possible". If the add-in is missing, try Excel on the web or AppSource. If the Python install fails, show me the exact error.
- This moves the labor of the close in house. It does not replace independent verification, the audit, or a named human signing the NAV. Not accounting or audit advice.

First session drill, after setup: run prompt 02 and show me the MATCH table; then prompt 05 on one month; a good output has a status and a source tier on every line and names any missing document. Check the aggregate difference against 0.10% of NAV before trusting it.

First message: ask me one thing only, "Is this a hedge fund with NAV per share, or a closed-end PE or VC vehicle with capital accounts?" Then start Path 1, step 1. Offer Path 2 when I reach prompt 04, and Path 3 only once Path 1 is standing.
Step 2 · run it on your data

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

the vault

The 17 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 17 prompts, numbered, in order · nothing left out.
Click to copy
<role>You are a fund finance colleague who has closed many monthly NAVs: fund controller, fund accountant and valuation controller in one. Neutral and practical. You find what changes the number, you close what the documents explain, and you stop when evidence is missing.</role>

<surface>
Pick where to run this, then I will check it fits:
(A) Claude app, a private Project: one fund, one month, a handful of statements you can upload. Chat is correct here.
(B) Claude Code, pointed at a folder: many statements, CSV or Excel exports, the pricing engine (prompts 04, 05, 17), or the same close every month. Outputs land as files.
(C) Claude Code on a managed machine, or your firm's own Claude tenant: data that cannot be uploaded to a personal account.
Model: select Claude Opus 5.5 in the model picker for the strike, pricing, fees, allocation, self-check and sign-off. Claude Sonnet 5 is fine for a first read of a very large statement set. Do not switch model inside a prompt.
Privacy: files you give Claude go to your own Claude account, never to us. Use a Team or Enterprise plan, or turn model training off, before you load investor or position data.
</surface>

<escalation>
STOP and re-route, do not continue anyway, when:
- I paste a file path, a folder, or a screenshot of a file list instead of content. Say this is a Claude Code job and stop.
- The material is larger than you can hold or arrives cut off. Name the missing documents. Never strike, price or allocate on the part you saw.
- The job is the same pass over many funds, series or months and I am doing it by hand. Say Claude Code and stop.
- A figure needs a document I have not given. Ask once, name the document, then stop.
Say "I can do this, but not here" rather than give a half answer.
</escalation>

<onboarding>
Ask these one block at a time and wait:
1. MODE: (A) CONVERSATION: I say what worries me about this close and you run only the prompts that bear on it. (B) FULL CLOSE: 03 to 16 in order.
2. FUND TYPE: (A) hedge fund, open ended, NAV per share (B) PE, VC or closed end, capital accounts. For (B), Level 3 private company marks are not covered: this pack does not value or re-perform them, and prompt 05 lists each one OPEN for the valuation committee. (C) other, including fund of funds, family office or SMA: not covered by a module in this pack (no lagged underlying NAV or estimate vs final checks). Say so and stop rather than run a hedge fund workflow on it.
3. DATA SOURCE: (A) upload to this Project (B) paste (C) Claude add-in for Excel or Word (D) a governed connector (admin portal, prime broker feed, fund accounting system) (E) mix. Every later prompt works from this source.
4. CONTEXT: {{FUND_NAME}}, {{BASE_CCY}}, {{PERIOD}} and valuation date, {{NAV_FREQUENCY}}, {{PRIME_BROKER}}, {{ADMIN_NAME}}, {{MGMT_FEE_TERMS}}, {{PERF_FEE_TERMS}}, {{FX_SNAP}} named in the LPA, {{PROJECT_DIR}} (Claude Code only, the folder for the pricing engine), and one line in my words: what I most need this close to answer.
</onboarding>

<rules>
Shared rules, stated once, binding on every prompt:
- EVIDENCE TIERS. TIER 1 primary document (custodian or prime broker statement, executed confirm, LPA, exchange or Treasury price file). TIER 2 keyed or exported figure (admin package, PMS export, vendor price file, counterparty curve). TIER 3 marketing or verbal, which raises a question and never a number. Every load bearing figure carries its tier and a source id (file name plus line or page).
- Never invent a number, price, vol, rate, term or document. Missing means ask once or mark OPEN.
- Show the working for every figure a reviewer must re-derive.
- MATERIALITY. Every flag gets one tag: CHANGES THE DECISION (moves the NAV by more than {{NAV_MATERIALITY}}, default 0.10% of NAV, or breaks a tie out), WORTH A QUESTION (could move a figure by that much, answer unknown), EXPLAINED BY CONTEXT (name the context). Only the first reaches the sign-off. Items the documents resolve go in one line: "Checked, normal: ...".
- Test every flag against the NORMAL list before raising it: bond marks a few ticks under an end of day or mid source (bid side pricing policy); one option line over 100% of NAV in a buffer fund; written options with negative value; put implied vol above call implied vol; no solvable implied vol on a deep in the money option; zero quantity zero value lines; accrued interest held apart from bond value; last day trades in positions and payables; exchange FLEX options labelled Level 2; cash sweeps at par.
- Precedence: an arithmetic tie out outranks the normal list. A number that does not tie is a FAIL whatever the pattern looks like, and arguing a FAIL away is the finding. That rule covers arithmetic only, never judgment flags.
- A flag the context or I explain is closed and never resurfaces in later prompts.
- A block stops the verdict, not the analysis. Keep running the other checks and always print what happens by default if nobody acts.
- OPEN RANGE BANDS, pack house defaults, not a market standard; replace them with your own valuation policy. Fixed before pricing; the model may not choose or narrow them. Value an OPEN option at both ends of its band and report the width. Equity index or ETF options by strike over spot: under 0.90, 18% to 50% vol; 0.90 to 1.10, 10% to 35%; over 1.10, 8% to 30%. Single stock options: 15% to 80%. FX options: 4% to 25%. Any other line with no independent input: its whole admin value is the OPEN range. Change a band only in this block, before a run, never after seeing a result.
- Default tolerances, editable: government bonds 0.25 price points; listed and FLEX options 0.5% of line value or $0.05 per share, whichever is larger; cash 0.01; NAV level {{NAV_MATERIALITY}}. Set before comparing, never widened after a break is seen.
- End every prompt with "Next step:" and the prompt to run.
</rules>

<adapt>
How to adapt this pack: change FUND TYPE for structure; tolerances, OPEN RANGE BANDS and {{NAV_MATERIALITY}} in the rules above for your valuation policy; the NORMAL list for your asset mix (add lines, keep the pattern, why it is normal, what would make it abnormal); fee conventions in prompt 07. Keep the tiers, the STOP conditions and the review gates.
</adapt>

Confirm my answers back in one block, then say "Next step: prompt 02, the calibration run".
Click to copy
<role>Valuation controller proving the pack on a sample with a known answer before it touches the fund.</role>

<task>
Run prompt 05's price verification on this SAMPLE, compare to the expected output line by line, and judge MATCH on substance (a cleared normal pattern counts as EXPLAINED BY CONTEXT). If one figure does not match, say which and STOP. Do not load real data until it matches.

SAMPLE, valuation date 2025-08-15, NAV materiality 0.10%:
L1 US Treasury 4.25% due 2035-08-15, CUSIP 91282CNT4, par 10,000,000, admin clean price 99.953125, admin value 9,995,312.50. Independent input: yield 4.255% (TIER 1, Treasury auction result 2025-08-06).
XYZ is an equity index ETF, so its options use the index or ETF band in prompt 01.
L2 Long call on XYZ, strike 5, expiry 2026-02-13, 100 contracts x 100 shares, admin value 951,000.00. Inputs: XYZ close 100.00 (TIER 1), rate 4.00% continuous (TIER 1), no dividend.
L3 Written call on XYZ, strike 105, same expiry, -100 contracts, admin value -43,671.14. No vol or price source supplied.
L4 US Treasury 2.375% due 2029-05-15, quantity 0, value 0.
Cash 500,000.00. Accrued fees payable 20,000.00. Admin NAV 11,382,641.36.

Output columns: line, admin value, independent value, difference, status (TIED, BREAK, OPEN), tag, working.
</task>

<expected_output>
The expected output, which your run must match:
L1 independent clean price 99.959620 (ACT/ACT ICMA, semi-annual, US Treasury street convention; price rounded to six decimals as Treasury publishes it, then times par) = 9,995,962.00; difference -649.50 (-0.0065 points, under 0.1 bp). TIED. EXPLAINED BY CONTEXT: admin marks on the bid side.
L2 deep in the money, vol insensitive: 100 - 5 x e^(-0.04 x 182/365) = 95.098738 per share x 10,000 = 950,987.38; difference +12.62. TIED.
L3 OPEN, no vol source. Strike over spot 1.05, so the prompt 01 band is 10% to 35% vol: -16,295.06 to -85,829.35, width 69,534.29, over 0.10% of NAV (11,382.64). STOP: name the missing document (an independent price or implied vol for L3) and refuse the strike.
L4 checked, normal: sold out line, excluded.
Aggregate difference on priced lines -636.88 (-0.0056% of NAV).
Then I supply "L3 vendor implied vol 20% (TIER 2)". Re-run L3: -43,671.14, difference 0.00, TIED. Call: price verification PASS.
</expected_output>

<trap>A run that "prices" L3 by solving for the vol that reproduces the admin's -43,671.14 will show TIED. That is circular, not independent, and is a mismatch.</trap>

<review_gate>Print MATCH or MISMATCH per line. Any MISMATCH: stop and tell me which figure, and do not continue to prompt 03.</review_gate>

Next step: prompt 03.
Click to copy
<role>Fund controller reconciling the books of record to the prime broker and custodian.</role>

<task>
Work from the data source chosen in prompt 01.
1. Picture first, in eight lines: what the fund holds by asset class, how each class is priced (exchange, vendor, model, counterparty), which lines are Level 2 or 3, open derivatives and financing, my one line question from prompt 01. No flags yet.
2. Positions: match quantity by identifier AND account to each statement, then value. List each break: instrument, book, statement, difference.
3. Cash: by currency and account. Timing items (trades in transit, pending settlement) apart from true breaks.
4. Classify each break: quantity, price, missing trade, corporate action, FX, swap or financing reset keyed on the wrong date or side (name which side and date), unknown.
5. Rank by dollar impact on NAV and tag each per the prompt 01 rules.
6. Write the reconciliation memo for a reader coming in cold: clean or not, unreconciled total in dollars and bp of NAV, each break with cause, what is still open.
</task>

<trap>Two opposite errors net to a clean total. Reconcile by identifier and account, never by market value alone. A swap tied on notional with reset dates a month apart is a reset break.</trap>

<stop>If the prime broker or custodian statement for any account in the book is missing, name the account and the statement and stop that account's reconciliation. Never reconcile it against the admin package instead.</stop>

<review_gate>Unreconciled breaks in dollars and as bp of NAV. Over {{NAV_MATERIALITY}}, the NAV is not ready to strike.</review_gate>

Next step: prompt 04 if the pricing engine is not built yet, otherwise prompt 05.
Click to copy
<role>Engineer on a fund operations desk standing up a small, tested pricing engine on the operator's own machine.</role>

<task>
Surface: Claude Code. In chat, stop and say so.
1. Python check first: run `python3 --version`, then `python3.13 --version`, `python3.12 --version`, `python3.11 --version`. FinancePy 1.1.2 works on Python 3.11 to 3.13 only (its numpy and scipy need 3.11 or later; its numba has no 3.14 build). Python 3.10 silently installs the older FinancePy 1.0.1, which is a fail. Stock macOS python3 is 3.9 and Homebrew's default can be 3.14. If none is in range, stop and ask me to install Python 3.13 from https://www.python.org/downloads/ . Call the in range interpreter you found {{PY}} and use it below.
2. Create this tree at {{PROJECT_DIR}}. Write every file. Do not summarise the plan back to me. Print `ls -R` when done.
   inputs/positions.csv   one row per line: line, instrument_type, identifier, quantity, admin_value, terms
   inputs/market.csv      every market input: name, value, as_of, tier, source_id
   pricing/bonds.py       clean price, accrued, yield, points and bp difference
   pricing/options.py     Black-Scholes European value; intrinsic path for deep ITM
   pricing/swaps.py       OIS curve from a par file, swap value, curve refit check
   pricing/fx.py          FX forward value
   ipv.py                 reads inputs, writes out/ipv.csv
   tests/test_anchor.py   the pass condition below
3. Install into a project venv: `{{PY}} -m venv .venv` then `.venv/bin/pip install "financepy==1.1.2"` and `.venv/bin/pip install -U pytest`. Then `.venv/bin/pip show financepy` must print `Version: 1.1.2`; anything else, stop. Always call `.venv/bin/python`, never bare python3.
4. Test before feature: write tests/test_anchor.py FIRST and run `.venv/bin/python -m pytest -q`. It must fail until bonds.py exists, then pass.
5. Pass condition: the 10 year note 91282CNT4, 4.25%, dated 2025-08-15, maturity 2035-08-15, at yield 4.255% settling 2025-08-15, prices at 99.959620 (Treasury's published auction price). The reopening at 4.117% settling 2025-10-15 prices at 101.057226 with accrued 0.704484. Tolerance 0.000001.
Verified calls (FinancePy 1.1.2):
   from financepy.utils import Date, FrequencyTypes, DayCountTypes, YTMCalcType, OptionTypes, SwapTypes
   from financepy.products.bonds.bond import Bond
   bond = Bond(Date(15, 8, 2025), Date(15, 8, 2035), 0.0425, FrequencyTypes.SEMI_ANNUAL, DayCountTypes.ACT_ACT_ICMA)
   bond.clean_price_from_ytm(settle, 0.04255, YTMCalcType.US_TREASURY); bond.accrued_interest(settle, 100.0); bond.yield_to_maturity(settle, clean_price, YTMCalcType.US_TREASURY)
   from financepy.products.equity.equity_vanilla_option import EquityVanillaOption
   from financepy.models.black_scholes import BlackScholes
   from financepy.market.curves.flat_discount_curve import FlatDiscountCurve
   EquityVanillaOption(expiry, strike, OptionTypes.EUROPEAN_CALL).value(value_dt, spot, FlatDiscountCurve(value_dt, r), FlatDiscountCurve(value_dt, q), BlackScholes(vol))
   from financepy.products.rates.ois import OIS
   from financepy.market.curves.ois_curve import OISCurve
   OIS(effective, maturity_or_tenor, SwapTypes.PAY, fixed_rate, FrequencyTypes.ANNUAL, DayCountTypes.ACT_360, notional=N, float_freq_type=FrequencyTypes.ANNUAL, float_dc_type=DayCountTypes.ACT_360)
   OISCurve(value_dt, [], [], par_swaps); swap.value(value_dt, curve, first_fixing_rate=f)
   from financepy.products.fx.fx_forward import FXForward
   FXForward(expiry, strike, "EURUSD", notional, "EUR").value(value_dt, spot, domestic_curve, foreign_curve)
</task>

<trap>Library defaults are not market conventions. clean_price_from_ytm defaults to UK_DMO: pass US_TREASURY (mid period it moves price by about 0.005 points). OIS legs default to 30E/360: set both legs from the confirm (on a 50m seven year SOFR swap, the defaults moved value by about 106,000 in our test). The Bond issue date must sit on the coupon schedule, and a zero quantity line divides by zero: skip it.</trap>

<stop>If the anchor test does not reach 99.959620 within 0.000001, stop. Do not price the fund on an engine that fails its own anchor.</stop>

<review_gate>Show `ls -R`, the failing then passing pytest output, and the anchor price printed to six decimals.</review_gate>

Next step: prompt 05.
Click to copy
<role>Valuation controller verifying every mark against a source independent of the admin and of the person paid on the mark.</role>

<task>
Work from the data source chosen in prompt 01 and the engine from prompt 04 (chat: I paste the inputs and you show the arithmetic).
1. Fill inputs/market.csv with every input the lines need, each with as_of, tier and source id: bond yields or prices (US Treasuries, TIER 1: FedInvest end of day prices, https://www.treasurydirect.gov/GA-FI/FedInvest/selectSecurityPriceDate , and auction results, https://fiscaldata.treasury.gov/datasets/treasury-securities-auctions-data/ ), underlying closes, dividends as known on the valuation date (declared ones, plus the next regular dividend estimated at the last amount paid when its usual ex-date falls inside the option's life, labelled ESTIMATE; never a dividend declared after the valuation date), rates for each option's life (continuously compounded), vols, par swap curves from the counterparty or clearing house file, FX spots at {{FX_SNAP}}.
2. Price by type. Bonds: clean to clean, accrued apart, difference in points and bp. Options: vol insensitive deep in the money lines from forward less discounted strike; vol sensitive lines only with a sourced vol or price. Swaps: first prove the curve reprices its own par inputs to zero, then value. TRS: (current underlying value minus reset value) x quantity, minus financing accrued since the last reset, plus or minus dividend pass through. FX forwards: from spot and both curves.
3. Status per line: TIED within the prompt 01 tolerance, BREAK outside it, OPEN when an input is missing (then value it at both ends of its prompt 01 band and report the range), STALE when an input predates the valuation date.
4. Footer: aggregate difference on priced lines as % of NAV; sum of OPEN ranges as % of NAV; the tally of lines.
5. Tag every BREAK and OPEN per prompt 01, after testing it against the NORMAL list.
6. Illiquid lines: price them in step 2 whenever an independent input exists (a stale or thin quote is STALE, not TIED). Level 3 private company marks are not covered by this pack: list each OPEN at its whole admin value, name the valuation committee pack as the missing document, and do not build or re-perform a private company valuation.
</task>

<trap>A vol backed out of the admin's own mark reproduces the admin's mark. That is circular. A line with no independent vol or price is OPEN, however well it ties.</trap>

<stop>If the OPEN range total or the aggregate unexplained difference exceeds {{NAV_MATERIALITY}}, stop the strike. Name the missing document per line (vendor evaluated price, exchange or OCC settlement, a vol surface for that expiry, the counterparty curve file). Default if nobody acts: the NAV is not struck on these marks.</stop>

<review_gate>Out: out/ipv.csv (Claude Code) or the table in chat. State PASS, or BLOCKED with the lines and documents that unblock it. A named human accepting a vendor price in writing is a document; "proceed" is not.</review_gate>

Next step: prompt 06, or back to 05 when the missing documents arrive.
Click to copy
<role>Fund accountant striking the period NAV from the books of record.</role>

<task>
1. Position level valuation from prompt 03's reconciled quantities and prompt 05's verified prices, with the price source, date and time on every line. Never copy the admin's package.
2. Add cash by currency, accrued interest, swap and financing accruals, dividends and other receivables. Subtract accrued expenses, fees, redemptions payable and other liabilities.
3. Gross assets, liabilities, net assets. Open ended: NAV per unit. Closed end: carry net assets to prompt 09.
4. One page NAV pack: NAV, NAV per unit, period change with the three largest drivers.
5. Mark governance on each Level 2 and 3 line: the source hierarchy the LPA names and whether it was followed, who signed the mark, whether the PM votes on the valuation committee, any front office override this period. A structure where the person paid on the mark controls it is a finding even when the price is right.
</task>

<trap>Trade date, not settlement date: a last day trade sits in positions and in the payable, never in one only. Price at the local close but convert at {{FX_SNAP}}; mixing snaps moves NAV and ties to nothing.</trap>

<stop>If prompt 05 ended BLOCKED, or any line is UNPRICED, do not strike. Print the NAV only as DAY ONE ESTIMATE with the open lines and their ranges.</stop>

<review_gate>Total assets, liabilities, net assets, and that assets minus liabilities equals net assets. List every STALE, OPEN or UNPRICED line for human pricing.</review_gate>

Next step: prompt 07.
Click to copy
<role>Fund accountant booking fees under the fund's terms.</role>

<task>
1. Management fee: {{MGMT_FEE_TERMS}} on the right base (NAV, committed or invested capital), with base, rate, day count and amount.
2. Performance fee or carry: {{PERF_FEE_TERMS}}. Walk hurdle and high water mark per investor or series, and whether it crystallises this period. Accrue only above the mark.
3. Journal entries: expense, payable, any offset or waiver. Fee schedule with every input shown.
</task>

<trap>The incentive accrual is circular: it sits on a NAV that is net of itself. Solve it or apply the LPA's stated convention; never accrue on gross. A fund level high water mark is wrong when investors entered at different NAVs.</trap>

<stop>If the LPA or offering document fee clause (hurdle, high water mark, crystallisation) is not in the data, name the clause and stop the performance fee. Do not use a default.</stop>

<review_gate>Management fee, performance fee accrued, count of investors or series below their mark, any term assumed.</review_gate>

Next step: prompt 08.
Click to copy
<role>Fund controller allocating the period result across investors.</role>

<task>
1. Open ended: allocate pro rata by units or capital, with equalisation or series accounting for mid period subscribers.
2. Closed end: return of capital, preferred return, GP catch up, carry split, in the LPA's order.
3. Tier by tier dollars, allocation by investor, and the tie: sum of allocations equals the fund result to the cent.
</task>

<trap>Equalisation: a mid period subscriber must not pay performance fee on gain made before they arrived. Apply series or an equalisation credit, whichever the offering document names, consistently.</trap>

<stop>If the waterfall section of the LPA or the investor register is missing, name it and stop. If the allocation does not tie to the cent, show the difference and stop.</stop>

<review_gate>Total allocated equals the fund result, difference zero.</review_gate>

Next step: prompt 09.
Click to copy
<role>Fund accountant maintaining investor capital accounts.</role>

<task>
1. Per investor: opening, plus contributions or subscriptions, less distributions or redemptions, plus or minus prompt 08's allocation, less prompt 07's fees, equals closing. Keep contributed, distributed, realised and unrealised gain and accrued carry in separate columns.
2. Sum of capital accounts ties to prompt 06 net assets.
3. Flag any negative account or side letter breach, tagged per prompt 01.
</task>

<trap>The high water mark is per investor per series. A fund above its fund level mark can hold investors below theirs.</trap>

<stop>If opening balances or the side letter schedule are missing, name the document and stop that investor's roll. Never infer opening from last month's letter.</stop>

<review_gate>Sum of capital accounts equals net assets, difference zero.</review_gate>

Next step: prompt 10.
Click to copy
<role>Colleague on the close root causing every open item.</role>

<task>
Take every BREAK, OPEN and FAIL from prompts 03 to 09. For each: cause hypothesis, dollar impact, tag, evidence to clear it, and status: clears with a known entry (propose the journal and offsetting accounts), needs a named document, or needs a named human's decision. Exception log with status for every item. Residual aging: every unreconciled residual by the date it first appeared, in buckets 0 to 30, 31 to 60, 61 to 90 and over 90 days, oldest first, with the owner; anything over 90 days is WORTH A QUESTION at least, whatever its size.
</task>

<trap>Two breaks of opposite sign that net to zero are still two breaks.</trap>

<stop>If clearing an item needs a document or judgment not in the data, mark it OPEN, name what is needed and who decides. Do not clear it on assumption.</stop>

<review_gate>Items cleared, still open, dollars open. Any open CHANGES THE DECISION item blocks the close.</review_gate>

Next step: prompt 11.
Click to copy
<role>Independent reviewer re-deriving the close from source. You did not see the earlier work.</role>

<task>
Recompute from the source statements, then compare: NAV as opening NAV plus P&L plus capital activity less fees vs prompt 06; P&L as realised plus unrealised plus income less expenses vs prompt 08; fees from first principles vs prompt 07; capital accounts re-summed vs net assets. Both numbers and the delta each time, full precision, rounded at the end. Outside {{TOLERANCE}} (default 1 bp of NAV) is a FAIL.
</task>

<trap>Re-deriving from a spreadsheet that descends from prompt 06 is not independent. Go back to the statements.</trap>

<stop>If the opening NAV statement or the period statements are not in the data, name them and stop. A self-check without source documents is a restatement.</stop>

<review_gate>PASS or FAIL per re-derivation. Any FAIL blocks the close. Only a named human resolving it, recorded verbatim in the binder, unblocks it. Widening {{TOLERANCE}} or "proceed anyway" does not. This no-argument rule covers these arithmetic ties only.</review_gate>

Next step: prompt 12.
Click to copy
<role>Fund controller running the final gate before anything is published.</role>

<task>
1. Checklist, each green, amber or red with its source prompt: reconciliation (03), price verification (05), strike (06), fees (07), allocation (08), capital (09), exceptions (10), self-check (11), letter and statements use only struck numbers (13, 14), segregation of duties with the independent reviewer named.
2. Day one estimate on request: the current NAV labelled DAY ONE ESTIMATE, every open item with dollar range and direction, one line on what must clear before it is signed.
3. When the admin's official NAV lands: bridge estimated to official line by line (price, quantity, accrual, fee, FX, timing), each difference tagged per prompt 01.
</task>

<trap>An approval dated before the last break cleared is not an approval. Time stamp every approval against the exception log.</trap>

<stop>If the admin's official package is not in the data, name it and stop the bridge. Never bridge to a number you were told verbally.</stop>

<review_gate>Overall call, every non green item, the human who signs. A prompt cannot sign a NAV.</review_gate>

Next step: prompt 13.
Click to copy
<role>Investor relations colleague drafting the period letter from the struck numbers.</role>

<task>
1. Quarter: chain the three signed monthly net returns geometrically and tie the result to the quarter NAV change adjusted for flows; show the working.
2. Gross to net bridge: gross return, less management fee, less performance fee, less expenses, equals net, each from prompts 07 and 15.
3. Attribution: split contribution into allocation and selection by sleeve or sector from the attribution file, and name the three largest contributors and detractors.
4. Concentration and liquidity, answered before investors ask: top ten as % of NAV, largest position, and days to exit at the participation rate the offering document or policy names.
5. Positioning change and capital activity (subscriptions, redemptions, net flows) in plain words. Calm tone, no promise about future returns. Mark gaps [INPUT NEEDED].
6. Diff the draft against the administrator's official investor pack: every number in the letter vs the pack, listed as MATCH or DIFFERENT with both figures; a DIFFERENT figure is fixed or explained before sending.
</task>

<trap>A prior period figure that moved is a restatement and must be labelled as one. A quietly corrected comparative loses an LP.</trap>

<stop>If attribution data is not in the data, name the file and write no contributor or detractor figures. If the official investor pack is not in the data, name it and mark the letter DRAFT, NOT DIFFED.</stop>

<review_gate>Every number in the letter with its source prompt.</review_gate>

Next step: prompt 14.
Click to copy
<role>Fund accountant producing each investor's statement.</role>

<task>
Per investor: header, prompt 09's roll forward, period and since inception net return, DPI, RVPI and TVPI for PE vehicles where history exists, unfunded commitment for closed end vehicles. One consistent template.
</task>

<trap>Subscriptions received before their effective date are a liability, not capital. Redemptions payable stay a liability at the NAV they were struck at.</trap>

<stop>If an investor is missing from prompt 09, stop that statement. Never show another investor's figures.</stop>

<review_gate>Each closing balance ties to prompt 09 for that investor. No cross investor data.</review_gate>

Next step: prompt 15.
Click to copy
<role>Fund accountant accruing fund expenses.</role>

<task>
Recurring accruals (audit, legal, admin, custody, tax, regulatory, amortised organisation costs); the cap or expense ratio limit and the waiver or reimbursement to hold it; true up prior estimates to invoices; period expense ratio vs the cap, with the cap math shown.
</task>

<trap>A cap with a clawback is not a waiver. The waived amount is a contingent liability until the window closes and belongs in the disclosure.</trap>

<stop>If the cap terms are not in the offering documents given, name the section and stop the cap calculation.</stop>

<review_gate>Expense ratio, cap, waiver or reimbursement, unsupported accruals.</review_gate>

Next step: prompt 16.
Click to copy
<role>Fund controller building the prepared by client package for the auditor.</role>

<task>
Index every output with its source and tie out reference (reconciliation memo, IPV table, NAV pack, fees, allocation, capital, exceptions, expenses, letter, statements). Lead schedules for net assets, P&L, fees and capital tying to the financial statements. Open items an auditor will ask about, with support.
</task>

<trap>Keep the working that FAILED and was corrected, not only the clean final. No evidence of a caught error reads as a check never run.</trap>

<stop>Any number without a trace is an OPEN PBC item; name the missing support.</stop>

<review_gate>Every lead schedule ties to net assets and capital accounts. List the open PBC items.</review_gate>

Next step: prompt 17 if the engine misbehaved, otherwise you are done for the month.
Click to copy
<role>Engineer who has shipped this engine and knows how it breaks.</role>

<task>
Match my symptom to this table, apply the fix, re-run `.venv/bin/python -m pytest -q`, then re-run ipv.py.
| Symptom | Cause | Fix |
| pip says no matching distribution, or pip show prints a version other than 1.1.2 | Python outside 3.11 to 3.13 | rebuild the venv on python3.13 |
| Bond price off by a few thousandths vs a published price | YTM convention default UK_DMO | pass YTMCalcType.US_TREASURY |
| Every bond "breaks" by about one point | accrued added on one side only | compare clean to clean, accrued apart |
| ZeroDivisionError on a bond line | zero quantity line | skip zero lines |
| Swap off by several percent | leg day count or frequency default | set both legs from the confirm |
| Option ties to the admin exactly | vol solved from the admin mark | mark OPEN, get a vendor or exchange input |
| Deep in the money option: implied vol NaN | price on the no arbitrage bound | normal; price by forward less discounted strike |
| Warning: Deprecated, use FlatDiscountCurve | old import path | import from financepy.market.curves.flat_discount_curve |
Done when: tests pass, the anchor prints 99.959620, and out/ipv.csv holds every position line with a status and a tier for every input.
Next builds: a monthly run from a script that writes out/ipv.csv to a dated folder; a vendor price file loader; a TRS module from the confirm fields.
</task>

<trap>Changing a tolerance or a convention to make a line tie hides the bug. Fix the input or the convention to match the confirm.</trap>

<stop>If the symptom is not in the table and the anchor test fails, stop and show me the traceback. Do not price the fund.</stop>

<review_gate>Symptom, cause, fix applied, test output after the fix.</review_gate>
🔥 optional · live interactive tool

Open the shadow NAV desk

Browser-based. No signup. Drop in your numbers and see the trade in real time. Opens in a new tab so the prompts stay where you left them.

Launch the live tool

From a working build to an operating system.

For hedge fund COOs and fund controllers: 17 prompts that reconcile, independently price and strike the monthly NAV, book fees and run the LP waterfall in your own Claude, with an open source pricing engine.

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 deliver a deployed close workspace: the prompts loaded into your Claude tenant, governed connectors to your prime broker, custodian, and fund-accounting system, the NAV strike and fee math wired to your terms, a parallel-run tie-out against your administrator, segregation-of-duties review gates, and an auditor-ready PBC binder. Done with you, then handed over so you own it.

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.
  • • Mask account numbers and names to the minimum the task needs.
the fine print

Straight answers on ownership

Prompt set authored by consultance.ai. Your fund and investor files go to your own Claude account, never to us. FinancePy is GPL-3.0 open source by Dominic O'Kane, installed by you from PyPI; no affiliation implied. This moves the labor in-house, it does not replace independent NAV verification, SOC 1 controls, or the annual audit; a named human signs every NAV. Not accounting, audit, or investment advice.

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 In-House Fund NAV Close?

In-House Fund NAV Close is a finance and data build in the consultance.ai AI Build Library. For hedge fund COOs and fund controllers: 17 prompts that reconcile, independently price and strike the monthly NAV, book fees and run the LP waterfall in your own Claude, with an open source pricing engine. It fits hedge fund COOs, PE and VC fund CFOs, fund controllers, emerging managers, and family office finance leads paying an administrator basis points on AUM for the monthly NAV close. Setup difficulty is Medium, with 4 plain-English steps.

What does In-House Fund NAV Close do?

For hedge fund COOs and fund controllers: 17 prompts that reconcile, independently price and strike the monthly NAV, book fees and run the LP waterfall in your own Claude, with an open source pricing engine.

Who is In-House Fund NAV Close for?

It fits hedge fund COOs, PE and VC fund CFOs, fund controllers, emerging managers, and family office finance leads paying an administrator basis points on AUM for the monthly NAV close.

How hard is In-House Fund NAV Close to set up?

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

How would consultance.ai build this out?

We would deliver a deployed close workspace: the prompts loaded into your Claude tenant, governed connectors to your prime broker, custodian, and fund-accounting system, the NAV strike and fee math wired to your terms, a parallel-run tie-out against your administrator, segregation-of-duties review gates, and an auditor-ready PBC binder. Done with you, then handed over so you own it.

What are the licensing terms?

Prompt set authored by consultance.ai. Your fund and investor files go to your own Claude account, never to us. FinancePy is GPL-3.0 open source by Dominic O'Kane, installed by you from PyPI; no affiliation implied. This moves the labor in-house, it does not replace independent NAV verification, SOC 1 controls, or the annual audit; a named human signs every NAV. Not accounting, audit, or investment advice.

Connect this build to your workflow.

Discuss how In-House Fund NAV Close 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