Skip to main content

PPAR Audit

Explain why reported portfolio performance changed.

PPAR Audit answers a difficult operational question: "Why did my reported portfolio performance change?" It compares two portfolio-accounting snapshots, quantifies supported causes across holdings, transactions, prices, FX, and related data, flags suspicious source-data relationships, and produces reviewer-ready Excel and HTML reports. When the available evidence is insufficient, the unexplained difference stays visible for human review.

  • Everything runs locally, so portfolio data stays inside your environment.
  • The Python implementation supports automated batch runs and local customization.
  • Standard output includes XLSX, HTML, CSV, JSON, and compact evidence bundles.

Download the product overview (PDF) | License

Downloading, installing, accessing, copying, or using PPAR constitutes acceptance of the license. The public package grants a time-limited internal evaluation license only; production and other commercial use require a separate written commercial agreement.


What PPAR Audit Answers

PPAR Audit is built around one operational question:

Why did my reported performance change?

  • Performance Comparison: identifies changed portfolio and security performance for each time period, quantitatively attributes defensible differences to supported source-data changes, and highlights anything that still needs human review.
  • Data Issues: flags suspicious source-data relationships — including price ranges, dividend rates, accrued-interest rates, and missing dividends — that may indicate data-quality issues independently of the performance explanation.

PPAR Audit portfolio report


Setup

Install the PPAR package:

pip install ppar

Create a local PPAR Audit workspace. The workspace includes PPAR-normalized demonstration data modeled on Axys/APX source and report data, so you can run the complete workflow before replacing the CSV files with reviewed exports from your own environment.

ppar setup ./my_ppar_audit

Run Audit:

ppar audit ./my_ppar_audit

Follow the Customizing With Your Own Data section in ./my_ppar_audit/README.md when you are ready to customize the workspace with your own data.

my_ppar_audit/
  README.md
  ppar.yaml
  run_audit.py
  snapshot_a/
    portperf.csv
    holdings.csv
    transactions.csv
    secmast.csv
    secperf.csv
    splits.csv
  snapshot_b/
    portperf.csv
    holdings.csv
    transactions.csv
    secmast.csv
    secperf.csv
    splits.csv

Inputs

The demonstration files are PPAR-normalized CSVs modeled on Axys/APX data. Production inputs may come from reviewed REP, IMEX, custom-report, or other controlled exports:

  • portfolio performance;
  • security performance;
  • holdings;
  • transactions;
  • security master data;
  • split factors.

Audit uses two source-data snapshots. Snapshot A is normally the older or original state and Snapshot B is normally the newer or restated state, but neither snapshot is presumed correct.

PPAR normalizes those files through a customizable ppar.yaml file, so each site can configure its local field names, transaction-code treatment, comparison tolerances, and report assumptions. The setup-created file documents these choices in place.

The configured file and accounting contracts fail closed when required source treatment is missing or ambiguous. Optional evidence does not silently expand the calculation or policy surface.


Outputs

PPAR Audit writes review packages:

output/
  portfolio/
    portfolio_audit.xlsx
    portfolio_audit.html
    source_detail.csv
    audit_support.zip
  security/
    security_audit.xlsx
    security_audit.html
    source_detail.csv
    audit_support.zip

To prevent unusably large artifacts, Audit stops with a nonzero exit code before writing a report when any primary review table would exceed 100,000 rows. The error identifies the oversized table and its largest contributors so the user can narrow the portfolio or date scope or correct upstream differences.


Current Validation Scope

PPAR Audit has substantial automated coverage, financial invariants, report reconciliation checks, output-integrity checks, deterministic demonstrations, and maintained scale gates.

It has not yet been validated against a real client's production-style Axys/APX exports and approved local accounting policy. The current program is seeking a small number of strong validation partners to test source authenticity, setup burden, financial interpretation, false positives, and reviewer usefulness.

PPAR Audit detects, compares, explains, and helps investigate supported portfolio-performance and source-data differences. It does not provide a financial-statement audit, GIPS verification, attestation, certification, or assurance opinion.


Additional Repository Capability

This repository also contains ppar.analytics, a maintained module for benchmark-relative performance attribution, contribution, and ex-post risk reporting. It is retained for future PPAR packaging but is not part of the current PPAR Audit validation program or default onboarding workflow.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ppar-0.1.5.tar.gz (1.1 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ppar-0.1.5-py3-none-any.whl (1.1 MB view details)

Uploaded Python 3

File details

Details for the file ppar-0.1.5.tar.gz.

File metadata

  • Download URL: ppar-0.1.5.tar.gz
  • Upload date:
  • Size: 1.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.1

File hashes

Hashes for ppar-0.1.5.tar.gz
Algorithm Hash digest
SHA256 894d03bbfaba679d8552b00950ed908a1ea88874d1020ac45951cd87c258dfef
MD5 4494489f9856402601ca8960fae23fc2
BLAKE2b-256 4ac33c0592628b131eddaa15b6fea33ee9ccb54879a986497fa767e9da168531

See more details on using hashes here.

File details

Details for the file ppar-0.1.5-py3-none-any.whl.

File metadata

  • Download URL: ppar-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.1

File hashes

Hashes for ppar-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 c1d3bf6e357f853c5dcb76f586d71e724084cfe453cb55bb329bd4bf983a34d4
MD5 e8d8a002c30017138803ba1dfe8cf8b0
BLAKE2b-256 9bf61ae3a6406b720b2d8d0233e83f8f91f337f0fd3a3a834a93f58f8b2f75a7

See more details on using hashes here.

Release history Release notifications | RSS feed

0.4.0

1 file

0.3.1

1 file

0.3.0

1 file

0.2.1

1 file

0.2.0

1 file

0.1.7

2 files

0.1.6

2 files

This release

0.1.5 This release

2 files

0.1.4

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page