Investment restriction
Minimum diversification (holdings count, top-N weight)
A minimum diversification rule sets a floor on the number of holdings or issuers, or caps the combined weight of the largest N holdings. Typical clauses are ‘hold at least 20 different issuers’ and ‘the top 10 holdings may not exceed 40%’. Acclimetry counts distinct holdings or issuers, or ranks holdings by absolute weight against NAV, and tests the result against the approved bound.
diversificationDiversification requirement
How policies word it
Diversification is a legal duty for many trustees and a common policy principle. UK trustees must consider ‘the need for diversification’, and pension trustees must keep assets properly diversified.
A duty becomes testable once the policy turns it into a number:
- Breadth: at least 20 different issuers, or at least 30 holdings.
- Top-heaviness: the 10 largest holdings no more than 40% of the portfolio.
Some regulations use the same forms. The UCITS government-securities exception, which allows more than 35% with one issuer, requires at least six different issues. The US tax rule for variable contracts caps the largest one to four investments at 55%, 70%, 80% and 90%.
- The portfolio will hold securities of at least 20 different issuers.
- The 10 largest holdings may not exceed 40% of the portfolio.
- The equity portfolio will contain a minimum of 30 holdings.
- No single investment may exceed 55% of the account, nor any two together 70%.
How it is measured
The rule version names one measure:
- Minimum holdings: the number of distinct instruments held.
- Minimum issuers: the number of distinct issuers held. Two bonds of one issuer count once.
- Top-N weight: the N largest holdings by absolute weight, added together and divided by NAV.
Counts read distinct keys, so missing prices do not affect them. Top-N weights need a value for every holding, because an unvalued holding could belong in the top N.
Exempt classes, such as cash, can be left out of the count and the ranking. Counts return a number with headroom; top-N returns a percentage and the ranked holdings.
When it is breached and what follows
A count below the hard minimum, or a top-N weight above the hard maximum, is a breach. Warning bounds give notice, for example at 22 issuers against a minimum of 20.
Top-N breaches are often passive: a rally in the largest holdings raises their combined weight. Counts can fall after sales, mergers or takeovers that remove an issuer.
Each breach joins a case with assignment, escalation and service-level clocks. A rebuild after a large sale can be covered by a time-bound waiver, which never changes the result.
Data the check reads
- An instrument key for every holding (minimum holdings)
- An issuer key for every holding (minimum issuers)
- Market values for every holding (top-N weight)
- Any exempt classes, and N for a top-N rule
Rule parameters
Minimum number of holdings or issuers, or a cap on the combined weight of the largest N holdings.
| Parameter | In the platform | Options and help |
|---|---|---|
| measure | Measure | |
| topN | Top N | Required for max_top_n_weight. |
| exemptClassNames | Exempt classes |
Methodology choices
- min_holdings / min_issuers count DISTINCT keys and are unaffected by missing prices.
- max_top_n_weight sums the N largest absolute weights against NAV.
Parameter names, methodology text and result-code meanings are shown exactly as the platform states them.
Worked examples, run by the engine
A book of three holdings fails a minimum of five
Rule template:diversification measure: min_holdings
Bounds: hard min 5
| Holding | Market value |
|---|---|
| A | 300 |
| B | 300 |
| C | 400 |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| Distinct holdings | Breach | 3 | ≥ 5 | -2 | BELOW_HARD_MINIMUM |
BELOW_HARD_MINIMUM: The measured value falls below the approved hard minimum, beyond any stated tolerance.
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.
The two largest of four holdings, 300 and 250 of a 1,000 book, weigh 55% together, inside a 60% cap
Rule template:diversification measure: max_top_n_weighttopN: 2
Bounds: hard max 60%
| Holding | Market value |
|---|---|
| A | 300 |
| B | 250 |
| C | 240 |
| D | 210 |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| Top 2 holdings | Compliant | 55% | ≤ 60% | 5% | WITHIN_LIMITS |
WITHIN_LIMITS: The measured value sits inside every approved bound.
Largest contributors: Top 2 holdings → A 30%, B 25%
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.
Six holdings but five issuers: the two gilts share one issuer, so the count is 5, below the minimum of 6. Cash is exempt and needs no issuer.
Rule template:diversification measure: min_issuersexemptClassNames: Cash
Bounds: hard min 6 · warn min 8
| Holding | Issuer | Class | Market value |
|---|---|---|---|
| UK Treasury 2028 | HM Treasury | Bonds | 200,000 |
| UK Treasury 2035 | HM Treasury | Bonds | 150,000 |
| Acme plc | Acme plc | Equities | 180,000 |
| Beta plc | Beta plc | Equities | 170,000 |
| Gamma plc | Gamma plc | Equities | 160,000 |
| Delta plc | Delta plc | Equities | 140,000 |
| Sterling deposit | – | Cash | 50,000 |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| Distinct issuers | Breach | 5 | ≥ 6 warning ≥ 8 | -1 -3 to warning | BELOW_HARD_MINIMUM |
BELOW_HARD_MINIMUM: The measured value falls below the approved hard minimum, beyond any stated tolerance.
Computed at build time by the Acclimetry rule engine (backend commit 8197063); the same code runs in the product.
Interpretation traps
Holdings are not issuers
Five gilts are five holdings and one issuer. A policy that says ‘20 securities’ and one that says ‘20 issuers’ need different measures.
Counts ignore size
Twenty issuers with one at 60% passes a count test. Pair a count with an issuer concentration limit or a top-N cap.
Top-N ranks holdings, not issuers
The ranking is by holding. Where a rule treats all of one issuer's securities as one investment, check the mapping, or hold each issuer once.
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. | – |
| 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.
Regulatory analogues
- UCITS government securities: 35% and the six-issue rule (COLL 5.2.12R; Arts 52(3), 54)
- IRC §817(h) and Treas. Reg. 1.817-5: the 55/70/80/90 test for variable contracts
- Trustee Act 2000: the standard investment criteria, including the need for diversification (s4)
- Pension schemes: assets properly diversified (2005 Regulations, reg 4)
Acclimetry evaluates a minimum count of distinct holdings or issuers, or a maximum combined weight of the N largest holdings against NAV. It does not compute correlation-based or effective-number measures of diversification. It cannot express the 1940 Act 75-5-10 test or the UCITS 40% aggregate as one rule.
The free Limit Checker runs this same template in your browser against a CSV of holdings. Nothing is uploaded.
Questions
Can Acclimetry test the 1940 Act 75-5-10 rule?
Not as one rule. The test applies issuer caps within 75% of the portfolio, which no single template expresses today.
How do I test a 55/70/80/90 rule?
As four top-N rules, with N of 1 to 4 and caps of 55%, 70%, 80% and 90%. A composite rule can combine them; the regulation's own counting rules decide what one investment is.
Do missing prices affect a minimum holdings count?
No. Counts read distinct keys and are unaffected by missing prices; top-N weights need a value for every holding.
Sources
- Trustee Act 2000, section 4 · OGL v3.0 · Read on12 October 2026
- Occupational Pension Schemes (Investment) Regulations 2005, regulation 4 · OGL v3.0 · Read on12 October 2026
- FCA Handbook, COLL 5.2 (UK UCITS investment powers), read 12 October 2026; pending FCA API snapshot · © FCA, OGL v3.0 · Read on12 October 2026
- 26 CFR 1.817-5 (diversification requirements for variable contracts), via Cornell LII · public domain · Read on12 October 2026
- 15 U.S.C. 80a-5 (Investment Company Act of 1940, section 5), via Cornell LII · public domain · Read on12 October 2026