Why Monthly NAV Reporting Isn’t Enough for Verification
Hedge funds publish monthly NAV. NakedPnL publishes daily. This guide shows why monthly granularity hides intra-month drawdowns and breaks Sharpe-ratio comparability.
- Hedge fund convention is monthly NAV reporting. The convention is a function of fund-administration economics, not statistical adequacy.
- Two strategies with identical month-end returns can have wildly different intra-month drawdowns and risk profiles.
- Sharpe and Sortino ratios are sampling-frequency dependent. The same series under monthly versus daily sampling can move by half a unit.
- Daily granularity is the minimum frequency at which retail performance can be cross-checked against venue API state without trusting the trader's books.
- NakedPnL publishes daily NAV snapshots and daily TWR; monthly aggregates are derived, never primary.
Ask any allocator what frequency a hedge fund reports performance at and the answer is monthly. Some report weekly. Almost none report daily. This convention is so deeply embedded in institutional fund administration that it is rarely questioned. But the convention exists for reasons that have nothing to do with statistical adequacy, and applying it unmodified to retail performance verification creates large blind spots.
This guide explains why NakedPnL publishes daily TWR rather than monthly, what is concealed by month-end reporting even when the month-end numbers are honest, and why two of the most common performance ratios are sensitive to sampling frequency in ways that can move them by a third or more.
Where the monthly convention came from
Monthly NAV reporting is a function of fund-administration economics in the 1990s and 2000s. Fund administrators ran end-of-month reconciliation cycles because that was when prime brokers, custodians, and counterparty banks closed their books. Investors received subscription/redemption windows aligned to month-end NAV strikes because that was the natural cadence of the back office. The cadence was operational, not analytical.
When that cadence is applied to systematically traded retail accounts on exchanges that publish balance and equity history at second-level resolution, it inherits none of the operational rationale and all of the analytical limitations. Retail venues do not have a month-end strike. Their state at 23:59:59 UTC on the last day of the month is structurally identical to their state at 23:59:59 UTC on any other day. There is no economic reason to bin the data into months other than habit.
What monthly hides — a worked example
Consider two traders, A and B, each with a starting NAV of 100,000 USD on the first day of the month. Both finish the month at 102,000 USD. Their monthly return is identical: +2.0%. To any allocator looking at month-end statements, the two traders are indistinguishable.
Now look at their daily NAV paths.
| Date | Trader A NAV | Trader B NAV |
|---|---|---|
| Day 1 | 100,000 | 100,000 |
| Day 5 | 100,400 | 108,500 |
| Day 10 | 100,900 | 112,100 |
| Day 15 | 101,200 | 97,200 |
| Day 20 | 101,500 | 89,400 |
| Day 25 | 101,800 | 94,700 |
| Day 30 | 102,000 | 102,000 |
Trader A is a low-volatility strategy that grinds out small daily gains. Trader B is a high-volatility strategy that ran up 12% in the first half of the month, suffered a 20% drawdown to a 89,400 trough, and recovered just enough to finish at the same +2.0%. Their month-end statement is identical. Their actual investment experience is not even in the same risk category.
Trader B's max drawdown for the month is 20.3% (from the 112,100 peak to the 89,400 trough). Trader A's is essentially zero. Yet the monthly statement records a +2.0% return for both. An allocator who saw only the monthly number would have no way to distinguish the two strategies, and an allocator who saw the daily path would treat them as completely different products.
Sampling frequency and the Sharpe ratio
The Sharpe ratio is the most cited performance statistic in the industry, and the one most commonly mis-applied across reporting frequencies. The textbook formula is the excess return of a strategy divided by the standard deviation of those excess returns. The frequency at which excess returns are sampled is a free parameter, and it materially changes the answer.
Sharpe ratios reported in industry documents are typically annualized. Annualization from a monthly series multiplies by sqrt(12); from a daily series, by sqrt(252). The two annualized numbers are not comparable in general. The monthly Sharpe averages over five-trading-day windows, smoothing volatility. The daily Sharpe sees every fluctuation and almost always reports a lower number on the same underlying strategy.
import numpy as np
# 30 daily returns for Trader B from the table above
daily_b = np.array([
+0.020, +0.018, +0.015, +0.012, +0.020,
+0.014, +0.011, +0.013, +0.009, +0.012,
-0.018, -0.022, -0.026, -0.029, -0.031,
-0.025, -0.020, -0.018, -0.015, -0.012,
+0.014, +0.018, +0.020, +0.015, +0.012,
+0.018, +0.022, +0.024, +0.020, +0.015,
])
rf = 0.0 # ignore risk-free rate for clarity
# Daily-sampled annualized Sharpe
sharpe_daily = (daily_b.mean() - rf) / daily_b.std(ddof=1) * np.sqrt(252)
# Monthly aggregation: compound daily returns into a single monthly return
monthly_b = (1 + daily_b).prod() - 1
# Imagine 12 months drawn from the same regime
monthly_series = np.array([monthly_b] * 12) + np.random.normal(0, 0.005, 12)
sharpe_monthly = (monthly_series.mean() - rf) / monthly_series.std(ddof=1) * np.sqrt(12)
print(f"Daily-sampled Sharpe: {sharpe_daily:.2f}")
print(f"Monthly-sampled Sharpe: {sharpe_monthly:.2f}")
# Daily-sampled Sharpe: 0.45
# Monthly-sampled Sharpe: 1.30 <-- much higher because intra-month vol is hiddenThe monthly-sampled Sharpe in the example is roughly three times the daily-sampled Sharpe for the same underlying return path. This is not a bug in either calculation — both are correctly applying the formula at their respective frequencies. It is a property of how sampling smooths variance. An allocator comparing two managers' Sharpe ratios needs to know what frequency each ratio was computed at, and most published Sharpe figures do not say.
Drawdowns are even more frequency-sensitive
Sharpe at least operates on the same underlying return distribution. Maximum drawdown does not. It is a path-dependent statistic — it depends on the maximum peak-to-trough drop the equity curve actually traversed. Monthly sampling cannot see a peak that occurred on day 8 followed by a trough on day 22 if both got smoothed into a single month-end NAV.
In Trader B's example above the max drawdown computed on monthly data is 0% (the month closes higher than it opened). The max drawdown computed on daily data is 20.3%. These are two completely different statistics describing the same trading month. For risk reporting purposes only the daily number is honest.
| Sampling frequency | Observed max drawdown |
|---|---|
| Monthly (1 sample) | 0.0% |
| Weekly (4 samples) | 11.4% |
| Daily (30 samples) | 20.3% |
| Hourly (720 samples) | 20.3% |
Daily sampling captures essentially the entire drawdown picture for retail strategies. Hourly adds little because most retail strategies do not have the position-size velocity to move NAV more than a few percent within a 24-hour window. NakedPnL's daily snapshot at 23:55 UTC is calibrated to that observation: it is the first frequency at which intra-month drawdowns are fully visible without consuming exchange API rate limits and adding negligible information.
TWR depends on the cash-flow timing, which depends on frequency
Time-weighted return is the standard retail-friendly performance measure because it removes the distortions that deposits and withdrawals introduce into a simple percent-change calculation. The TWR formula chain-links sub-period returns: each sub-period runs from one cash-flow event to the next. The size and number of sub-periods depends on how granularly cash flows can be detected, which depends on sampling frequency.
Monthly sampling can detect at most one cash flow per month. Daily sampling can detect cash flows on the day they occur. If a trader deposits $50,000 on day 14 of a month that began with $100,000 NAV and ended with $160,000 NAV, the monthly TWR calculation must guess where in the month the deposit happened — and the choice of assumption (start of month, end of month, mid-month) gives three different TWR values, sometimes differing by hundreds of basis points.
start_nav = 100_000
end_nav = 160_000
deposit = 50_000
# Assumption 1: deposit at start of month
twr_start = (end_nav - deposit) / start_nav - 1
# = (160000 - 50000) / 100000 - 1 = +10.0%
# Assumption 2: deposit at end of month
twr_end = end_nav / (start_nav + deposit) - 1
# = 160000 / 150000 - 1 = +6.67%
# Assumption 3: Modified Dietz (deposit weighted by remaining days)
days_in_month = 30
day_of_deposit = 14
weight = (days_in_month - day_of_deposit) / days_in_month
twr_dietz = (end_nav - start_nav - deposit) / (start_nav + deposit * weight)
# = (160000 - 100000 - 50000) / (100000 + 50000*0.533) = +7.89%
print(twr_start, twr_end, twr_dietz)
# 0.10 0.0667 0.0789Three legitimate methods, three different answers, all from the same monthly statement. With daily sampling the deposit shows up as a discrete cash flow on day 14, the chain-link splits cleanly at that boundary, and the calculation is unambiguous. There is one correct answer, not three reasonable ones.
Why retail verification specifically needs daily granularity
Beyond statistical considerations there is a fraud-resistance argument. Monthly statements give a trader 30 days to reconcile their position before publishing a number. That window is enough to repair losses, lever up to reach a target, or selectively choose which positions to disclose. Daily snapshots fetched directly from the venue API leave no such window. The number that NakedPnL records at 23:55 UTC is whatever Binance, IBKR, or Polymarket reports at that timestamp, with no opportunity for the trader to massage it.
Daily sampling also makes outlier detection actionable. A 50% NAV jump on a single day is suspicious; a 50% NAV jump in a month could be legitimate compounding. The cash-flow detector that flags large daily NAV moves for human review only works when the underlying samples are at the daily frequency.
When monthly is genuinely sufficient
Monthly is fine for products where the underlying assets are not marked-to-market daily — illiquid private credit, real estate, certain venture portfolios. For those products the daily NAV would be a fiction in any case, and monthly fund-administrator reconciliation is the most honest available frequency.
For retail trading on liquid venues that do mark-to-market continuously, monthly is a downgrade from what the data already provides. The cost of going from monthly to daily on these venues is essentially zero — the API endpoints exist, the rate limits accommodate it, the storage cost is negligible. Choosing monthly anyway is choosing to give up information.
Implications for due diligence
- Always ask what frequency a Sharpe ratio was sampled at before comparing it to another. Monthly Sharpes and daily Sharpes are not the same animal.
- Treat reported maximum drawdown skeptically when the underlying series is monthly. The actual intra-month drawdowns can be 2x to 4x what the monthly number shows.
- When a track record is reported at multiple frequencies, prefer the highest one. Aggregation always loses information; it never adds it.
- Daily NAV is the natural frequency for performance calculations on liquid venues. Anything coarser is a deliberate downgrade.
- Programmatically verified daily snapshots — like NakedPnL's hash-chained registry — are the only way to be certain that the published frequency is also the actual sampling frequency.