Manage investments and registered plans

Portfolio X-ray

See what your funds actually hold, so overlapping exposure across several funds becomes visible.

Last updated 2026-09-08

Holding five funds can look like diversification while all five lean on the same handful of large companies. The X-ray opens each fund up into what it holds and adds those pieces together, so the picture is the companies you are exposed to rather than the funds you bought.

This is description, not advice. TallyFolio reports what your own files say and stops there — it never scores a portfolio, compares it to anything, or suggests buying, selling, or rebalancing.

Setting it up

  1. Import your positions first, under Holdings then Positions. The X-ray needs to know what you hold before it can open anything up.
  2. Download the holdings file for one of your funds. Every provider publishes one — usually monthly, as a CSV of anywhere from fifty to several thousand rows, listing each company and the share of the fund it represents.
  3. Open Holdings, then X-ray, then Import holdings file. Choose which fund the file describes, the date on the file, and the header row number if the provider put title rows above the real header.
  4. Match the columns. A weight is required, plus a ticker or an ISIN. Everything else improves identification.
  5. Repeat for each fund. Funds without a file still count — as themselves.

What the figures mean

Each fund position is split across the companies its file lists, in proportion to their weights, and added to anything you hold outright. Employer stock you own directly and the same company sitting inside an index fund become one exposure, not two, which is the whole point: that doubling-up is invisible at the fund level.

The headline figure is the combined share of your largest exposures. Beside it, every security lists how much reaches it through funds, how much you hold directly, and which funds it came through.

What the figures could not see

Percentages are always a share of your whole recorded holdings value, so anything unseen makes them a floor rather than the full picture. Three gaps are reported rather than hidden:

  • A fund with no holdings file counts as itself. What it holds inside is unknown, not absent, and the page says how much of your portfolio that covers.
  • A file whose weights do not add up to 100% leaves the remainder unattributed — usually cash the fund holds, and rows with no identifier such as futures or payables. That remainder is shown per fund rather than being spread across the listed holdings, which would overstate every one of them.
  • A holding in a currency with no exchange rate is left out entirely rather than counted at par. Add the rate in Settings to bring it in.

How these shares moved

Positions are dated snapshots, so once you have imported more than one date the Positions page shows how each of your largest holdings got to its present size — its share of your recorded value on every date, and the change across them. It reports what your files say and nothing more: no trend is projected, no target is implied, and a rising or falling share is never marked as good or bad.

A portfolio on an older date is assembled from each account’s newest file on or before it, carried forward, so a month where one account filed nothing still reads as the whole portfolio instead of making every other share jump. An account whose first file came later is not carried backwards — it was not in the record yet — so those dates describe a smaller portfolio and are flagged rather than presented as a step in the same line. A security missing from a file shows a dash, not 0%: not listed is not the same as none held.

What date these figures describe

Every figure here is assembled from files exported on whatever day you happened to export them. Each account contributes its own newest positions snapshot, and each fund is opened up using its own newest holdings file, so a TFSA last imported in March and an RRSP imported yesterday are added together into one percentage. The banner at the top states the date the picture was last brought up to date, and, when the accounts disagree, how many days apart they are.

An account or a fund file more than three months old is marked, because a broker statement cycle and a provider's publishing cycle have both turned over by then — what those files describe is no longer what you hold. Nothing is ever estimated forward to today: an old file is used exactly as it was written and named as old, rather than aged into a guess about the present.

How holdings are matched up

A company is the same company across two different funds when the files agree on its ISIN, or on its ticker and exchange. Nothing else is inferred, because wrongly merging two companies would corrupt every figure that follows, and wrongly splitting one would hide exactly the overlap you came here to find.

Within one file, several lines for the same company — different share classes, or a listing split across venues — have their weights added rather than one being kept. A line where the fund lists itself is dropped, because counting it would inflate everything else.

Importing a holdings file replaces whatever was recorded for that fund and date. A company the fund has sold is expressed by its absence from the newer file, so replacing is the only reading that can remove it. Other dates and other funds are untouched, and the newest file for each fund is the one the figures use.

Sector and geography

Provider holdings files name an industry and a country beside every line, and mapping those two columns during import turns the look-through into two more readings. A company reached through two funds and also held outright lands in one sector once — the same arithmetic behind the concentration figures, grouped differently. Broker positions files often carry the columns too, which is what lets stock you hold outright be classified at all.

Labels are recorded exactly as the file published them and are never mapped between providers. Merging one provider's “Information Technology” into another's “Technology” would mean inventing a classification scheme, and a wrong merge would be invisible in every figure that follows — so two files that disagree show up as two rows. Whichever file names a company first is the one kept, so the figures do not change with import order. Companies no file has labelled are gathered into Unclassified and listed by name; funds with no holdings file are in neither column, because a fund has no sector of its own to lend the companies inside it.

Currency exposure

The same holdings are counted twice over: once by the currency each position trades in, and once by the listing currency of the companies inside it. A fund listed in Canadian dollars can hold several hundred companies priced in US dollars, and at the fund level nothing shows it. The gap between the two columns is exposure you did not pick when you bought the fund.

Both columns are a share of the same total, so a percentage on the left and one on the right mean the same thing. A fund with no holdings file stays in that total but is left out of the right-hand column, and its value is named underneath — its internal mix is unknown, and counting it as the currency the fund itself trades in is precisely the misreading the comparison exists to correct.

Where your funds overlap

For each pair of funds, the share of the two that is the same companies: across every company both hold, the smaller of its two weights, added up. Two funds with identical compositions are 100% overlapped; two that share nothing do not appear at all.

Each pair also names its largest shared companies and how much of your own money reaches them through either fund. Funds with no holdings file are listed as not compared rather than shown as overlapping nothing — an unknown composition is not an empty one.

Common mistakes

  • Uploading the fund’s fact sheet or performance file instead of its holdings file. The one you want lists every position and a weight column.
  • Leaving the header row number at 1 when the provider put several title rows above the real header. The column names in the preview tell you immediately whether it was read correctly.
  • Choosing the wrong fund on the first step. The file is recorded against whichever fund you pick, so its weights would be applied to the wrong position.
  • Reading the headline percentage without the coverage panel beneath it. A portfolio where half the funds have no holdings file yet is only half seen.
  • Expecting weights to be topped up to 100%. They are not, deliberately — the gap is real and is shown as unattributed.

FAQ

Does TallyFolio download holdings files for me?
Normally no — you download the file from the provider and import it yourself. One optional feature, off by default, can re-fetch a file you have already imported from the address you saved with it, so you do not have to download and re-map it every month. It asks only for that public file and sends none of your records. There is never any connection to a broker or a bank.
Is the holdings file stored anywhere?
No. It is read in memory and discarded. Only the weights shown on the review step are saved.
Why does a fund still appear as itself?
Because no holdings file has been imported for it. Import one and it will be replaced by the companies it holds.
My weights add up to 97%. Is something missing?
Usually not. Funds hold some cash, and files carry rows with no identifier — futures, payables, receivables — which cannot be attributed to a company. The remainder is shown per fund rather than being quietly redistributed.
Can TallyFolio tell me whether I am too concentrated?
No. It reports what your exposure is and leaves the judgement to you. TallyFolio does not give investment advice.

Where this lives in the app

Related articles

  • Positions and concentration

    Record what each investment account holds, security by security, and see how concentrated those holdings are.

  • Investments and registered plans

    Record contributions and withdrawals, and keep a personal estimate of TFSA, RRSP, and FHSA contribution room.

  • Exchange rates

    TallyFolio supports CAD, USD, EUR, and GBP with exchange rates you enter yourself, dated for when they apply.