Investment restriction

Collateral, margin, repo and securities-lending limits

Collateral, margin, repo and securities-lending limits cap the amounts a portfolio has tied up in financing and derivative arrangements, as a share of NAV. A policy might say ‘securities on loan may not exceed 20% of the portfolio’. Acclimetry adds the stated amounts for one measure in absolute terms, so posting and receiving both count, and tests the total against the limit.

Rule template
collateral_exposure
Collateral / margin / repo / stock-loan limit
Measured in
% of portfolio value
Worked examples, run by the engine
6

How policies word it

These limits appear in investment management agreements, fund documents and the policies of owners who lend securities or trade derivatives. Each clause usually covers one activity:

  • Securities lending: securities on loan may not exceed 20% of the portfolio.
  • Repo: repurchase agreements are limited to 10% of net assets.
  • Margin: initial margin posted may not exceed 5% of NAV.
  • Collateral: collateral posted to counterparties may not exceed 10% of the portfolio.

Clauses on collateral quality, such as eligible assets or haircuts, are a separate question. This template does not measure them, and they can be held as a manual obligation.

  • Securities on loan may not exceed 20% of the portfolio.
  • Repurchase agreements are limited to 10% of net assets.
  • Initial margin posted on derivatives may not exceed 5% of NAV.
  • Collateral posted to counterparties must not exceed 10% of the portfolio.

How it is measured

The rule version names one measure. The amounts of the measured positions are added in absolute terms and divided by NAV.

  • Collateral: the position's own Collateral Value column, or a named data field for positions that state none.
  • Margin: the Initial and Variation Margin columns, or a data field. The rule counts initial, variation or both, which is the default.
  • Repo and securities lending: a named data field only, because positions carry no column for them.

Measured classes narrow the population, for example to derivatives for a margin limit. With the default setting, a measured position that states no amount is a data gap, not a zero.

The result shows the total as a share of NAV, the headroom and the positions that contribute most. It also says how many amounts came from columns and how many from the field.

When it is breached and what follows

A total above the hard maximum is a breach, and warning bounds give notice first. Margin calls and rising prices of lent securities can push the total up without any new trade.

Breaches join a case with assignment, escalation and service-level clocks, and a grace period can hold the clocks while a recall settles. Waivers are time-bound and approved within delegated authority; they never change the result.

Data the check reads

Rule parameters

Collateral posted or received, margin, repo or securities-lending exposure — read from the position's own stated columns, or from a governed field — as a share of NAV.

ParameterIn the platformOptions and help
measureMeasurecollateral (Collateral (posted or received)) · margin (Margin) · repo (Repo exposure) · securities_lending (Securities lending)
fieldCodeAmount fieldOptional for collateral and margin: the position's own Collateral Value and Initial / Variation Margin columns are read first, and this governed field supplies a position that states none. Required for repo and securities lending, which have no column.
marginComponentMargin componenttotal (Initial + variation (total)) · initial (Initial margin only) · variation (Variation margin only)
For a margin limit: the initial margin, the variation margin, or their sum (the default).
classNamesMeasured classesLeave empty to measure every position.
requireAmountMissing amount is a data gap

Bounds the rule must set: hardMax

Methodology choices

Parameter names, methodology text and result-code meanings are shown exactly as the platform states them.

Worked examples, run by the engine

Margin of 50 posted on a derivative in a 1,000 book is 5%, inside a 10% cap

Rule template: collateral_exposure

measure: margin
fieldCode: MARGIN
classNames: Derivatives
requireAmount: true
Bounds: hard max 10%

Holdings
HoldingClassMarket valueMARGIN
FUTDerivatives20050
EQStocks800(blank)
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
Margin Compliant 5% ≤ 10% 5% WITHIN_LIMITS
  • WITHIN_LIMITS: The measured value sits inside every approved bound.

Largest contributors: Margin → FUT 5%

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.

Repo amounts are absolute, so 100 received and 100 posted are 200 of a 1,000 book, or 20%, over a 15% cap

Rule template: collateral_exposure

measure: repo
fieldCode: REPO
requireAmount: true
Bounds: hard max 15%

Holdings
HoldingMarket valueREPO
R1500-100
R2500100
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
Repo exposure Breach 20% ≤ 15% -5% ABOVE_HARD_MAXIMUM
  • ABOVE_HARD_MAXIMUM: The measured value exceeds the approved hard maximum, beyond any stated tolerance.

Largest contributors: Repo exposure → R1 10%, R2 10%

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 derivative in the measured population stating no margin is a data gap, not a stated zero

Rule template: collateral_exposure

measure: margin
fieldCode: MARGIN
classNames: Derivatives
requireAmount: true
Bounds: hard max 10%

