Policy clause
"Annual turnover below 50%": how to write it, test it and evidence it
A turnover limit caps how much of the portfolio is traded in a year, usually to control costs. It becomes testable once the policy names the formula, the window and what counts as trading. Acclimetry measures it from the transaction record: the lesser of purchases and sales over the window, divided by the portfolio's current value.
Portfolio turnover will be kept below 50% a year.
turnover_limitQuestions to settle before it can be tested
- Formula: the lesser of purchases and sales, or purchases alone? The usual two-sided definition takes the lesser.
- Which year: calendar, financial or a rolling 365 days? The rule uses a rolling window ending at each run.
- Flows: subscriptions, redemptions and transfers are not trading. They are left out unless the rule names them, and an unmapped type holds back a compliant reading.
- Denominator and bound: Acclimetry divides by current value, not an average, and treats exactly 50% as compliant; state 49.99% if below is strict.
As a testable rule
Turnover template, measure turnover ratio, window 365 days, counting purchases and sales: the lesser of the two over current net market value. Hard maximum 50%, warning maximum 45%. Without the transaction record the rule reads not evaluated, never zero.
A testable wording
Portfolio turnover, the lesser of purchases and sales over the last 365 days divided by current market value, will not exceed 50%. Subscriptions, redemptions and transfers are excluded.
See turnover measures and the turnover and trading-frequency limit.
Worked example
In the year to 30 June 2026, sales of 3.9m are the lesser side: 48.75% of the 8m current value, past the 45% warning.
Rule template:turnover_limit measure: turnover_ratiowindowDays: 365
Bounds: warn max 45% · hard max 50%
| Holding | Class | Market value |
|---|---|---|
| Equities | Equities | 5,000,000 |
| Bonds | Bonds | 2,600,000 |
| Cash | Cash | 400,000 |
| Date | Type | Amount |
|---|---|---|
| 12 May 2025 | buy | 900,000 |
| 14 August 2025 | buy | 1,400,000 |
| 2 October 2025 | sell | 1,150,000 |
| 20 January 2026 | buy | 1,900,000 |
| 11 March 2026 | sell | 1,700,000 |
| 28 May 2026 | buy | 1,100,000 |
| 17 June 2026 | sell | 1,050,000 |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| Turnover (365d) | Warning | 48.75% | ≤ 50% warning ≤ 45% | 1.25% -3.75% to warning | ABOVE_WARNING_MAXIMUM |
ABOVE_WARNING_MAXIMUM: The measured value has crossed the early-warning maximum but not the hard limit.
Computed at build time by the Acclimetry rule engine (backend commit 8197063); the same code runs in the product.
What each monitoring run records
Each run stores the turnover, its state and headroom, the purchase and sale totals, the trade count and the categories left out. The result states that it used current value rather than an average. A breach opens a case like any other limit.