Class PrivateMarketAnalytics

java.lang.Object
com.quantfinlib.markets.PrivateMarketAnalytics

public final class PrivateMarketAnalytics extends Object
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 Type
    Method
    Description
    static double
    dpi(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 parameter phi in [0, 1).
    static double
    irr(double[] cashflows)
    Money-weighted return per period: solves sum cf_t / (1+irr)^t = 0.
    static double
    ksPme(double[] contributions, double[] distributions, double terminalNav, double[] indexLevels)
    Kaplan-Schoar PME.
    static double
    rvpi(double contributions, double distributions, double nav)
    RVPI: remaining (appraised) value to paid-in.
    static double
    tvpi(double contributions, double distributions, double nav)
    TVPI: total value (distributions + NAV) to paid-in.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Method Details

    • irr

      public static double irr(double[] cashflows)
      Money-weighted return per period: solves sum 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 with indexLevels (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 parameter phi in [0, 1). Element 0 is kept as observed (no lag exists for it).