Holdings
HoldingClassMarket valueMARGIN
FUT1Derivatives20050
FUT2Derivatives200(blank)
EQStocks600(blank)
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
Margin Not evaluated: data quality – ≤ 10% – 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.

Collateral is read from the position's own stated column — 100 received on one swap and 50 on another are 15% of a 1,000 book, over a 10% cap, with no governed field named

Rule template: collateral_exposure

measure: collateral
classNames: Derivatives
requireAmount: true
Bounds: hard max 10%

Holdings
HoldingClassMarket valueCollateral
EQStocks600–
SWADerivatives300100 USD received
SWBDerivatives10050 EUR received
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
Collateral Breach 15% ≤ 10% -5% ABOVE_HARD_MAXIMUM
  • ABOVE_HARD_MAXIMUM: The measured value exceeds the approved hard maximum, beyond any stated tolerance.

Largest contributors: Collateral → SWA 10%, SWB 5%

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 margin limit sums the stated initial and variation margin — 20 + 5 on a derivative in a 1,000 book is 2.5%, inside a 5% cap

Rule template: collateral_exposure

measure: margin
classNames: Derivatives
requireAmount: true
Bounds: hard max 5%

Holdings
HoldingClassMarket valueMargin
FUTDerivatives200initial 20 · variation 5 USD
EQStocks800–
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
Margin Compliant 2.5% ≤ 5% 2.5% WITHIN_LIMITS
  • WITHIN_LIMITS: The measured value sits inside every approved bound.

Largest contributors: Margin → FUT 2.5%

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 field supplies a position that states no margin of its own — 50 from the column on one derivative and 30 from the field on another are 8% of a 1,000 book, over a 6% cap

Rule template: collateral_exposure

measure: margin
fieldCode: MARGIN
classNames: Derivatives
requireAmount: true
Bounds: hard max 6%

Holdings
HoldingClassMarket valueMarginMARGIN
FUT1Derivatives200initial 50 USD(blank)
FUT2Derivatives200–30
EQStocks600–(blank)
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
Margin Breach 8% ≤ 6% -2% ABOVE_HARD_MAXIMUM
  • ABOVE_HARD_MAXIMUM: The measured value exceeds the approved hard maximum, beyond any stated tolerance.

Largest contributors: Margin → FUT1 5%, FUT2 3%

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.

Securities on loan total 250,000, or 25% of the 1,000,000 portfolio, over the 20% cap. Cash is outside the measured classes, so it needs no amount.

Rule template: collateral_exposure

measure: securities_lending
fieldCode: ON_LOAN
classNames: Equities, Bonds
requireAmount: true
Bounds: warn max 18% · hard max 20%

Holdings
HoldingClassMarket valueON_LOAN
UK equity holdingEquities300,000120000
US equity holdingEquities250,00080000
UK Treasury 2032Bonds200,00050000
Corporate bond 2029Bonds150,0000
Sterling depositCash100,000(blank)
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
Securities lending Breach 25% ≤ 20%
warning ≤ 18%
-5%
-7% to warning
ABOVE_HARD_MAXIMUM
  • ABOVE_HARD_MAXIMUM: The measured value exceeds the approved hard maximum, beyond any stated tolerance.

Largest contributors: Securities lending → UK equity holding 12%, US equity holding 8%, UK Treasury 2032 5%

Computed at build time by the Acclimetry rule engine (backend commit 8197063); the same code runs in the product.

Interpretation traps

Posting and receiving do not offset

Amounts are taken in absolute terms. A book that posts 100 and receives 100 shows 200, not zero, even when the feed signs the amounts.

Amounts are not converted

A collateral or margin figure stated in another currency is counted as stated. Feed amounts in the base currency; the result says how many were in another one.

No measured classes means every position

If no classes are named, every position is measured. With missing amounts treated as data gaps, an equity with no margin then stops the reading.

Columns win over fields

For collateral and margin, the position's own columns are read first. A data field fills in only positions that state nothing, so it does not override a stale column value.

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.–
NO_MEASURED_POSITIONSNot applicableNo position in the portfolio fell inside this rule's measured population.–
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_DATA ✓Not 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

Does collateral received count towards the limit?

Yes. Posted and received amounts both count in absolute terms; the template does not separate them by direction.

Can one rule cover margin and securities lending together?

No. Each rule version has one measure, so two activities need two rules. A composite rule can combine their outcomes if the policy links them.

How is this different from a counterparty concentration limit?

A counterparty concentration limit measures exposure facing each counterparty. This template measures the amounts of one financing activity across the whole portfolio.

Sources

Updated: 12 October 2026Acclimetry · Foreranger Ltd