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 ignores by design), 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 realised cash: 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. It is 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 are comparable with 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. That is the investor's perspective, matching every spreadsheet's XIRR. Period-indexed flows (annual or 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).
-