Investment restriction
Illiquid assets limit (liquidity profile)
An illiquid assets limit caps the share of a portfolio held in investments that cannot be sold or redeemed quickly. Policies write it as ‘no more than 15% in illiquid assets’, which leaves ‘illiquid’ to be defined. Acclimetry tests every holding against one approved definition, such as a lock-up, a gate or a recorded classification, and caps the failing weight.
liquidity_profileLiquidity profile limit
How policies word it
Illiquidity caps appear in family-office, foundation and pension policies, and in fund rules. The wording is often loose: ‘prudent limits on illiquid assets’, or a cap with no definition.
A clause that does not define ‘illiquid’ is ambiguous and needs clarification before it can be tested. The answer is recorded as an author decision: which test, which threshold, and who supplies the data.
US open-end funds have a regulatory version. SEC Rule 22e-4 bars a fund from acquiring an illiquid investment that would take illiquid holdings above 15% of net assets.
- No more than 15% of the portfolio may be invested in illiquid assets.
- Investments with a remaining lock-up of more than 12 months are limited to 20% of total assets.
- At least 70% of the portfolio must be held in investments that deal at least monthly.
- Holdings the investment committee classifies as illiquid may not exceed 25% of the portfolio.
How it is measured
The rule version names one basis. Each holding is tested against the threshold, and the holdings that fail are weighed against the whole portfolio.
- Days to liquidate or days of average trading volume: an approved estimate per holding.
- Dealing frequency, remaining lock-up or notice period: the fund's terms, held in a data field.
- Redemption gate: the share redeemable at one dealing date. Here a smaller number is worse.
- Days to maturity: for holdings meant to be held to maturity.
- Classification: a recorded label, held in a data field or taken from the holding's class or sub-class. The rule names which labels count as illiquid.
A holding at or beyond the threshold counts as illiquid. The result shows the illiquid weight, its headroom to the limit and the holdings that contribute most.
When it is breached and what follows
Most breaches of this limit are passive. A fall in listed markets raises the illiquid share, and a fund that imposes a gate can move into the illiquid set overnight.
A breach opens a case with assignment, escalation and service-level clocks; a grace period can delay the clocks, not the breach. Selling illiquid assets takes time, so the agreed path back can be recorded as a time-bound waiver, approved within delegated authority.
A proposed purchase of an illiquid asset can be checked in Trade Impact before execution, which mirrors an acquisition test such as Rule 22e-4's.
Data the check reads
- The approved input for the chosen basis, per holding, in a data field: days, dealing days per year, lock-up or notice days, gate percentage or days to maturity
- Or, on the classification basis, a liquidity label per holding or class and the list of labels that count as illiquid
- The threshold set in the rule version (every basis except classification)
- Market values for every holding, which form the denominator
- Any exempt classes
Rule parameters
The weight of holdings that fail an approved liquidity test — on days to liquidate, trading volume, dealing frequency, lock-up, notice period, redemption gate, maturity or classification — must not exceed the limit.
| Parameter | In the platform | Options and help |
|---|---|---|
| basis | Liquidity basis | days_to_liquidate (Days to liquidate) · trading_volume (Days of average trading volume) · dealing_frequency (Dealing days per year) · lock_up (Remaining lock-up (days)) · notice_period (Notice period (days)) · redemption_gate (Redemption gate (percent redeemable)) · maturity (Days to maturity) · classification (Liquidity classification) |
| fieldCode | Governed field | Required for every basis except Liquidity classification. The approved field carrying this input — nothing is inferred from asset class. |
| threshold | Threshold | Required for every basis except Liquidity classification. Holdings at or beyond this value count as illiquid for this rule. |
| illiquidValues | Classifications counted as illiquid | Used by the Liquidity classification basis. Naming them here is what makes the judgement yours and recorded. |
| classificationSource | Where the classification is held | Used by the Liquidity classification basis. |
| exemptClassNames | Exempt classes |
Bounds the rule must set: hardMax
Methodology choices
- Every basis reads an APPROVED input. Nothing is inferred from asset class, instrument name or any other proxy.
- A position missing the input is a data gap and produces a not-evaluated result. Absence of a recorded lock-up is not evidence that there is none.
Parameter names, methodology text and result-code meanings are shown exactly as the platform states them.
Worked examples, run by the engine
A 200 holding needing 30 days against a 10-day threshold is 20% of the 1,000 book illiquid, inside a 25% cap
Rule template:liquidity_profile basis: days_to_liquidatefieldCode: DTLthreshold: 10classificationSource: field
Bounds: hard max 25%
| Holding | Market value | DTL |
|---|---|---|
| A | 800 | 1 |
| B | 200 | 30 |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| Illiquid by days to liquidate | Compliant | 20% | ≤ 25% | 5% | WITHIN_LIMITS |
WITHIN_LIMITS: The measured value sits inside every approved bound.
Largest contributors: Illiquid by days to liquidate → B 20%
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.
On the redemption-gate basis a smaller number is worse: a 10% gate under a 25% threshold marks 400 of the 1,000 book illiquid, over a 30% cap
Rule template:liquidity_profile basis: redemption_gatefieldCode: GATEthreshold: 25classificationSource: field
Bounds: hard max 30%
| Holding | Market value | GATE |
|---|---|---|
| A | 600 | 100 |
| B | 400 | 10 |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| Illiquid by redemption gate (percent redeemable) | Breach | 40% | ≤ 30% | -10% | ABOVE_HARD_MAXIMUM |
ABOVE_HARD_MAXIMUM: The measured value exceeds the approved hard maximum, beyond any stated tolerance.
Largest contributors: Illiquid by redemption gate (percent redeemable) → B 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 holding with no approved liquidity input is a data gap, never assumed liquid
Rule template:liquidity_profile basis: days_to_liquidatefieldCode: DTLthreshold: 10classificationSource: field
Bounds: hard max 25%
| Holding | Market value | DTL |
|---|---|---|
| A | 900 | 1 |
| B | 100 | (blank) |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| Illiquid by days to liquidate | Not evaluated: data quality | – | ≤ 25% | – | 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.
The two classes the rule names as illiquid hold 200,000 of a 1,000,000 portfolio: 20%, over the 15% cap.
Rule template:liquidity_profile basis: classificationilliquidValues: Private Equity, Direct PropertyclassificationSource: className
Bounds: warn max 12% · hard max 15%
| Holding | Class | Market value |
|---|---|---|
| Global equity fund | Equities | 550,000 |
| Sterling bond fund | Bonds | 250,000 |
| Buyout fund | Private Equity | 120,000 |
| Farmland holding | Direct Property | 80,000 |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| Illiquid by liquidity classification | Breach | 20% | ≤ 15% warning ≤ 12% | -5% -8% to warning | ABOVE_HARD_MAXIMUM |
ABOVE_HARD_MAXIMUM: The measured value exceeds the approved hard maximum, beyond any stated tolerance.
Largest contributors: Illiquid by liquidity classification → Buyout fund 12%, Farmland holding 8%
Computed at build time by the Acclimetry rule engine (backend commit 8197063); the same code runs in the product.
Interpretation traps
Asset class is not a liquidity test
Nothing is inferred from asset class, instrument name or any other proxy. If whole classes are illiquid, name them on the classification basis, which records the judgement as yours.
A blank is not ‘no lock-up’
A holding missing the input makes the result not evaluated (data quality). An unrecorded lock-up, notice period or gate is a data gap, not evidence that there is none.
‘More than’ needs a threshold one step higher
A holding at or beyond the threshold counts as illiquid. A clause that says ‘more than 12 months’ therefore needs a threshold just above 12 months, such as 366 days.
One test per rule
A definition that combines tests, such as ‘a lock-up over a year or notice over 90 days’, does not fit one basis. Hold it as an approved classification per holding instead.
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.
Regulatory analogues
- SEC Rule 22e-4: 15% limit on illiquid investments (US open-end funds)
- NURS: 20% in non-eligible securities (COLL 5.6.5R)
- Statement of investment principles: policy on the realisation of investments (2005 Regulations, reg 2)
Acclimetry evaluates the weight of holdings failing one approved liquidity test against the rule's hard and warning maximums. It reads the test's input from approved data, or applies a named set of classifications. It does not estimate liquidity, infer it from asset class, model redemption queues or run liquidity stress tests.
Questions
What counts as an illiquid asset?
Whatever the policy defines. Acclimetry tests the definition the rule version records: one basis and threshold, or a named set of classifications.
Is the limit tested at purchase or all the time?
Every monitoring run tests the current holdings, so passive breaches show up. A proposed purchase can also be checked in Trade Impact before execution.
How is this different from a time-to-liquidate limit?
The time-to-liquidate limit reads one days-to-liquidate estimate against a horizon and counts only holdings strictly beyond it. This template offers eight bases and counts holdings at or beyond the threshold.
Sources
- 17 CFR 270.22e-4 (SEC Rule 22e-4, liquidity risk management programs), via Cornell LII · public domain · Read on12 October 2026
- FCA Handbook, COLL 5.6 (NURS investment powers), read 12 October 2026; pending FCA API snapshot · © FCA, OGL v3.0 · Read on12 October 2026
- Occupational Pension Schemes (Investment) Regulations 2005, regulation 2 · OGL v3.0 · Read on12 October 2026