Investment restriction
Vintage-year concentration (private markets)
Vintage-year concentration is the share of a private-markets programme's commitments made to funds of a single vintage year. Policies cap it to spread commitments across economic cycles, for example ‘no more than 25% of commitments in one vintage year’. Acclimetry groups commitments by the vintage in an approved data field and tests each year's share of all commitments in scope against the limit.
vintage_concentrationVintage-year concentration
How policies word it
Private-markets programmes commit to funds that draw capital over several years. Committing too much in one year ties the programme to the conditions of that cycle. Policies therefore pace commitments and cap any one vintage.
The cap is usually a share of total commitments, sometimes with a higher limit for a named year while a programme is built. It sits beside a limit on unfunded commitments, which caps the calls still to come.
The policy should also say what ‘vintage’ means. Funds and data providers date it differently, for example by first close or by first capital call.
- No more than 25% of total commitments in any single vintage year.
- Commitments will be paced so that no vintage year exceeds 30% of the private-equity programme.
- While the programme is being built, the 2025 vintage may reach 40% of commitments.
- Unfunded commitments to any one vintage may not exceed 35% of total unfunded commitments.
How it is measured
Each commitment is placed in the year held in the rule's vintage field. Each year's share is that year's commitments divided by all commitments in scope.
- Measure: total commitment, or unfunded commitment only.
- Scope: the private-market classes named in the rule. A holding with no commitment, such as a listed share, is out of scope.
- Limits: one general hard maximum for every year, plus optional named-year limits that replace it for those years.
Each vintage year gets its own result, with its share, headroom and the funds that contribute most. The vintage is never inferred from a first drawdown date or from a fund's name.
When it is breached and what follows
A year above its limit is a breach, and warning bounds give notice as a year approaches it. With total commitments, a breach usually follows a new commitment, which makes it an active breach.
With unfunded commitments, the shares drift on their own. Capital calls in other years shrink their unfunded amounts and raise the share of a year that has not been called.
Continuing breaches form one case, with assignment, escalation and service-level clocks. A deliberate overweight, approved for a set period, is recorded as a time-bound waiver, which leaves the result unchanged.
Data the check reads
- A stated vintage year for each fund commitment, in an approved data field
- The total commitment, or the unfunded commitment, of each fund position
- The private-market classes the rule covers, such as private equity or infrastructure
- Any named-year limits that replace the general limit
Rule parameters
The share of total commitments falling in any single vintage year must stay inside the approved band. Vintage is read from an approved governed field, never inferred.
| Parameter | In the platform | Options and help |
|---|---|---|
| fieldCode | Vintage-year field | The approved governed field carrying the fund's stated vintage year. |
| measure | Measure | commitment (Total commitment) · unfundedCommitment (Unfunded commitment) |
| vintageBands | Per-vintage limits (optional) | |
| classNames | Private-market classes |
Bounds the rule must set: hardMax
Methodology choices
- Vintage is read from an approved governed field. It is never inferred from a first-drawdown date or a fund name.
- A commitment with no recorded vintage is a data gap: it cannot be placed in a year, so the concentration cannot be settled.
Parameter names, methodology text and result-code meanings are shown exactly as the platform states them.
Worked examples, run by the engine
A 600 commitment in 2021 and a 400 in 2022 put 60% in one vintage, over a 50% cap; a listed equity with no commitment is out of scope
Rule template:vintage_concentration fieldCode: VINTAGEmeasure: commitment
Bounds: hard max 50%
| Holding | Class | Market value | Commitment | VINTAGE |
|---|---|---|---|---|
| F1 | Private Equity | 300 | 600 | 2021 |
| F2 | Private Equity | 200 | 400 | 2022 |
| EQ | Stocks | 500 | – | (blank) |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| Vintage 2021 | Breach | 60% | ≤ 50% | -10% | ABOVE_HARD_MAXIMUM |
| Vintage 2022 | Compliant | 40% | ≤ 50% | 10% | WITHIN_LIMITS |
ABOVE_HARD_MAXIMUM: The measured value exceeds the approved hard maximum, beyond any stated tolerance.WITHIN_LIMITS: The measured value sits inside every approved bound.
Largest contributors: Vintage 2021 → F1 60% · Vintage 2022 → F2 40%
These are the product's own test cases for this template, evaluated by the Acclimetry rule engine (backend commit 8197063). The build fails if any result changes.
A named vintage is measured against its own 70% limit while the rest keep the general 50% cap
Rule template:vintage_concentration fieldCode: VINTAGEmeasure: commitmentvintageBands: vintage=2021, hardMax=70
Bounds: hard max 50%
| Holding | Class | Market value | Commitment | VINTAGE |
|---|---|---|---|---|
| F1 | Private Equity | 300 | 600 | 2021 |
| F2 | Private Equity | 200 | 400 | 2022 |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| Vintage 2021 | Compliant | 60% | ≤ 50% | 10% | WITHIN_LIMITS |
| Vintage 2022 | Compliant | 40% | ≤ 50% | 10% | WITHIN_LIMITS |
WITHIN_LIMITS: The measured value sits inside every approved bound.
Largest contributors: Vintage 2021 → F1 60% · Vintage 2022 → F2 40%
These are the product's own test cases for this template, evaluated by the Acclimetry rule engine (backend commit 8197063). The build fails if any result changes.
A commitment with no recorded vintage cannot be placed in a year, so no year is settled
Rule template:vintage_concentration fieldCode: VINTAGEmeasure: commitment
Bounds: hard max 50%
| Holding | Class | Market value | Commitment | VINTAGE |
|---|---|---|---|---|
| F1 | Private Equity | 300 | 600 | 2021 |
| F2 | Private Equity | 200 | 400 | (blank) |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| Vintages | Not evaluated: data quality | – | ≤ 50% | – | MISSING_POSITION_DATA |
MISSING_POSITION_DATA: One or more positions had no readable value, and the partial numbers do not prove the outcome either way.
These are the product's own test cases for this template, evaluated by the Acclimetry rule engine (backend commit 8197063). The build fails if any result changes.
Commitments of 1,000,000 across four vintages: 2020 holds 350,000, or 35%, over the 30% cap, while the other years stay inside it.
Rule template:vintage_concentration fieldCode: VINTAGEmeasure: commitmentclassNames: Private Equity, Infrastructure
Bounds: warn max 27% · hard max 30%
| Holding | Class | Market value | Commitment | VINTAGE |
|---|---|---|---|---|
| Buyout Fund A | Private Equity | 180,000 | 350,000 | 2020 |
| Buyout Fund B | Private Equity | 260,000 | 250,000 | 2021 |
| Infrastructure Fund C | Infrastructure | 120,000 | 200,000 | 2022 |
| Growth Fund D | Private Equity | 60,000 | 200,000 | 2024 |
| Global equity fund | Equities | 900,000 | – | (blank) |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| Vintage 2020 | Breach | 35% | ≤ 30% warning ≤ 27% | -5% -8% to warning | ABOVE_HARD_MAXIMUM |
| Vintage 2021 | Compliant | 25% | ≤ 30% warning ≤ 27% | 5% 2% to warning | WITHIN_LIMITS |
| Vintage 2022 | Compliant | 20% | ≤ 30% warning ≤ 27% | 10% 7% to warning | WITHIN_LIMITS |
| Vintage 2024 | Compliant | 20% | ≤ 30% warning ≤ 27% | 10% 7% to warning | WITHIN_LIMITS |
ABOVE_HARD_MAXIMUM: The measured value exceeds the approved hard maximum, beyond any stated tolerance.WITHIN_LIMITS: The measured value sits inside every approved bound.
Largest contributors: Vintage 2020 → Buyout Fund A 35% · Vintage 2021 → Buyout Fund B 25% · Vintage 2022 → Infrastructure Fund C 20%
Computed at build time by the Acclimetry rule engine (backend commit 8197063); the same code runs in the product.
Interpretation traps
Vintage is a stated fact, not an estimate
Acclimetry never infers vintage from a drawdown date or a fund name. Choose one definition, record it as an author decision, and load the same definition for every fund.
One missing vintage blocks every year
Every year shares one denominator, so a commitment with no vintage leaves all the shares unsettled. The result is not evaluated (data quality), unless the rule version chose a conservative-breach policy.
Total and unfunded answer different questions
Total commitment shows how evenly the programme was paced. Unfunded commitment shows where future calls will come from, and a fully called fund contributes nothing to it.
Result codes this check can return
| Code | State | Meaning | What to do |
|---|---|---|---|
| WITHIN_LIMITS ✓ | Compliant | The measured value sits inside every approved bound. | – |
| ABOVE_WARNING_MAXIMUM | Warning | The measured value has crossed the early-warning maximum but not the hard limit. | No breach yet; the early-warning band exists so the position can be managed before one. |
| BELOW_WARNING_MINIMUM | Warning | The measured value has crossed the early-warning minimum but not the hard limit. | No breach yet; the early-warning band exists so the position can be managed before one. |
| ABOVE_HARD_MAXIMUM ✓ | Breach | The measured value exceeds the approved hard maximum, beyond any stated tolerance. | Remediate the exposure, or record an approved waiver against the case. |
| BELOW_HARD_MINIMUM | Breach | The measured value falls below the approved hard minimum, beyond any stated tolerance. | Remediate the exposure, or record an approved waiver against the case. |
| CONSERVATIVE_MISSING_DATA | Breach | Data was missing and this rule version's approved unknown-data policy is conservative_breach, so the gap is treated as a breach rather than as Not Evaluated. | Supply the missing values; the reading is deliberately pessimistic until you do. |
| EMPTY_PORTFOLIO | Not applicable | The portfolio held no positions at the evaluation moment. | – |
| NO_MEASURED_POSITIONS | Not applicable | No position in the portfolio fell inside this rule's measured population. | – |
| NOT_IN_SCOPE | Not applicable | This rule version does not apply to this portfolio — the portfolio is outside the version's stated scope. Recorded so that "considered and out of scope" can be told from "never run". | – |
| AGGREGATE_MEMBER_NOT_ACCEPTED | Not evaluated: data quality | A portfolio in the measured set has no authoritative snapshot, so the set-level number cannot be stated. | Accept the named portfolios' snapshots. A partial set produces no aggregate. |
| MISSING_POSITION_DATA ✓ | Not evaluated: data quality | One or more positions had no readable value, and the partial numbers do not prove the outcome either way. | Supply the missing valuations. The platform will not fabricate a zero to produce a reading. |
| SNAPSHOT_NOT_ACCEPTED | Not evaluated: data quality | The portfolio's newest snapshot awaits data-quality review; only accepted data may produce an authoritative result. | Accept, override or reject the snapshot on Data & Quality. |
| SNAPSHOT_REJECTED | Not evaluated: data quality | The portfolio's newest snapshot was rejected, so there is no authoritative data to measure. | Load a corrected file. |
| STALE_POSITIONS | Not evaluated: data quality | The newest snapshot is older than the organisation's staleness threshold. | Load current positions, or revisit the threshold on Data & Quality ▸ Policy. |
| STALE_PRICES | Not evaluated: data quality | A holding had no price on the position file and its approved price was older than the organisation's price-staleness threshold, so it was left unvalued. | Load a current price for the holding, price it on the position file, or revisit the threshold on Data & Quality ▸ Policy. |
| AWAITING_EXTERNAL_DATA | Pending external data | An approved input is late but still inside the organisation's grace window. This is not a pass and not an exception. | None yet. If the delivery does not arrive, this becomes a data-quality exception. |
| METHOD_NOT_SUPPORTED | Not evaluated: unsupported | The rule version asks for a measurement method this engine does not implement. Declared rather than approximated. | Choose a supported methodology, or treat this limit as a manual obligation until the method ships. |
| EVALUATOR_ERROR | Not evaluated: system error | The evaluator raised an error. Surfaced as a visible result rather than as silence. | Report it. A system error is never a pass and never a compliant reading. |
✓ seen in the worked examples. The rest come from the platform registry’s own scan of the template source.
Acclimetry evaluates each vintage year's share of the in-scope commitments, by total or unfunded commitment, against a general hard maximum and any named-year limits. It reads the vintage from an approved field and the amounts from position data. It does not infer vintages, model capital calls or distributions, or build pacing plans.
Questions
What is a vintage year?
The year a private fund is treated as starting to invest. Definitions differ, for example first close or first capital call, so the policy should name the one its data uses.
Can Acclimetry work out a fund's vintage?
No. The vintage is read from an approved data field and is never inferred from a drawdown date or a fund name.
Does a fully drawn fund still count?
Under the total-commitment measure, yes: its whole commitment stays in its year. Under the unfunded measure it contributes nothing once all its capital has been called.