Investment restriction
Counterparty concentration limit
A counterparty concentration limit caps a portfolio’s exposure to any single counterparty, or counterparty group, as a share of net portfolio value. Acclimetry adds the absolute value of every position facing each counterparty, because longs and shorts both expose you to it. It nets only where an approved agreement covers that counterparty, portfolio and instrument class.
counterparty_concentrationCounterparty concentration
How policies word it
Counterparty limits appear wherever a portfolio holds OTC derivatives, FX forwards, deposits or securities lending. A typical form is no more than 10% with any single counterparty.
UK UCITS schemes cap OTC derivative exposure to one counterparty at 5%, or 10% for an approved bank (OTC counterparty limit). Deposits with one body are capped at 20% (deposits limit).
The policy should say whether the cap is per legal entity or per banking group. It should also say which exposure it means: current value, settlement exposure or potential future exposure.
- Exposure to any single counterparty will not exceed 10% of net asset value.
- OTC derivative exposure to one counterparty is limited to 5% of NAV, or 10% where the counterparty is an approved bank.
- Deposits with any one bank, together with derivative exposure to it, will not exceed 20% of the portfolio.
- Counterparty limits are measured at the level of the banking group.
How it is measured
The rule aggregates by counterparty (legal entity) or by counterparty group (ultimate parent). By default it measures current exposure: the absolute market values of positions facing the counterparty, added up and divided by net portfolio value. A 200 asset and a 200 liability with the same bank are 400 of exposure, not zero.
Netting applies only under an approved agreement covering that counterparty, portfolio and instrument class. Each result records whether it was netted or measured gross, and whether any collateral was applied.
The rule can instead measure settlement exposure, potential future exposure, or current exposure plus potential future exposure, as each position states them. A position stating none is disclosed, never read as zero. In classes the rule names, such as FX forwards, a position with no counterparty is a data gap.
When it is breached and what follows
Counterparty exposure moves with the market value of derivatives, so breaches are often passive. A forward that gains value raises what the bank owes the portfolio. A warning bound below the cap gives time to reset or novate trades.
A breach opens a case at the first observation, with assignment, escalation and service-level clocks. Proposed trades can be checked against the cap in Trade Impact before execution. Missing values are never read as compliant.
Data the check reads
- Market value of every position, with its sign
- A counterparty key on each position facing one, and a counterparty-group key for group limits
- The classes in which a missing counterparty is a data gap
- Approved netting agreements, if netting is to apply
- Settlement or potential future exposure stated on each position, if the rule uses those measures
- The hard maximum, and an optional warning maximum, as a share of net portfolio value
Rule parameters
Sum of ABSOLUTE position values facing each counterparty (or group) over NAV — longs and shorts both expose you to the counterparty; netting only under an approved agreement. Or, where the rule says so, the settlement exposure or potential future exposure the positions state — a position stating none is disclosed, never zero.
| Parameter | In the platform | Options and help |
|---|---|---|
| dimension | Aggregate by | counterpartyGroup (Counterparty group (ultimate parent)) · counterparty (Counterparty (legal entity)) |
| requireCounterpartyClassNames | Classes where a missing counterparty is a data gap | |
| measure | Exposure measure | market_value (Current exposure (market value; netted under an approved agreement)) · settlement_exposure (Settlement exposure, as stated on the position) · potential_future_exposure (Potential future exposure, as stated on the position) · current_plus_pfe (Current exposure plus the stated potential future exposure) |
Bounds the rule must set: hardMax
Parameter names, methodology text and result-code meanings are shown exactly as the platform states them.
Worked examples, run by the engine
Counterparty exposure sums absolute values and does not net
Rule template:counterparty_concentration dimension: counterparty
Bounds: hard max 30%
| Holding | Counterparty | Counterparty group | Market value |
|---|---|---|---|
| A | CP-1 | CP-1 | 200 |
| B | CP-1 | CP-1 | -200 |
| C | CP-2 | CP-2 | 600 |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| CP-1 | Breach | 66.67% | ≤ 30% | -36.67% | ABOVE_HARD_MAXIMUM |
| CP-2 | Breach | 100% | ≤ 30% | -70% | ABOVE_HARD_MAXIMUM |
ABOVE_HARD_MAXIMUM: The measured value exceeds the approved hard maximum, beyond any stated tolerance.
Largest contributors: CP-1 → A 33.33%, B 33.33% · CP-2 → C 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.
A counterparty facing 200 of a 1,000 book is 20%, inside a 30% cap
Rule template:counterparty_concentration dimension: counterparty
Bounds: hard max 30%
| Holding | Counterparty | Counterparty group | Market value |
|---|---|---|---|
| A | CP-1 | CP-1 | 200 |
| B | CP-2 | CP-2 | 800 |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| CP-1 | Compliant | 20% | ≤ 30% | 10% | WITHIN_LIMITS |
| CP-2 | Breach | 80% | ≤ 30% | -50% | ABOVE_HARD_MAXIMUM |
WITHIN_LIMITS: The measured value sits inside every approved bound.ABOVE_HARD_MAXIMUM: The measured value exceeds the approved hard maximum, beyond any stated tolerance.
Largest contributors: CP-1 → A 20% · CP-2 → B 80%
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.
Two forwards with entities of one banking group, worth +60,000 and −30,000, add up to 90,000 of gross exposure: 9% of NAV, a warning against an 8% bound and a 10% cap.
Rule template:counterparty_concentration dimension: counterpartyGrouprequireCounterpartyClassNames: FX Forwardsmeasure: market_value
Bounds: warn max 8% · hard max 10%
| Holding | Class | Counterparty | Counterparty group | Market value |
|---|---|---|---|---|
| USD/GBP forward, Bank A London | FX Forwards | Bank A London | Bank A group | 60,000 |
| EUR/GBP forward, Bank A Dublin | FX Forwards | Bank A Dublin | Bank A group | -30,000 |
| Deposit, Bank B | Cash | Bank B | Bank B group | 50,000 |
| Listed equities | Equities | – | – | 920,000 |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| Bank A group | Warning | 9% | ≤ 10% warning ≤ 8% | 1% -1% to warning | ABOVE_WARNING_MAXIMUM |
| Bank B group | Compliant | 5% | ≤ 10% warning ≤ 8% | 5% 3% to warning | 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: Bank A group → USD/GBP forward, Bank A London 6%, EUR/GBP forward, Bank A Dublin 3% · Bank B group → Deposit, Bank B 5%
Computed at build time by the Acclimetry rule engine (backend commit 8197063); the same code runs in the product.
Interpretation traps
Gross unless netted
Without an approved agreement, a portfolio that owes and is owed by one bank shows the sum, which can exceed the economic exposure. Record netting agreements before setting a tight cap; see counterparty exposure.
Entity or group
Banks book trades through several legal entities. A cap per entity can pass while the group is over it. Choose the counterparty-group dimension and keep parent keys current, as for issuer groups.
Stated measures must be stated
Settlement and potential future exposure are read from each position, not calculated. A position that states none is disclosed as a gap, so the rule cannot read compliant until it is supplied.
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 OTC derivative counterparty limit: 5% and 10% (COLL 5.2.11R; Art 52(1))
- UCITS deposits limit: 20% with one body (COLL 5.2.11R; Art 52(1))
- UCITS 20% combined limit to one body (COLL 5.2.11R; Art 52(2))
Acclimetry evaluates exposure to each counterparty or group as the sum of absolute position values over net portfolio value, netted only under an approved agreement. It can instead read the settlement or potential future exposure each position states. It does not calculate potential future exposure or assess a counterparty’s credit quality.
Questions
Why does a hedged position count twice?
Because both legs face the counterparty. Without an approved netting agreement, what you owe cannot be set against what you are owed if the counterparty fails, so the measure is gross.
Does cash at a bank count?
Yes, if the deposit position carries that bank as its counterparty. Deposits then add to derivative exposure with the same bank.
Sources
- FCA Handbook, COLL 5.2 (UK UCITS schemes), read 12 October 2026; pending FCA API snapshot · © FCA, OGL v3.0 · Read on12 October 2026