Performance Fees
Independently bound the performance fee a share class should have accrued, and expose how it is built up.
Performance Fees independently checks the performance fee accrued by each share class against the administrator's figures, while exposing the building blocks behind the calculation. It handles common models such as High Water Mark, benchmark (fictive asset) and fulcrum approaches, including hurdles, caps, crystallization on redemptions, and fees that crystallize less often than they reset. It answers: is the performance fee charged to this share class within what its terms allow, and how was it built up?
How it works
Using gross asset value, shares outstanding, subscriptions, redemptions, dividends, benchmark returns and FX rates, it measures the share class's over-performance against its reference (a high watermark or a benchmark's fictive asset), net of any hurdle, from the start of the current reset period. Several estimators are then fitted on that over-performance, and the band they all agree on gives a lower bound and an upper bound for what the cumulative and the single-day accrual should be. The administrator's reported accrual is flagged as a breach when it falls outside that band.
The fee's terms are read from its fee parameter: the methodology, the rate, the reset frequency, the Fee Crystallization Frequency when the fee is paid away less often than it resets (for example reset monthly, crystallized annually), extra contract conditions, the cap basis, a days shift between valuation and booking, and a client's own reference overwrite on given dates.
What you get
- The reported cumulative and daily accrual beside the model's central estimate and its lower and upper bounds.
- A breach flag, and how far outside the band the reported figure lies, in local currency and as a share of NAV.
- The intermediary metrics behind the fee: GAV per share, share class and benchmark returns, period-to-date over-performance and hurdle, the reference value per share, and the fulcrum adjustment where it applies.
- The fee carried from earlier reset periods when the fee crystallizes less often than it resets, so a balance that was never paid away does not read as an over-charge.
- A model status and a note on every row saying how far the row could be judged, and why not.
In SPARK
The results arrive in a Performance Fees Signals data object (slug ngt_performance_fees_signals), created from the Performance Fees Signal template, version 4.0.0, in the template picker's Analytics group. Each row is one share class on one date, linked to its Share Class and to the Fee Parameter it was judged against.
Bound columns are named after the figure they bound, with _lower_bound or _upper_bound added:
| Column | Slug |
|---|---|
| Performance Fee Cumulative | performance_fee_cumulative_local |
| Performance Fee Cumulative Lower / Upper Bound | performance_fee_cumulative_local_lower_bound, performance_fee_cumulative_local_upper_bound |
| Performance Fee Daily | performance_fee_daily_local |
| Performance Fee Daily Lower / Upper Bound | performance_fee_daily_local_lower_bound, performance_fee_daily_local_upper_bound |
| Performance Fee Cumulative Carried | performance_fee_cumulative_carried_local |
| Breach | performance_fee_breach |
| Distance Outside Bounds | performance_fee_distance_outside_bounds_local |
| Distance Outside Bounds In Percentage Of NAV | performance_fee_distance_outside_bounds_percent_of_nav |
| Model Status | model_status |
| Notes | notes |
Model Status is one of OK (judged, with a band), INACTIVE (no fee accrued yet this period), NO_FEE_REPORTED (the share class out-performed and nothing was charged, a finding rather than a gap), MISSING_PARAMETERS, MISSING_BENCHMARK or INSUFFICIENT_HISTORY. Only OK rows carry bounds and a breach flag; on every other row they are empty, and Notes says what stopped the model short. On a judged row, Notes gives the confidence the band was computed at and the estimators it rests on.
When the fee crystallizes less often than it resets, the bounds are on the period's own accrual plus the carried amount. With the crystallization frequency empty, the fee crystallizes at every reset and the carried amount is zero.
The Breach flag is what the Exception Framework's NGT rule pf.fee_breach raises an event on, graded by the distance outside the band as a share of NAV.
Review the bounds and breaches in a data view, chart the build-up on a canvas, and let a workflow or an agent flag deviations for review.