Investment restriction
Asset allocation ranges (policy ranges and rebalancing bands)
An asset allocation range is the minimum and maximum share of portfolio value an asset class may hold, usually set around a strategic target. Acclimetry tests each named group against its own band, so a 35%–55% equity range breaches below 35% or above 55%. Warning bounds inside the range flag drift before rebalancing is due.
allocation_rangeAsset allocation range
How policies word it
Policies set a target for each asset class and a range around it. Typical forms are ‘Public equity 45% (35%–55%)’ or a table of lower limit, target and upper limit. UK statements of investment principles often keep the numbers elsewhere, in a summary of investment arrangements or the manager’s agreement.
The range does two jobs: it is the limit the manager must respect and the trigger for rebalancing. Several policies require a rebalance when a class leaves its range. A narrower inner band, sometimes called a collar or bandwidth, warns that drift is building.
The target itself is not a limit. In Acclimetry the strategic asset allocation bands are governed rules, while tactical positions inside them remain the manager’s decision.
- Public equity: target 45%, permitted range 35%–55% of the portfolio.
- Fixed income will be held between 20% and 40% of total assets, with a target of 30%.
- Each asset class shall remain within the lower and upper limits in Appendix A; the portfolio shall be rebalanced when a limit is breached.
- Alternative investments may not exceed 15% of the portfolio at market value.
- Rebalance to target whenever an asset class drifts more than 5 percentage points from it.
How it is measured
Each band names a group of one dimension: class, sub-class, type, sub-type or strategy. The engine adds the market value of the positions in the group and divides it by the value of the whole portfolio. The weight is compared with that group’s hard minimum and maximum and with any warning bounds.
Only the groups in the band table are tested. A class with no band is unconstrained, so a policy that caps ‘any other asset class’ needs a band for each class it means. Every band must state a hard minimum or a hard maximum.
Two edge cases are worth knowing. A governed group that holds nothing reads 0% and breaches its minimum. A portfolio holding nothing in any governed group reads not applicable, because it is not managed against these bands.
When it is breached and what follows
Allocation breaches are usually passive: markets move the weights, not a purchase. A breach is recorded when a weight passes a hard bound by more than the rule version’s tolerance, whatever moved it. Which cure period applies is set by the policy or regulation, not by the calculation.
A rule version may carry a grace period in days, which suits policies that allow time to rebalance. The result is still a breach from the first observation and the case opens at once, but its clocks start when the grace ends. A waiver can cover an agreed period outside the band; it is time-bound and never changes the result.
Before a rebalancing trade, Trade Impact can check the proposed orders against the same bands as a what-if.
Data the check reads
- Market value of every position
- The classification the bands are written against: class, sub-class, type, sub-type or strategy
- A band per group: a hard minimum and/or maximum, with optional warning bounds
- An accepted, current position snapshot (an unaccepted or stale snapshot is not evaluated)
Rule parameters
Each configured group of the chosen dimension must keep its portfolio weight inside its approved band.
| Parameter | In the platform | Options and help |
|---|---|---|
| dimension | Dimension | class (Class) · subClass (Sub class) · type (Type) · subType (Sub type) · strategy (Strategy) The grouping the band table is written against. |
| bands | Bands (percent of portfolio value) |
Parameter names, methodology text and result-code meanings are shown exactly as the platform states them.
Worked examples, run by the engine
A class band below its minimum breaches
Rule template:allocation_range dimension: classbands: group=Bonds, hardMin=40
| Holding | Class | Market value |
|---|---|---|
| BOND | Bonds | 300 |
| EQ | Stocks | 700 |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| Bonds | Breach | 30% | – | -10% | BELOW_HARD_MINIMUM |
BELOW_HARD_MINIMUM: The measured value falls below the approved hard minimum, beyond any stated tolerance.
Largest contributors: Bonds → BOND 30%
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 book holding nothing in any governed group reads Not Applicable, never Breach
Rule template:allocation_range dimension: classbands: group=Bonds, hardMin=40 · group=Stocks, hardMin=30, hardMax=70
| Holding | Class | Market value |
|---|---|---|
| CASH | Cash | 1,000 |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| Bonds | Not applicable | – | – | – | NO_GOVERNED_HOLDINGS |
| Stocks | Not applicable | – | – | – | NO_GOVERNED_HOLDINGS |
NO_GOVERNED_HOLDINGS: The portfolio held valued positions, but none in any group the rule governs — the book is not managed against these bands (its holdings were removed, or it holds only ungoverned groups). Read as not applicable rather than as a breach of every band.
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 governed group that is merely empty while another is held is still a breach
Rule template:allocation_range dimension: classbands: group=Bonds, hardMin=40 · group=Stocks, hardMin=30, hardMax=70
| Holding | Class | Market value |
|---|---|---|
| EQ | Stocks | 1,000 |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| Bonds | Breach | 0% | – | -40% | BELOW_HARD_MINIMUM |
| Stocks | Breach | 100% | – | -30% | ABOVE_HARD_MAXIMUM |
BELOW_HARD_MINIMUM: The measured value falls below the approved hard minimum, beyond any stated tolerance.ABOVE_HARD_MAXIMUM: The measured value exceeds the approved hard maximum, beyond any stated tolerance.
Largest contributors: Stocks → EQ 100%
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.
Equities at 53% sit above the 52% warning bound but inside the 55% hard maximum, so the equity band reads warning, not breach.
Rule template:allocation_range dimension: classbands: group=Equities, hardMin=35, warnMin=38, warnMax=52, hardMax=55 · group=Bonds, hardMin=20, hardMax=40
| Holding | Class | Market value |
|---|---|---|
| Global equities | Equities | 530,000 |
| UK gilts | Bonds | 330,000 |
| Sterling cash | Cash | 140,000 |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| Equities | Warning | 53% | 35% – 55% warning 38% – 52% | 2% -1% to warning | ABOVE_WARNING_MAXIMUM |
| Bonds | Compliant | 33% | 20% – 40% | 7% | WITHIN_LIMITS |
ABOVE_WARNING_MAXIMUM: The measured value has crossed the early-warning maximum but not the hard limit.WITHIN_LIMITS: The measured value sits inside every approved bound.
Largest contributors: Equities → Global equities 53% · Bonds → UK gilts 33%
Computed at build time by the Acclimetry rule engine (backend commit 8197063); the same code runs in the product.
Interpretation traps
Percentage points or percent of target
‘Within 5% of target’ can mean 40%–50% around a 45% target, or 42.75%–47.25% if read as 5% of the target. Write the band as absolute bounds. Record the reading as an author decision when the source leaves it open.
Unlisted classes are unconstrained
The template tests only the groups in its band table. A residual ‘other’ bucket, or a class added later, has no limit until it gets a band of its own. Review the table whenever the classification changes.
Funds count under their own class
The band reads each position’s own classification, so a bond fund classed as ‘Funds’ adds nothing to ‘Bonds’. To measure through pooled funds, use the look-through exposure limit.
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_GOVERNED_HOLDINGS ✓ | Not applicable | The portfolio held valued positions, but none in any group the rule governs — the book is not managed against these bands (its holdings were removed, or it holds only ungoverned groups). Read as not applicable rather than as a breach of every band. | If the book should hold these groups, that is a mandate question for its manager, not a data fix; if the rule should not cover this book, narrow its scope. |
| 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
- NURS limits on immovables and gold (COLL 5.6.19R)
- UK UCITS 10% limit on crypto ETNs (COLL 5.2.11R)
- Statement of investment principles: the kinds and balance of investments (OPS Investment Regs 2005 reg 2)
Acclimetry evaluates each named group’s market-value weight against its own hard and warning bounds, for groups of class, sub-class, type, sub-type or strategy. It does not look through funds, constrain groups without a band, or set targets. It recommends no rebalancing trades, though proposed trades can be checked against the bands in Trade Impact.
The free Limit Checker runs this same template in your browser against a CSV of holdings. Nothing is uploaded.
Questions
Is a target allocation a limit?
No. The target is the neutral position and the range around it is the limit. Acclimetry tests the range and leaves the position within it to the manager.
Can a band have only a maximum?
Yes. Each band needs a hard minimum or a hard maximum and may have both. A cap such as ‘alternatives at most 15%’ is a band with a maximum only.
What happens when a governed asset class is empty?
If other governed classes are held, the empty class reads 0% and breaches any minimum. If the portfolio holds none of the governed classes, the rule reads not applicable.
Sources
- FCA Handbook, COLL 5.6 (non-UCITS retail schemes), read 12 October 2026; pending FCA API snapshot · © FCA, OGL v3.0 · Read on12 October 2026
- FCA Handbook, COLL 5.2 (UK UCITS schemes), read 12 October 2026; pending FCA API snapshot · © FCA, OGL v3.0 · Read on12 October 2026
- Occupational Pension Schemes (Investment) Regulations 2005, reg 2 · OGL v3.0 · Read on12 October 2026