Trading Dev AcademyFree quant education

Free lesson · Fund operations & capstone

Reconcile the fund before reporting its return

Open interactive lessonPractice calculationsExplore labs

Start with the idea

NAV is the balance-sheet value belonging to investors. Per-unit NAV separates performance from new subscriptions; return calculations then decide how to treat the timing of capital flows.

Symbols, units & horizon
  • NAV: total net asset value in currency
  • NAV_unit: currency value per fund unit
  • Assets,liabilities: marked fund assets and obligations
  • rⱼ: subperiod return between external cash flows
  • R_TWR: time-weighted total return
  • ∏: multiply subperiod wealth factors
  • CFⱼ: investor cash flow, contributions negative and distributions/final value positive
  • tⱼ: years after initial investment
  • IRR: annual money-weighted return solving NPV=0
  • NPV: discounted net cash-flow sum
  • A,L,U: assets, liabilities and outstanding units in the derivation
  • S: subscription amount in currency
  • p: NAV per unit
  • ΔU: newly issued fund units

When and why to use this

Use unitised NAV for daily investor accounting, time-weighted return for manager performance and money-weighted return for investor cash-flow experience.

NAV=assets−liabilities,NAVunit=NAVunits outstanding
Algebra and arithmetic

Solve the fund balance sheet and unit price

  1. Assets must equal liabilities plus investor equity. Rearranging gives NAV=A−L. Divide by outstanding units U to obtain per-unit NAV.
  2. A subscription S at unchanged unit price p issues ΔU=Sp. New unit price (NAV+S)(U+Sp)=p, showing that new capital is not a return.
Work it by hand

NAV=$1m, units=10,000 gives $100/unit. A $200,000 subscription issues 2,000 units; $1.2m/12,000 still equals $100.

Assets include cash, positions valued under a documented policy, and receivables. Liabilities include financing, accrued expenses, and amounts owed. Reconcile broker records, internal trades, cash, corporate actions, and an independent valuation source. An unexplained reconciliation difference is an operational issue, not alpha.

RTWR=∏j=1m(1+rj)−1
Algebra and arithmetic

Remove external flows before compounding

  1. Split the record immediately around external flows. Each subperiod return compares value before the next flow with value immediately after the prior flow.
  2. Chain their wealth factors: 1+RTWR=∏j(1+rj). This removes flow size from the return calculation if valuations and timing are correct.
Work it by hand

100 grows to 110; deposit 90 makes capital 200; it grows to 210. TWR=1.10×1.05−1=15.5%, not 110%.

Time-weighted return divides the record at external cash flows and compounds the returns of those subperiods. A subscription increases assets and units; it is not investment profit. Money-weighted return instead reflects the size and timing of investor cash flows by solving for an internal rate of return.

0=∑j=0mCFj(1+IRR)tj
Cash-flow algebra; numerical roots in general

Set investor cash-flow NPV to zero

  1. Discount every signed investor flow to time zero at candidate rate r. IRR is a root of ∑CFj(1+r)tj=0.
  2. For one investment −C₀ and one payment Cₜ at T, isolate (1+r)T=CTC0, so r=(CTC0)1T−1. More flows usually require numerical solving and root checks.
Work it by hand

Invest 100 and receive 121 two years later: IRR=√1.21−1=10%/year.

Use investor outflows as negative and distributions plus terminal value as positive, with t in years. Irregular cash-flow patterns can produce multiple or no economically meaningful IRRs. State valuation times, cash-flow timing, and gross/net conventions in the report.

Research sources, review dates and limitations

Python implementation

Self-contained teaching example. Python 3.10+; dependencies and input conventions are shown in the code and notation. Run in your own Python environment.

from math import prod

def net_asset_value(assets, liabilities, units):
    return assets-liabilities, (assets-liabilities)/units

def time_weighted_return(subperiod_returns):
    """Split at external cash flows before supplying these returns."""
    return prod(1+r for r in subperiod_returns)-1

def npv(rate, cashflows, years):
    return sum(cf/(1+rate)**t for cf,t in zip(cashflows,years))

def bracketed_irr(cashflows, years, lower=-.9, upper=1.0):
    """Find ONE root in a supplied sign-changing bracket, not all possible IRRs."""
    if len(cashflows)!=len(years) or lower<=-1 or upper<=lower:
        raise ValueError("Invalid cash-flow alignment or bracket")
    fl, fu = npv(lower,cashflows,years), npv(upper,cashflows,years)
    if fl == 0: return lower
    if fu == 0: return upper
    if fl*fu > 0: raise ValueError("Bracket does not straddle a root")
    for _ in range(100):
        mid = (lower+upper)/2
        fm = npv(mid,cashflows,years)
        if abs(fm)<1e-10: return mid
        if fl*fm<=0: upper=mid
        else: lower,fl=mid,fm
    return (lower+upper)/2

print(time_weighted_return([.1,-.05]), bracketed_irr([-100,110],[0,1]))
def subscription_units(nav, existing_units, subscription):
    unit_price = nav/existing_units
    new_units = subscription/unit_price
    return new_units, (nav+subscription)/(existing_units+new_units)

Continue learning

Fund Operations & Investment Committee — all lessons
  1. Reconcile the fund before reporting its return
  2. Model fees and high-water marks explicitly
  3. Match portfolio liquidity to funding promises
  4. Capstone: defend a complete hypothetical fund

Quantitative finance and development glossary · Python resources and libraries · Research sources and limitations