Investment restriction

Credit quality floor (minimum rating)

A credit quality floor limits how much of the portfolio may sit below a minimum rating, such as ‘no more than 10% below investment grade’. Acclimetry resolves each holding to one grade on the AAA-to-D scale, under the organisation’s split-rating, watch and unrated policy. It then measures the weight rated worse than the floor against the cap.

Rule template
credit_quality
Credit quality floor
Measured in
% of portfolio value
Worked examples, run by the engine
6

How policies word it

Three forms recur. A per-holding floor says ‘all bonds rated BBB- or better at purchase’, and a cap says ‘no more than 10% below investment grade’. An average says ‘average credit quality of at least A-’.

Where agencies disagree, the policy should say which rating applies, for example ‘the lower rating will apply’. Some policies add that unrated bonds count as below investment grade.

A per-holding floor is a cap of 0% on the weight below the grade. An average is a different calculation, a weighted mean of grade scores. It can be tested as a value-weighted custom data-field band over a numeric score, not with this template.

  • No more than 10% of the portfolio may be invested in securities rated below investment grade (BBB- or equivalent).
  • Fixed-income securities must be rated at least BBB- by S&P or Fitch, or Baa3 by Moody’s, at the time of purchase.
  • Where ratings differ, the lower rating will apply.
  • Unrated securities are treated as below investment grade.

How it is measured

Ratings are read on the long-term S&P and Fitch ladder from AAA to D. Moody’s symbols are mapped onto it; anything else is disclosed as unparseable, never guessed.

The organisation names its rating providers and the field each writes to; with none named, the rule’s own field is the only source. Where providers disagree, its split-rating policy decides: median, lowest, highest, or the first provider in priority order. The median is the middle of three and the lower of two, and is the shipped default.

If the organisation enables notching, a negative watch or outlook moves the grade down by the stated number of notches. Holdings whose resulting grade is worse than the minimum count toward the limit, as a share of portfolio value. Exempt classes, such as cash, are not tested against the floor.

Without a minimum grade, the rule can instead list the exact rating strings allowed; holdings outside the list count toward the limit. Every result states the policy it was judged under, and whether the organisation stated it or the provisional default applied.

Unrated holdings, downgrades and breaches

Unrated holdings are the main judgement. By default they leave the rule not evaluated. The organisation or the rule can instead count them as below the minimum, exclude them from the measure, or map them to a grade.

A downgrade is the typical passive breach. The result is a breach from the first observation, and the case opens at once. If the policy allows time to sell, a grace period in days delays the case’s clocks.

A waiver can let a named holding stay for an agreed period without changing the result.

Data the check reads

Rule parameters

The weight of holdings rated worse than the minimum grade — the composite of the organisation's rating providers under its split-rating, watch/outlook and unrated policy — must not exceed the limit.

