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.

Rule template
counterparty_concentration
Counterparty concentration
Measured in
% of portfolio value
Worked examples, run by the engine
2

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

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.

ParameterIn the platformOptions and help
dimensionAggregate bycounterpartyGroup (Counterparty group (ultimate parent)) · counterparty (Counterparty (legal entity))
requireCounterpartyClassNamesClasses where a missing counterparty is a data gap
measureExposure measuremarket_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%

Holdings
HoldingCounterpartyCounterparty groupMarket value
ACP-1CP-1200
BCP-1CP-1-200
CCP-2CP-2600
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
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%

Holdings
HoldingCounterpartyCounterparty groupMarket value
ACP-1CP-1200
BCP-2CP-2800
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
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: counterpartyGroup
requireCounterpartyClassNames: FX Forwards
measure: market_value
Bounds: warn max 8% · hard max 10%

Holdings
HoldingClassCounterpartyCounterparty groupMarket value
USD/GBP forward, Bank A LondonFX ForwardsBank A LondonBank A group60,000
EUR/GBP forward, Bank A DublinFX ForwardsBank A DublinBank A group-30,000
Deposit, Bank BCashBank BBank B group50,000
Listed equitiesEquities––920,000
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
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

CodeStateMeaningWhat to do
WITHIN_LIMITS ✓CompliantThe measured value sits inside every approved bound.–
ABOVE_WARNING_MAXIMUMWarningThe 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_MINIMUMWarningThe 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 ✓BreachThe measured value exceeds the approved hard maximum, beyond any stated tolerance.Remediate the exposure, or record an approved waiver against the case.
BELOW_HARD_MINIMUMBreachThe 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_DATABreachData 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_PORTFOLIONot applicableThe portfolio held no positions at the evaluation moment.–
NOT_IN_SCOPENot applicableThis 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_ACCEPTEDNot evaluated: data qualityA 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_DATANot evaluated: data qualityOne 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_ACCEPTEDNot evaluated: data qualityThe 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_REJECTEDNot evaluated: data qualityThe portfolio's newest snapshot was rejected, so there is no authoritative data to measure.Load a corrected file.
STALE_POSITIONSNot evaluated: data qualityThe newest snapshot is older than the organisation's staleness threshold.Load current positions, or revisit the threshold on Data & Quality ▸ Policy.
STALE_PRICESNot evaluated: data qualityA 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_DATAPending external dataAn 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_SUPPORTEDNot evaluated: unsupportedThe 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_ERRORNot evaluated: system errorThe 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

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

Updated: 12 October 2026Acclimetry · Foreranger Ltd