Move PSX holdings from a broker or CDC to a tracker
What a CDC statement contains and leaves out, what a broker screenshot shows, the SYMBOL SHARES PRICE paste format, and how screenshot import should work.
Your PSX holdings live in three places, and each tells a tracker something different. The CDC statement is the legal record: symbol and quantity, but no purchase price. The broker app’s portfolio screen adds the average cost the broker computed. The broker’s trade ledger has every individual buy and sell, which is what a tracker really wants. The fastest way to get any of them into a tracker is one line per holding in the form SYMBOL SHARES PRICE, pasted as text. If all you have is a screenshot, a screenshot import can read it, provided the app validates every parsed row against the real PSX symbol list and lets you check the result before it is saved.
What a CDC statement contains, and what it leaves out
If you registered for CDC Access, the Central Depository Company emails you an Account Balance Statement monthly or quarterly, and you can pull one on demand from the portal. It lists each security, the quantity in your sub-account or Investor Account, and whether any of it is pledged or blocked. It is the authoritative answer to “what do I own right now”.
It does not contain anything about money. CDC records custody, not trades. There is no purchase price, no date of purchase, no realised gain, no dividend history. Two further quirks: the statement often prints the full security name (“The Hub Power Company Limited”) rather than the ticker (HUBC), so you may need to map names to symbols, and the emailed PDF is typically password-protected with a CNIC-derived password, so it cannot be dropped straight into a parser without opening it first. If you are still setting this up, the CDC account guide covers registration.
Use the CDC statement for two things: to confirm the quantity your tracker shows is the quantity you actually hold, and to catch positions you forgot about.
What your broker’s portfolio screen shows
The portfolio or holdings tab in a broker app shows symbol, quantity, average buy price, current price, market value and unrealised profit. That average price is the number the CDC statement lacks, and a screenshot of this screen is the single most useful artefact for seeding a tracker.
Treat the average with some care. Brokers compute it differently after corporate actions: some rebase the average when bonus shares arrive, others leave the original cost against the original quantity and show bonus shares at zero. Some include commission and levies in cost, others do not. And the screen shows only open positions; a stock you sold last year, at a loss or a gain, is gone from it. If you want realised performance, you need the ledger.
The ledger (called trade history, transaction statement, or contract notes depending on the broker) can usually be exported as CSV or Excel, or copied from the web portal. Each row is one trade with date, symbol, buy or sell, quantity and price. This is the richest source and the one that lets a tracker compute weighted-average cost, realised gains, and the effect of a bonus issue correctly. The dividend and corporate-action post explains why the bonus math matters for cost basis.
The SYMBOL SHARES PRICE format
Most trackers, Equivest included, accept a plain text block with one holding or trade per line: the symbol, the number of shares, the price, and optionally a date. The separator can be a space, a comma, a tab or a pipe, so a paste from any of the common broker exports works without reformatting.
HUBC 500 186.40 2026-03-14
POL,100,612.00,14/03/2026
LUCK 40 1080.50
OGDC|1000|145.25|2026-01-09
A few practical rules from the way the parser behaves. A header row that mentions symbol, shares and price is skipped automatically, so leaving “Symbol, Shares, Price, Date” at the top is harmless. Thousands separators inside numbers (“1,234.56”) are stripped, but a comma-separated file whose numbers also contain commas is ambiguous; use tab or pipe separation from those brokers. Dates are read as ISO (2026-03-14) or day-month-year with slashes or dashes; a month-day-year date from a US-style export will be read backwards, so convert those first. A line with fewer than three values is flagged rather than guessed. Equivest’s soft limit is 500 rows before the preview gets slow and the hard limit is 10,000.
| Source | What you can paste | What is missing |
|---|---|---|
| CDC statement | Symbol and shares | Price and date |
| Broker portfolio screen | Symbol, shares, average price | Dates and sold positions |
| Broker trade ledger | Everything, one row per trade | Nothing; this is the full record |
Rebuilding cost basis when you only have quantity
If your only source is the CDC statement, you have symbols and quantities and no third column. There are three ways to fill it, in descending order of accuracy.
Pull the trade ledger from the broker for the positions in question. Even a partial ledger is better than nothing: two of five buys with real prices and three at an estimate is more accurate than five estimates.
Reconstruct from contract notes or bank statements. Every trade generated a contract note by email; the debit that paid for it is in your bank statement. Tedious, but exact.
As a last resort, enter today’s price and label the position as “cost unknown”. Your tracker will then show zero unrealised gain on that lot, which is wrong but honest, and dividends and future moves will be tracked correctly from that day forward. Do not enter a guessed historical price; a plausible wrong number is harder to fix later than a clearly labelled placeholder.
Bonus shares are always entered at zero cost. Right shares are entered at the subscription price you actually paid.
Screenshot import: what good looks like
Every serious PSX tracker now offers some version of “photograph your holdings and we will list them”. The engine underneath is usually a vision model reading the image into structured rows, and the quality of the feature depends less on the model than on what happens after it.
Three checks separate a safe implementation from a risky one. The parsed symbol must be validated against the actual PSX symbol table; a model that reads “HUBC” as “HUBG” should produce a flagged row, not a phantom holding. Quantities and prices should be sanity-checked against the stock’s recent price range, and if the screenshot shows a market value column, quantity times price should be compared to it. And nothing should touch your portfolio until you have seen every row on a review screen and confirmed it.
The residual error rate of vision models on clean app screenshots is low, a few fields in a hundred, but the errors are plausible-looking numbers rather than obvious garbage. That is exactly why the review step is not optional. Photographs of paper statements are harder than screenshots; expect more flagged rows and read them carefully.
How Equivest helps
Equivest’s portfolio tracker takes the paste format above through Settings, Data, Bulk import: paste or upload a CSV, TSV, pipe or whitespace file, review each parsed row in a preview list, untick anything wrong, and log the lot in one action. Header rows are skipped and thousands separators handled. Screenshot import follows the same pattern, parsed rows are validated against the live PSX symbol list and shown for review before anything is saved, and a position entered without a cost basis is labelled as such rather than shown with an invented gain.
This is education, not investment advice.