Calculation Methodology
Every rule the ActiveACB engine enforces, with CRA references and known limitations.
1. Adjusted Cost Base Pooling
Canadian tax law (ITA s. 47(1)) requires that identical securities held in a taxable account form a single ACB pool. When you buy, the total ACB increases by the full cost (price × quantity + commission). When you sell, you remove a proportional slice of the pool: ACB removed = (ACB per share) × (quantity sold). The remaining shares carry the adjusted per-share ACB forward.
For accurate results, upload your full trading history from account inception. If you have positions that pre-date the data in your export, use the open-positions override at the start of a calculation to seed the opening ACB.
CRA reference: IT-387R2 “Meaning of Identical Properties”
2. Superficial Loss Rules
A superficial loss (ITA s. 54) occurs when you sell a security at a loss and you, or an affiliated person, buys the same or identical property within the 61-day window: 30 days before the sale, the day of the sale, and 30 days after.
Denied loss = min(window buys, shares held at window end, shares sold at a loss).
The denied amount is added to the ACB of the replacement shares (deferred, not permanent).
- Identical property: Any security with the same CUSIP or a deep in-the-money call option on the same underlying (CRA treats it as identical property under IT-387R2).
- Affiliated persons: Spouse or common-law partner, corporation controlled by you, and registered accounts (TFSA, RRSP, RRIF, FHSA) you contribute to. The engine detects cross-account superficial losses when you upload multiple accounts in the same session.
- TFSA/RRSP replacement: If the replacement purchase is inside a registered account, the denied loss is permanently lost (not added to the ACB of replacement shares), because the registered account’s ACB is irrelevant for tax purposes. The engine flags this separately.
- December-to-January look-forward: The 30-day window extends into January. The engine scans the full window even when it crosses a tax-year boundary.
CRA references: ITA s. 54, s. 40(2)(g)(i); IT-387R2
3. Foreign Currency (FX) ACB
Every purchase or sale of a foreign security requires converting to CAD at the exchange rate on the settlement date. The exchange rate used is the Bank of Canada nominal rate for that date (or the annual average if the daily rate is unavailable).
USD cash held in your account is itself a foreign currency and subject to FX gain/loss rules. The engine maintains a running ACB pool for USD (and any other foreign currency) just like a security pool. Each purchase of USD (when you buy a USD security) adds to the pool at the rate paid. Each sale of USD (when you sell a USD security) removes a proportional slice and computes a gain or loss.
CRA reference: ITA s. 39(1), 39(1.1); Folio S5-F4-C1
4. Options
The CRA treats options premiums and the shares acquired or disposed through them as linked events. The engine applies the following four-way matrix:
- Buy a call, then exercise: Premium paid increases the ACB of the shares acquired on exercise.
- Write (sell) a call, shares assigned away: Premium received increases the proceeds of the shares disposed of.
- Buy a put, then exercise: Premium paid reduces the proceeds of the shares disposed of.
- Write (sell) a put, shares assigned to you: Premium received reduces the ACB of the shares acquired.
- Expiry: A purchased option that expires worthless is a capital loss equal to the premium paid. A written option that expires unexercised is a capital gain equal to the premium received.
The engine links exercise and assignment events to the original option opening trade by matching symbol, expiry, strike, and option type within your uploaded data.
CRA reference: IT-479R “Transactions in Securities”; ITA s. 49
5. Corporate Actions
- Splits and consolidations: Share count scales by the factor; ACB per share scales inversely so total ACB is unchanged.
- Spinoffs: A portion of the parent’s ACB is allocated to the new entity based on the relative fair market value at the time of the spinoff. The engine uses the ratio specified in the corporate action data from your broker export.
- Mergers and name/CUSIP changes: ACB carries forward to the successor security. The pool is renamed, not reset.
- Return of capital (ROC): ROC distributions reduce the ACB of the security. If ROC reduces ACB below zero, the excess is a capital gain in that year. ETF annual ROC distributions are not yet automatically fetched. See Known Limitations below.
- Fractional shares, cash-in-lieu: Treated as proceeds from a partial disposition of the position.
- Worthless securities: ITA s. 50(1) allows an election to treat a security as disposed of at nil proceeds. The engine processes worthless-security elections and detects reversal events within the 30-day window.
6. T1135 Foreign Property Warnings
If the total cost of your foreign property (securities, real property, and other specified foreign property) exceeds $100,000 CAD at any point in the tax year, you are required to file Form T1135. The engine monitors the running cost of foreign-currency securities and flags a warning when the $100,000 threshold is approached or exceeded based on your uploaded data.
The warning is informational. The engine does not generate a T1135 form. Use CRA My Account or tax software for that.
CRA reference: ITA s. 233.3; Form T1135
7. Test Coverage
The engine runs over 1,200 automated test cases on every release. Test categories include:
- ACB pooling: buy/sell sequences, partial fills, average cost across multiple lots
- Superficial loss: basic denial, three-limiter edge cases, cross-account TFSA/RRSP, December-to-January look-forward, options as identical property
- FX: USD pool ACB, $200 exemption, multi-currency, annual average vs. daily rate
- Options: all four exercise/assignment cases, expiry, same-day linking, multi-contract fills
- Corporate actions: splits, reverse splits, spinoffs, mergers, ROC, name changes, worthless-security elections and reversals
- Multi-account: cross-account superficial loss detection, merged pool ACB
- Multi-year: carry-forward ACB from prior years, prior-year net capital loss application
- Parser: IBKR Flex Query XML edge cases, Questrade XLSX edge cases, multi-file deduplication
8. Known Limitations
- Supported brokers: Interactive Brokers (Flex Query XML) and Questrade (Activity Report XLSX). Other brokers via manual Raw Trades XLSX re-import.
- ETF/fund distribution adjustments: Return-of-capital and reinvested capital gains distributions from ETFs are not yet fetched automatically. If your ETF paid a distribution that reduces ACB, you must adjust ACB manually and re-import via the Raw Trades XLSX. We are building automated ETF distribution support.
- Cryptocurrency: Not supported. CRA guidance on crypto ACB is still evolving and the asset class requires a separate calculation approach.
- Non-calendar tax years: Not supported. The engine assumes January 1 to December 31 for all tax year calculations.
- Short selling: Tracked. Complex synthetic short positions involving multiple instruments may require manual review.
- Professional advice: Unusual corporate actions, cross-border estates, section 85 rollovers, and other non-standard events may require a tax professional to review the output.