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.
credit_qualityCredit quality floor
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
- Market value of every position
- A rating field per provider, or a single rating field named on the rule
- The organisation’s credit quality policy: providers and priority, split-rating rule, notching and unrated treatment
- The minimum grade, or the list of allowed rating strings, and the cap as a percentage
- Exempt class names, such as cash
- Watch and outlook fields, if notching is enabled
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.
| Parameter | In the platform | Options and help |
|---|---|---|
| minimumGrade | Minimum grade | Not 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. |
| fieldCode | Rating field code | The custom field carrying the rating when the organisation names no rating providers (Organisation ▸ Credit quality policy). Required for the allowed-values path. |
| allowedValues | Allowed values (exact strings) | Used only when no minimum grade is set: the rating strings that count as inside the set. |
| exemptClassNames | Exempt class names | |
| unratedTreatment | Unrated holdings | policy (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
- Scale: the long-term S&P/Fitch ladder AAA … D; Moody's symbols are aliased onto it; anything else is unparseable and disclosed, never guessed.
- Providers: the organisation names its rating providers and the custom field each writes to (Organisation ▸ Credit quality policy); with none named, the rule's own field is the single source.
- Split ratings: median (the middle of three, the lower of two — the shipped default), lowest, highest, or the first provider in priority order.
- Watch and outlook: ignored unless the organisation enables notching; a negative watch or outlook then moves the grade down the stated number of notches.
- Unrated: leaves the rule not evaluated (default), counts as below the minimum, is excluded from the measure, or is treated as a mapped grade — by organisation policy, or as this rule states.
- Every result discloses the policy it was judged under, and whether that policy was stated by the organisation or is the provisional default.
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: RATINGallowedValues: AAA, AA
Bounds: hard max 10%
| Holding | Market value | RATING |
|---|---|---|
| OK | 800 | AAA |
| BAD | 200 | BBB |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| 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: RATINGallowedValues: AAA, AA
Bounds: hard max 10%
| Holding | Market value | RATING |
|---|---|---|
| OK | 900 | AAA |
| ?? | 100 | (blank) |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| 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%
| Holding | Market value | RATING_SP | RATING_MOODYS |
|---|---|---|---|
| IG | 800 | A | Baa3 |
| HY | 200 | BB+ | Ba1 |
| Rating providers | Split ratings | Watch / outlook notching |
|---|---|---|
| SP (RATING_SP), MOODYS (RATING_MOODYS) | median | off |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| 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%
| Holding | Market value | RATING_SP | WATCH |
|---|---|---|---|
| EDGE | 1,000 | BBB- | CreditWatch Negative |
| Rating providers | Split ratings | Watch / outlook notching |
|---|---|---|
| SP (RATING_SP), MOODYS (RATING_MOODYS) | median | enabled: 1 notch |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| 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%
| Holding | Market value | RATING_SP |
|---|---|---|
| IG | 900 | AAA |
| NR | 100 | (blank) |
| Rating providers | Split ratings | Watch / outlook notching |
|---|---|---|
| SP (RATING_SP), MOODYS (RATING_MOODYS) | median | off |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| 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%
| Holding | Market value | RATING_SP |
|---|---|---|
| IG | 900 | AAA |
| NR | 100 | (blank) |
| Rating providers | Split ratings | Watch / outlook notching |
|---|---|---|
| SP (RATING_SP), MOODYS (RATING_MOODYS) | median | off |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| 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: RATINGexemptClassNames: Cash
Bounds: warn max 8% · hard max 10%
| Holding | Class | Market value | RATING |
|---|---|---|---|
| UK Treasury 2034 | Bonds | 450,000 | AA |
| Corporate bond 2030 | Bonds | 250,000 | A- |
| Corporate bond 2029 | Bonds | 160,000 | BBB |
| High-yield bond 2031 | Bonds | 90,000 | BB+ |
| Sterling deposit | Cash | 50,000 | (blank) |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| 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
| 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.
Acclimetry evaluates the share of portfolio value whose composite grade, under the stated provider, split-rating, notching and unrated policy, is worse than a minimum grade. It does not compute an average rating, rate holdings itself, look through funds, or read short-term rating scales. A rating it cannot parse is disclosed, not guessed.
The free Limit Checker runs this same template in your browser against a CSV of holdings. Nothing is uploaded.
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.