Class PrivateMarketAnalytics
java.lang.Object
com.quantfinlib.markets.PrivateMarketAnalytics
PRIVATE-MARKET analytics — the toolkit for the asset class where the
usual machinery fails on purpose: no daily prices, cash flows the
manager (not the investor) times, and NAVs that are appraisals rather
than trades.
- IRR — the money-weighted return: the rate that zeroes the NPV of the fund's cash flows plus terminal NAV. It rewards the manager's TIMING (which a time-weighted return deliberately ignores), which is why PE quotes IRR and mutual funds may not. Solved by bisection with an explicit sign-change/bracket check — cash flows that never change sign have no IRR, and this throws rather than inventing one.
- Multiples — TVPI = (distributions + NAV)/contributions, DPI = distributions/contributions (the "cash back" ratio), RVPI = NAV/contributions (the part still an appraisal). DPI is the honest one: you cannot spend RVPI.
- Kaplan-Schoar PME — the public-market equivalent: grow
every contribution and distribution forward at the INDEX's
return and take
(FV(distributions) + NAV) / FV(contributions). PME > 1 means the fund beat just buying the index with the same cash flows on the same dates — the only fair benchmark for irregular cash flows, and the reason "our IRR beat the S&P's return" is not evidence. - Geltner desmoothing — appraisal NAVs are AR(1)-smoothed
versions of true returns (
r_obs_t = (1-phi) r_true_t + phi r_obs_{t-1}), which UNDERSTATES volatility and correlation to public markets ("volatility laundering"). Inverting,r_true_t = (r_obs_t - phi r_obs_{t-1}) / (1 - phi), recovers a series whose risk numbers can sit honestly next to public-market ones. The inversion is exact: smoothing then desmoothing round-trips to machine precision (pinned).
Cash-flow sign convention throughout: contributions (money in) NEGATIVE, distributions (money out) POSITIVE — the investor's perspective, matching every spreadsheet's XIRR. Period-indexed flows (annual/quarterly — caller's choice, IRR is per period). Research lane, deterministic.
-
Method Summary
Modifier and TypeMethodDescriptionstatic doubledpi(double contributions, double distributions, double nav) DPI: realized distributions to paid-in — the cash-back multiple.static double[]geltnerDesmooth(double[] observedReturns, double phi) Geltner desmoothing: inverts AR(1) appraisal smoothing with parameterphiin [0, 1).static doubleirr(double[] cashflows) Money-weighted return per period: solvessum cf_t / (1+irr)^t = 0.static doubleksPme(double[] contributions, double[] distributions, double terminalNav, double[] indexLevels) Kaplan-Schoar PME.static doublervpi(double contributions, double distributions, double nav) RVPI: remaining (appraised) value to paid-in.static doubletvpi(double contributions, double distributions, double nav) TVPI: total value (distributions + NAV) to paid-in.
-
Method Details
-
irr
public static double irr(double[] cashflows) Money-weighted return per period: solvessum cf_t / (1+irr)^t = 0. The final period's cash flow should include terminal NAV as a distribution.- Parameters:
cashflows- period-indexed, index 0 = today; must contain at least one negative and one positive flow
-
tvpi
public static double tvpi(double contributions, double distributions, double nav) TVPI: total value (distributions + NAV) to paid-in. -
dpi
public static double dpi(double contributions, double distributions, double nav) DPI: realized distributions to paid-in — the cash-back multiple. -
rvpi
public static double rvpi(double contributions, double distributions, double nav) RVPI: remaining (appraised) value to paid-in. -
ksPme
public static double ksPme(double[] contributions, double[] distributions, double terminalNav, double[] indexLevels) Kaplan-Schoar PME. Arrays are period-aligned withindexLevels(same length); contributions/distributions are the POSITIVE amounts flowing in each period.- Returns:
- PME; > 1 = fund beat the index on its own cash-flow dates
-
geltnerDesmooth
public static double[] geltnerDesmooth(double[] observedReturns, double phi) Geltner desmoothing: inverts AR(1) appraisal smoothing with parameterphiin [0, 1). Element 0 is kept as observed (no lag exists for it).
-