ParameterIn the platformOptions and help
minimumGradeMinimum gradeNot set — use the allowed-values list
On the canonical scale (AAA … D). Holdings whose composite grade is worse count toward the limit. "Not set" uses the allowed-values list instead.
fieldCodeRating field codeThe custom field carrying the rating when the organisation names no rating providers (Organisation ▸ Credit quality policy). Required for the allowed-values path.
allowedValuesAllowed values (exact strings)Used only when no minimum grade is set: the rating strings that count as inside the set.
exemptClassNamesExempt class names
unratedTreatmentUnrated holdingspolicy (Follow the organisation policy) · not_evaluated (Leave the rule not evaluated) · below_minimum (Count as below the minimum) · exclude (Exclude from the measure) · map (Treat as the organisation's mapped grade)
"Follow the organisation policy" is the default; a rule may state its own treatment.

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

Holdings outside the allowed ratings breach the cap

Rule template: credit_quality

fieldCode: RATING
allowedValues: AAA, AA
Bounds: hard max 10%

Holdings
HoldingMarket valueRATING
OK800AAA
BAD200BBB
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
Credit quality Breach 20% ≤ 10% -10% ABOVE_HARD_MAXIMUM
  • ABOVE_HARD_MAXIMUM: The measured value exceeds the approved hard maximum, beyond any stated tolerance.

Largest contributors: Credit quality → BAD (BBB) 20%

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.

An unrated holding is a coverage gap, not an implicit pass

Rule template: credit_quality

fieldCode: RATING
allowedValues: AAA, AA
Bounds: hard max 10%

Holdings
HoldingMarket valueRATING
OK900AAA
??100(blank)
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
Credit quality 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.

Two providers, median policy: A/Baa3 resolves to the lower BBB- and stays inside a BBB- floor; BB+/Ba1 is below it and breaches a 10% cap at 20%

Rule template: credit_quality

minimumGrade: BBB-
Bounds: hard max 10%

Holdings
HoldingMarket valueRATING_SPRATING_MOODYS
IG800ABaa3
HY200BB+Ba1
Organisation's credit-quality policy
Rating providersSplit ratingsWatch / outlook notching
SP (RATING_SP), MOODYS (RATING_MOODYS)medianoff
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
Credit quality Breach 20% ≤ 10% -10% ABOVE_HARD_MAXIMUM
  • ABOVE_HARD_MAXIMUM: The measured value exceeds the approved hard maximum, beyond any stated tolerance.

Largest contributors: Credit quality → HY (BB+) 20%

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 negative watch notches BBB- down to BB+, which is below a BBB- floor: the whole book is outside, 100%

Rule template: credit_quality

minimumGrade: BBB-
Bounds: hard max 10%

Holdings
HoldingMarket valueRATING_SPWATCH
EDGE1,000BBB-CreditWatch Negative
Organisation's credit-quality policy
Rating providersSplit ratingsWatch / outlook notching
SP (RATING_SP), MOODYS (RATING_MOODYS)medianenabled: 1 notch
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
Credit quality Breach 100% ≤ 10% -90% ABOVE_HARD_MAXIMUM
  • ABOVE_HARD_MAXIMUM: The measured value exceeds the approved hard maximum, beyond any stated tolerance.

Largest contributors: Credit quality → EDGE (BB+) 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.

An unrated holding counted as below the minimum by rule choice: 100 of 1,000 is 10%, above a 5% cap

Rule template: credit_quality

minimumGrade: BBB-
unratedTreatment: below_minimum
Bounds: hard max 5%

Holdings
HoldingMarket valueRATING_SP
IG900AAA
NR100(blank)
Organisation's credit-quality policy
Rating providersSplit ratingsWatch / outlook notching
SP (RATING_SP), MOODYS (RATING_MOODYS)medianoff
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
Credit quality Breach 10% ≤ 5% -5% ABOVE_HARD_MAXIMUM
  • ABOVE_HARD_MAXIMUM: The measured value exceeds the approved hard maximum, beyond any stated tolerance.

Largest contributors: Credit quality → NR 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.

An unrated holding excluded by rule choice leaves 900 of 1,000 measured, none below the floor: 0%

Rule template: credit_quality

minimumGrade: BBB-
unratedTreatment: exclude
Bounds: hard max 5%

Holdings
HoldingMarket valueRATING_SP
IG900AAA
NR100(blank)
Organisation's credit-quality policy
Rating providersSplit ratingsWatch / outlook notching
SP (RATING_SP), MOODYS (RATING_MOODYS)medianoff
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
Credit quality Compliant 0% ≤ 5% 5% WITHIN_LIMITS
  • WITHIN_LIMITS: The measured value sits inside every approved bound.

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.

One BB+ bond worth 9% of the portfolio sits below a BBB- floor: over the 8% warning bound, inside the 10% cap. Cash is exempt and not tested.

Rule template: credit_quality

minimumGrade: BBB-
fieldCode: RATING
exemptClassNames: Cash
Bounds: warn max 8% · hard max 10%

Holdings
HoldingClassMarket valueRATING
UK Treasury 2034Bonds450,000AA
Corporate bond 2030Bonds250,000A-
Corporate bond 2029Bonds160,000BBB
High-yield bond 2031Bonds90,000BB+
Sterling depositCash50,000(blank)
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
Credit quality Warning 9% ≤ 10%
warning ≤ 8%
1%
-1% to warning
ABOVE_WARNING_MAXIMUM
  • ABOVE_WARNING_MAXIMUM: The measured value has crossed the early-warning maximum but not the hard limit.

Largest contributors: Credit quality → High-yield bond 2031 (BB+) 9%

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

Interpretation traps

Split ratings

With two providers the median is the lower rating; with three it is the middle one. A policy that says the higher rating applies needs the highest setting, or the result is stricter than the policy. See split ratings.

Unrated is a decision

Under the default, one unrated bond stops the rule from reading compliant. Decide whether unrated holdings count as below the floor, are excluded or map to a grade, and record it; see unrated holdings.

Watch and outlook notching

With notching on, a BBB- on negative watch is read as BB+ and falls below a BBB- floor. Notching is off unless the organisation enables it; see rating watch and outlook.

Funds and cash

A bond fund or a deposit has no issue rating. List the classes the floor does not cover as exempt, or they are read as unrated.

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_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.

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

What is investment grade on this scale?

BBB- and above on the S&P and Fitch ladder, or Baa3 and above in Moody’s symbols. A BBB- floor counts BB+ and lower toward the limit; see investment grade.

Does a downgrade force a sale?

Not by itself. The rule records the breach; whether to sell, or to approve a waiver for an agreed period, is decided through the case under the policy.

Can I require an average rating of A-?

Not with this template, which measures the weight below a floor. A value-weighted custom data-field band over a numeric rating score can test an average.

Updated: 12 October 2026Acclimetry · Foreranger Ltd