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 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 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 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).