Tax Lot
A tax lot is a discrete batch of a security carrying its own acquisition date, share count, cost basis, and holding-period clock. Buying 100 shares once creates one lot; buying 100 shares across three different days creates three lots, each tracked separately for tax purposes.
Lot-level accounting is required because the IRS taxes each disposition based on which specific shares were sold, not on aggregate position. Holding period (short vs long) is a per-lot determination — selling shares acquired 11 months ago triggers ordinary-income rates, selling shares acquired 13 months ago triggers long-term capital-gains rates, even if both lots are in the same account at the same brokerage on the same ticker.
Default lot-relief methods vary by asset class. Equities default to FIFO (first-in-first-out) under SEC rules. Mutual funds historically defaulted to average cost. Brokers must let customers elect alternative methods (LIFO, HIFO, specific lot ID) at trade time, but the elections are sticky — once executed, they cannot be retroactively undone for that trade.
Lot-level data is also the only path to correct wash-sale handling. When a loss is disallowed under §1091, the disallowed amount is added to the basis of the replacement lot — not redistributed across the position. Aggregate-basis systems can compute the wash-sale flag but cannot store the basis adjustment in the right place. Engines that ship without lot-level inventory ship with a known correctness gap on TLH workflows.
Realistic lot data is one of the larger separators between toy synthetic datasets and audit-grade ones. A typical mass-affluent household carries 30–80 lots across 3–5 accounts; an equity-comp-heavy or pre-retirement household carries 150–300 lots across 5–8 accounts. Synthetic data that ships with a single aggregate position per ticker fails any backtest that depends on holding-period mix, basis-spread distribution, or wash-sale cross-account replay.
Common pitfalls
- Storing lots as denormalized fields on a position rather than as first-class records — makes wash-sale adjustment storage clumsy.
- Letting fractional-share DRIP lots accumulate without rounding rules; positions can drift into impossible decimal-precision states.
- Forgetting that gifted lots inherit the donor's basis AND holding period — re-clocking them creates a tax bug on disposition.
- Treating a transfer-in lot as a new acquisition for holding-period purposes; in-kind transfers preserve the original lot's date.
Examples
Minimum schema for a tax-aware sell engine.
{
"lot_id": "L-2024-03-14-VTI-001",
"symbol": "VTI",
"shares": 50,
"acquisition_date": "2024-03-14",
"acquisition_method": "purchase",
"cost_basis_per_share": 218.42,
"holding_period": "short",
"wash_sale_disallowed": 0,
"qsbs_qualified": false
}