# Classify your holdings

**Goal:** create a `metadata.srf` that tells zfin the asset class,
sector, and geography of each symbol, so
[`zfin analysis`](../reference/cli/analysis.md) and
[`zfin review`](../reference/cli/review.md) -- and their TUI tabs --
can group your holdings by category and sector.

**You'll need:** a `portfolio.srf` ([build one first](set-up-your-portfolio.md)).
For the automatic path, set `ZFIN_USER_EMAIL` (SEC EDGAR requires a
contact address). Full field list:
[`metadata.srf` reference](../reference/config/metadata-srf.md).

## Why classify?

Without `metadata.srf`, zfin can value your portfolio but can't group
it. Classification feeds the Asset Category / Sector / Geographic
breakdowns in [`zfin analysis`](../reference/cli/analysis.md), and the
per-holding Sector column and grouping in
[`zfin review`](../reference/cli/review.md) -- each as a CLI command
and as its tab in the TUI. A few lines unlock all of them:

```
  Asset Category
  Equity                   ██████████████████████████▋     89.2%  $1,233,151.30
  Fixed Income             ██                               7.0%  $96,922.00
  Cash                     █▏                               3.8%  $53,064.51
```

## Option A: bootstrap with `enrich` (recommended)

[`zfin enrich`](../reference/cli/enrich.md) queries Wikidata and SEC
EDGAR to generate classification lines for you. Point it at your
portfolio and redirect to `metadata.srf`:

```bash
ZFIN_HOME=~/finance zfin enrich portfolio.srf > ~/finance/metadata.srf
```

It writes a complete SRF file (header included) with one entry per
stock symbol. Symbols Wikidata doesn't know fall back to EDGAR's
mutual-fund map; anything that misses both is emitted as a `TODO`
line for you to fill in by hand.

To add a single symbol to an existing file, give `enrich` a symbol
instead of a file -- it prints just the classification lines (no
header), so you can append:

```bash
zfin enrich SCHD >> ~/finance/metadata.srf
```

## Option B: write it by hand

For a small portfolio, hand-writing is quick. One line per symbol:

```srf
#!srfv1
symbol::VTI,sector::Diversified,geo::US,asset_class::US Large Cap
symbol::AGG,sector::Bonds,geo::US,asset_class::Bonds
symbol::QQQ,sector::Technology,geo::US,asset_class::US Large Cap
```

The `symbol::` must match the `symbol::` (or `ticker::`) used in your
portfolio. Cash and CDs are classified as "Cash & CDs" automatically.

## Blended funds

A target-date or balanced fund spans several asset classes. Add one
line per slice with `pct:num:` weights that sum to ~100:

```srf
symbol::02315N600,asset_class::US Large Cap,pct:num:55
symbol::02315N600,asset_class::International Developed,pct:num:20
symbol::02315N600,asset_class::Bonds,pct:num:15
symbol::02315N600,asset_class::Emerging Markets,pct:num:10
```

## Fixing uninformative sectors

ETF holdings data sometimes tags everything as the generic
"Equity / Corporate," which collapses distinct holdings into one
meaningless group. When that happens, set a `bucket::` label yourself
to a grouping that actually distinguishes them -- it overrides the
auto-derived sector for concentration and dominance analysis. See the
[`bucket` field](../reference/config/metadata-srf.md#the-bucket-field).

For example, two broad funds that would both auto-bucket as
"Diversified" can be split into meaningful groups so concentration and
dominance analysis treat them separately:

```srf
#!srfv1
symbol::VTI,sector::Diversified,geo::US,asset_class::US Large Cap,bucket::US Total Market
symbol::SCHD,sector::Diversified,geo::US,asset_class::US Large Cap,bucket::US Dividend
```

## Verify

```bash
ZFIN_HOME=~/finance zfin analysis
```

If a symbol shows up under "Unclassified," it's missing a metadata
entry (or the symbol doesn't match). Add a line and re-run.

## Next steps

- [Map your accounts](set-up-accounts.md) for the tax-type breakdown.
- [Read your portfolio](read-your-portfolio.md) to interpret the analysis.

---

[Previous: Build your portfolio](set-up-your-portfolio.md) | [Next: Map your accounts](set-up-accounts.md) | [Documentation home](../README.md)
