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.6.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.6-py3-none-any.whl (1.1 MB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: ppar-0.1.6.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.6.tar.gz
Algorithm Hash digest
SHA256 53b5540082ffb4159c95b298e7fb4dde54ba7a7d05e74d18a9a6b27c2cd463a8
MD5 074630c1ee37704ffe493d65476e4618
BLAKE2b-256 73a99e3f34a2cbd1e6d0919f18bbdf60e7b761331a661d9cd2f7474143b83970

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ppar-0.1.6-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.6-py3-none-any.whl
Algorithm Hash digest
SHA256 2f7cacd00ad4f5b0bf924ce5a418bb6ec91ce8493688ede4c93afeb4c5862487
MD5 4b09a330d720b8d0c229d282f67de51f
BLAKE2b-256 fe43848807f7c30d13bd162df6c80b7bf15d5b8eee4b72d686eda30aac6b9c34

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

This release

0.1.6 This release

2 files

0.1.5

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