Investment restriction

Duration and maturity bands

A duration or maturity band keeps a portfolio’s value-weighted average duration or maturity inside a range in years, such as ‘between 3 and 6 years’. Acclimetry averages the governed field across the measured holdings by market value. Exempt classes such as cash leave both sides of the average, and the result is compared with the band.

Rule template
duration_maturity
Duration / maturity band
Measured in
years
Worked examples, run by the engine
3

How policies word it

Bond mandates bound interest-rate risk in years. Absolute forms read ‘duration between 3 and 6 years’ or ‘average maturity no longer than 5 years’. Relative forms tie the band to a benchmark: within one year of the benchmark’s duration, or within ±20% of it.

Money market funds carry the strictest version. In the US, Rule 2a-7 caps weighted average maturity at 60 days and weighted average life at 120 days.

A cap on single bonds, such as no bond maturing after a stated year, is a holding test, not an average. It belongs to the eligibility test.

  • The portfolio’s modified duration will be kept between 3 and 6 years.
  • The average maturity of the bond portfolio will not exceed 5 years.
  • Portfolio duration will remain within one year of the benchmark’s duration.
  • Duration may deviate by no more than ±20% from that of the benchmark.

How it is measured

The rule names one governed field in years: duration, maturity, spread duration or another rate-sensitivity measure. The engine multiplies each holding’s field by its market value, adds the products and divides by the market value of the measured holdings. Holdings of 300 at 2 years and 700 at 7 years average 5.5 years.

Exempt classes, typically cash, are left out of the numerator and the denominator. They neither shorten nor dilute the average. The field is read as delivered; Acclimetry does not calculate duration from cash flows.

The band is absolute. A benchmark-relative band needs the benchmark’s figure turned into fixed bounds, and a new rule version when the benchmark moves.

When it is breached and what follows

A missing value on one holding leaves the average unproven, even if the known holdings alone are far outside the band. The unknown member could pull it either way. The rule is not evaluated until the field is supplied, unless the rule version chooses a conservative-breach policy.

Duration drifts as bonds age and yields move, so breaches are often passive. Warning bounds inside the band give notice, and a grace period in days delays the case’s clocks where the policy allows time to adjust. Proposed trades can be checked against the band in Trade Impact.

Data the check reads

Rule parameters

The value-weighted average of the configured field (duration or maturity, in years) must stay inside the approved band.

ParameterIn the platformOptions and help
fieldCodeMeasure field codeDuration, maturity, spread duration or any governed rate-sensitivity field, in years.
exemptClassNamesExempt class names

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

Worked examples, run by the engine

A 300 at two years and a 700 at seven years average 5.5 years, inside a six-year cap; an exempt cash class is left out of both sides

Rule template: duration_maturity

fieldCode: DURATION
exemptClassNames: Cash
Bounds: hard max 6 years

Holdings
HoldingClassMarket valueDURATION
ABonds3002
BBonds7007
CASHCash500(blank)
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
Weighted average Compliant 5.5 years ≤ 6 years 0.5 years WITHIN_LIMITS
  • WITHIN_LIMITS: The measured value sits inside every approved bound.

Largest contributors: Weighted average → B 7 years, A 2 years

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 500 at four years and a 500 at ten years average seven years, over a six-year cap

Rule template: duration_maturity

fieldCode: DURATION
Bounds: hard max 6 years

Holdings
HoldingMarket valueDURATION
A5004
B50010
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
Weighted average Breach 7 years ≤ 6 years -1 years ABOVE_HARD_MAXIMUM
  • ABOVE_HARD_MAXIMUM: The measured value exceeds the approved hard maximum, beyond any stated tolerance.

Largest contributors: Weighted average → B 10 years, A 4 years

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 weighted average with an unknown member proves nothing, even when the known member alone is far over the cap

Rule template: duration_maturity

fieldCode: DURATION
Bounds: hard max 6 years

Holdings
HoldingMarket valueDURATION
A50020
B500(blank)
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
Weighted average Not evaluated: data quality – ≤ 6 years – 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.

Weighted by market value, the three bonds average 5.7 years: over the 5.5-year warning bound, inside the 6-year maximum. Cash is exempt and left out of both sides.

Rule template: duration_maturity

fieldCode: DURATION
exemptClassNames: Cash
Bounds: hard min 3 years · warn min 3.5 years · warn max 5.5 years · hard max 6 years

Holdings
HoldingClassMarket valueDURATION
UK Treasury 2045Bonds500,0009.0
Corporate bond 2029Bonds300,0003.0
Corporate bond 2027Bonds200,0001.5
Sterling depositCash100,000(blank)
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
Weighted average Warning 5.7 years 3 years – 6 years
warning 3.5 years – 5.5 years
0.3 years
-0.2 years to warning
ABOVE_WARNING_MAXIMUM
  • ABOVE_WARNING_MAXIMUM: The measured value has crossed the early-warning maximum but not the hard limit.

Largest contributors: Weighted average → UK Treasury 2045 9 years, Corporate bond 2029 3 years, Corporate bond 2027 1.5 years

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

Interpretation traps

Which duration

Modified, effective and Macaulay duration differ, and so do the providers that supply them. Name the field and its source in the rule, and record the choice as an author decision.

Cash and the denominator

Exempt classes leave both sides of the average. If cash should shorten the portfolio’s duration, give it a field value of zero instead of exempting it.

Relative bands go stale

A band set from the benchmark’s duration is only as current as that figure. Re-set it on a schedule, as a new rule version with its own effective date.

Derivatives

Futures and swaps change duration with little market value, so weighting by market value understates them. Rate risk from derivatives is better tested with the DV01 measure of the derivative exposure limit.

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

Try it on your own holdings

The free Limit Checker runs this same template in your browser against a CSV of holdings. Nothing is uploaded.

Open the Limit Checker

Questions

Does cash count in portfolio duration?

Not if its class is exempt, because exempt classes leave both sides of the average. Give cash a field value of zero if the policy wants it to shorten portfolio duration.

What if one bond has no duration?

The average is not evaluated, because the missing holding could move it either way. Supply the field, or choose a conservative-breach policy on the rule version.

Sources

Updated: 12 October 2026Acclimetry · Foreranger Ltd