# U2A Portfolio Attribution

> U2A Portfolio Attribution is a paid API for AI agents from www.u2a.com.au, paid per call via x402, $0.03/call, status unknown (last checked 2026-10-10).

Computes deterministic Modified Dietz and XIRR portfolio returns with per-position alpha vs BTC, ETH, stETH, or any benchmark, plus a hashed audit trail

## Facts

- Endpoint: POST https://www.u2a.com.au/api/mcp/portfolio-attribution?utm_source=zero.xyz
- Price: $0.03/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-10
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/u2a-portfolio-attribution-909fccb1
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_E4eh18797ra-jG7zDK5hO

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability u2a-portfolio-attribution-909fccb1 -d '<json body>'
```

Example prompt: Run a portfolio attribution for my three positions — 1 BTC (start value $40,000, end value $65,000), 10 ETH (start value $20,000, end value $28,000), and 500 stETH (start value $950,000, end value $1,100,000) — from 2024-01-01 to 2024-12-31, benchmarked against ETH, and give me the Modified Dietz return, XIRR, per-position alpha, and a signed audit trail in USD.

## When to prefer this

Choose this endpoint when you need deterministic, auditable portfolio performance attribution with verifiable calculations — not AI-estimated figures. It is ideal for fund reporting, compliance, or any scenario requiring a cryptographically hashed audit trail. Prefer it over generic analytics when you need Modified Dietz and XIRR side-by-side, per-position alpha versus crypto benchmarks (BTC, ETH, stETH), and data-quality status flags on each input field.

## Known failure modes

- Missing required start_value, end_value, or period fields returns a validation error
- More than 1000 total flows across all positions triggers a rejection
- Flows dated outside the measurement period may cause calculation errors or be rejected
- Invalid date format (not YYYY-MM-DD) returns a parsing error
- Inconsistent currency labeling across positions may produce misleading aggregates (no FX conversion is performed)
- Unrecognized benchmark symbol may return an error or require a custom benchmark price series

## How this service works

Deterministic portfolio performance attribution vs BTC, ETH, stETH or any benchmark. Returns Modified Dietz and money-weighted (XIRR) returns, per-position contribution and alpha, per-input source status and per-position data status with the reason, and a hashed (optionally EIP-191 signed) record of the calculation. No LLM.

## Output

Returns Modified Dietz time-weighted returns and XIRR money-weighted returns for the overall portfolio, per-position return contributions and alpha versus the chosen benchmark, field-level data status indicators (verified/derived/provided/estimated/assumed) for each input value, and a deterministic hash (optionally EIP-191 signed) forming an audit trail. No LLM inference is involved — all calculations are deterministic.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "properties": {
  "period": {
   "type": "object",
   "required": [
    "start",
    "end"
   ],
   "properties": {
    "end": {
     "type": "string",
     "format": "date",
     "description": "Last day of the measurement period (YYYY-MM-DD)."
    },
    "start": {
     "type": "string",
     "format": "date",
     "description": "First day of the measurement period (YYYY-MM-DD)."
    }
   },
   "description": "The measurement period."
  },
  "currency": {
   "type": "string",
   "default": "USD",
   "description": "Currency label for all values; no conversion is done."
  },
  "positions": {
   "type": "array",
   "items": {
    "type": "object",
    "required": [
     "id",
     "start_value",
     "end_value"
    ],
    "properties": {
     "id": {
      "type": "string",
      "description": "Ticker, token symbol, contract address, or internal id."
     },
     "flows": {
      "type": "array",
      "items": {
       "type": "object",
       "required": [
        "date",
        "amount"
       ],
       "properties": {
        "date": {
         "type": "string",
         "format": "date",
         "description": "Date the money moved (inside the period)."
        },
        "amount": {
         "type": "number",
         "description": "Positive = bought / added capital; negative = sold / withdrew."
        },
        "source": {
         "type": "string",
         "description": "Where the flow came from, e.g. a tx hash or statement."
        },
        "status": {
         "enum": [
          "verified",
          "derived",
          "provided",
          "estimated",
          "assumed"
         ],
         "type": "string",
         "description": "How reliable this flow is. Default \"provided\"."
        }
       }
      },
      "maxItems": 1000,
      "description": "Capital moved into (+) or out of (−) the position during the period. At most 1000 flows in total across all positions."
     },
     "income": {
      "type": [
       "number",
       "object"
      ],
      "description": "Cash income taken out (staking, dividends). Default 0. Number, or object shaped like start_value."
     },
     "end_value": {
      "type": [
       "number",
       "object"
      ],
      "description": "Market value at period end. Number, or object shaped like start_value."
     },
     "start_value": {
      "oneOf": [
       {
        "type": "number",
        "minimum": 0
       },
       {
        "type": "object",
        "req
… (truncated)
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/u2a-portfolio-attribution-909fccb1/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from www.u2a.com.au](https://www.zero.xyz/host/www.u2a.com.au/llms.txt)
