Epic 2: Returns Method Configuration
Status: ✅ Complete (January 2026)
Overview
Administrators can now toggle the return calculation method for each entity between:
- Modified Dietz:
daily_pnl / prior_day_nav(matches BTIG) - Simple Flat Capital:
daily_pnl / month_start_capital(original AIC method)
Database Schema
Entity Table Addition
-- Migration: 20260114212305_add_return_method_to_entity.sql
ALTER TABLE sable.entity
ADD COLUMN IF NOT EXISTS return_method TEXT
DEFAULT 'modified_dietz'
CHECK (return_method IN ('modified_dietz', 'simple_flat'));
Column Details:
- Default:
modified_dietz(for BTIG reconciliation accuracy) - Constraint: Only allows the two valid method values
- All existing entities default to Modified Dietz
View Update
The gold.v_dietz_daily view respects the entity's return_method setting:
-- Migration: 20260114212344_update_v_dietz_daily_for_method_toggle.sql
-- Return calculation switches based on method
CASE return_method
WHEN 'modified_dietz' THEN daily_pnl / begin_nav
WHEN 'simple_flat' THEN
CASE WHEN capital_amount > 0
THEN daily_pnl / capital_amount
ELSE NULL
END
ELSE daily_pnl / begin_nav -- Default fallback
END AS daily_return
The view exposes return_method column for transparency.
Admin UI
Location
Settings page: /protected/settings
Component
EntityReturnMethodsCard (components/settings/entity-return-methods-card.tsx)
Features
- Lists all entities for the organization
- Dropdown to select calculation method
- Real-time save with visual feedback
- Explanatory descriptions for each method
Screenshot
┌─────────────────────────────────────────────────────────┐
│ 📊 Return Calculation Methods │
│ Configure how daily returns are calculated per entity │
├─────────────────────────────────────────────────────────┤
│ │
│ Anthracite Holdings LP │
│ Daily PnL / Prior Day NAV (matches BTIG) │
│ [Modified Dietz ▼] │
│ │
│ Anthracite Realty Partners, LLC │
│ Daily PnL / Prior Day NAV (matches BTIG) │
│ [Modified Dietz ▼] │
│ │
│ Bird Family Foundation │
│ Daily PnL / Prior Day NAV (matches BTIG) │
│ [Modified Dietz ▼] │
│ │
├─────────────────────────────────────────────────────────┤
│ Method Descriptions: │
│ • Modified Dietz: Daily PnL / prior day NAV. Matches │
│ BTIG calculation for reconciliation accuracy. │
│ • Simple Flat Capital: Daily PnL / month-start capital │
│ This is the original AIC calculation method. │
└─────────────────────────────────────────────────────────┘
Method Comparison
| Aspect | Modified Dietz | Simple Flat Capital |
|---|---|---|
| Formula | daily_pnl / begin_nav | daily_pnl / capital_amount |
| Denominator | Prior day's NAV | Month-start capital |
| Cash flow handling | Time-weighted | Deferred |
| BTIG match | ✅ Yes | ❌ No |
| Use case | Reconciliation | Legacy reporting |
When to Use Each Method
Modified Dietz (Recommended)
- Default for all entities
- Use for BTIG reconciliation
- More accurate for entities with frequent cash flows
- Industry standard for time-weighted returns
Simple Flat Capital
- Legacy AIC calculation method
- Use only if explicitly required for specific reporting
- Not recommended for entities with cash flows
Implementation Files
| File | Purpose |
|---|---|
supabase/migrations/20260114212305_*.sql | Add return_method column |
supabase/migrations/20260114212344_*.sql | Update v_dietz_daily view |
components/settings/entity-return-methods-card.tsx | Admin UI component |
app/protected/settings/page.tsx | Settings page integration |
Related
- Modified Dietz Method - Detailed calculation methodology
- Epic 1: CLI Loss Function - Measuring return differences
- Epic 3: Automated Reconciliation - Flagging discrepancies