After a few assignments and rolls, the cost basis on your broker screen is probably wrong. It is not wrong like a typo. It is wrong because it mixed up two different jobs: your real tax basis and the running number you use to make trading decisions.
Traders end up with a spreadsheet that works fine for a month and then breaks the day a put gets assigned because they mixed up those two jobs. Assignment is when the option buyer exercises the right and makes you buy or sell the stock.
The fix for options cost basis math starts with one rule. A wheel cycle is the loop of selling puts and calls on one stock, and the cycle starts at the assigned put, not before. The premium collected on that put reduces your share basis, the price you are treated as having paid for the stock.
A put that expires worthless is different. Worthless means the stock stayed above your strike price, so nobody exercised the option and you keep the cash. That cash is realized income right away, and it never lowers a later share basis. It is the same discipline behind counting a cycle’s profit only once it is finished.
Mix those two rules up and your numbers will not survive contact with your 1099-B, the tax form your broker sends showing your reported gains and losses.
This guide is educational information, not tax advice. Gather your inputs before Step 1.
Before you start: the inputs your calculator needs
Clean cost basis math cannot be built from memory. Cost basis is what you paid for something, adjusted for fees and premiums. You need real records, so gather the following before Step 1.
Pull these documents for whichever tax year you are working on:
- Trade confirmations or a full transaction history for every option and stock trade: fills, prices, fees, and dates.
- Assignment and exercise notices. Assignment happens when you are forced to buy or sell shares because of an option you sold. These notices show when a put assignment turned into shares you own and when a call assignment took shares away.
- Your broker’s realized gain and loss report, plus Form 1099-B if it is ready. This is what the broker reports to the IRS about what it thinks you earned.
Decide on your two outputs now. You will build both side by side.
- A tax basis ledger: what counts as basis and proceeds under IRS reporting rules.
- A trading net cost and break-even number: what you actually use to decide if a position is still worth holding.
The two numbers will not match, and that is normal. Mixing them is what causes wrong numbers down the line.
Set up a simple spreadsheet. Excel or Google Sheets both work. Use these columns: Date, Symbol, Event type, Contracts or Shares, Strike, Premium, Fees, Cash flow, Basis impact, Notes. If you want a starting point that already handles the awkward cases, we published seven formulas that survive a roll.
One guardrail applies. If you trade the same stock across more than one broker or account, expect mismatches because wash-sale rules and basis adjustments rarely net cleanly across accounts.
With the documents pulled and the sheet open, move to Step 1.
Step 1: Establish share basis at the assigned put: the wheel cycle start line
Every cycle begins the same way. You sold a cash-secured put, which means you agreed to buy 100 shares at a fixed strike price and set aside enough cash to cover the purchase. Now the put has been assigned. Assignment is the moment the option buyer chooses to sell you the stock. That is the trigger event for everything that follows, and 100 shares per contract just landed in your account. If the obligations behind that trade are still new, our explainer on selling options for income covers what each contract commits you to before any basis math starts.
Open the sheet from the intro and add a new row for this event. Use one simple per-share rule to record it:
Share basis at assignment = put strike price − assigned put premium received − allocable fees
For example, suppose you sold a put with a $50 strike. The premium you collected was $1.20 per share, and fees ran $0.02 per share. The basis on the shares you now own is $50 − $1.20 − $0.02 = $48.78 per share. Basis is the starting cost you compare against a later sale to calculate gain or loss, so record $48.78 as the basis for this cycle.

The part that trips people up is this. The premium from an assigned put lowers your basis because it belonged to the same transaction that brought in the shares. You did not collect free cash and then separately buy the stock at the strike. The cash and the stock came as one package, so the premium folds into what you paid.
A put that expires worthless is different. Worthless means the stock stayed above your strike and nobody exercised the option. You keep the premium as cash and the trade is over. That premium is realized income on that trade alone. It does not carry forward, and it does not reduce the basis on shares you buy weeks or months later from a different put. Keeping those two events separate is the most common place traders get the numbers wrong.
Now run an operator check. That is a quick gut-check number you compute yourself, separate from what the broker shows. Since you have not sold any covered calls yet, the break-even on the shares equals the same number you just built: $48.78 in this example. Record it in your sheet as “Break-even, no calls sold yet.” The number feels solid because it matches your tax basis exactly and nothing else has touched it. That will not last. The moment you sell a covered call against these shares, a promise to sell the stock later at a set price, the tax rules and your trading math split apart. Step 2 shows exactly how.
Before moving on, name the cycle. Use a simple ID in this form: Symbol + assignment date + strike, which gives you something shaped like XYZ-YYYY-MM-DD-50P. Every later event tied to these shares, calls sold, rolls, and the eventual sale, gets logged under the same ID.
Mini-audit checklist for this step:
- You have the assignment notice with the date and strike.
- You have the fill confirmation showing the premium collected when the put was sold.
- You have the fee amount from that same fill.
- Your sheet shows one clean basis number and a cycle ID tied to it.
If all four check out, the cycle ledger entry is complete. You now have one starting basis for the shares, supported by the assignment notice and fill details, and you can move to the next step.
Step 2: Track covered call premium and rolls without losing your break-even
Your shares now carry one clean cost number from Step 1. Cost basis is simply what you paid for the position, adjusted for certain events. That number is about to be pulled in two directions at once. If you do not separate those directions now, the math will drift wrong for months without you noticing. This step assumes the call is already sold, since choosing the strike and expiration in the first place is a separate decision.
Keep this split in mind from now on. You will run two ledgers side by side, not one.
- Operator net cost on shares. Your working number, used to decide if the position still makes sense. It starts at the basis set in Step 1 and drops every time you collect covered call premium. A covered call is a promise to sell your stock later at a set price, and you collect cash upfront for making that promise. Rolls count too, since a roll is closing one call and opening a new one in its place.
- Tax reporting mapping. This is what appears on your 1099-B, the form the broker uses to report gains and losses for taxes. While you continue to hold the shares, covered call premium usually does not touch your basis. It shows up later inside the sale proceeds if the shares are sold through assignment. Assignment means the option buyer exercises the right and you must deliver the shares.
The two numbers will not match while you hold the stock, and that is expected. Keep them in separate columns so the two jobs never get mixed.
Now log each covered call sold against these shares. For every call, record the following:
- Open credit: the premium collected minus fees.
- Outcome: whether the call expired worthless or was rolled.
If the call expires worthless, the stock stayed below your strike and nobody exercised the option. The premium is then a realized gain on its own. Treat it as a reduction to your operator net cost. Your tax basis on the stock does not move, because you still hold the same shares.
A roll works differently. You buy back the call you sold and immediately sell a new one, usually at a different strike or a later date. We cover the full mechanics of closing one call and opening another separately, but for the ledger you only need both halves:
- The close: the amount paid to buy back the old call, plus fees.
- The open: the amount collected for the new call.
Combine the two halves into one number.
Net roll credit = new premium minus close cost minus fees
For example, suppose you close an old call for $0.80 per share and open a new one for $1.35 per share. If fees are $0.03 on each leg, net roll credit equals $1.35 minus $0.80 minus $0.06, which is $0.49 per share. Apply that $0.49 straight to your operator net cost. Your break-even drops by that amount, and the reason is visible in the ledger.
This gives the full formula for the working number:
Covered call break-even, operator version: share basis at assignment, minus total covered call premium kept to date, net of roll debits and credits.
Run the formula forward with the Step 1 numbers. Your basis was $48.78. If you sell one call that expires worthless for $0.60 per share net, then roll once for a net credit of $0.49 per share, your operator break-even is $48.78 minus $0.60 minus $0.49, which equals $47.69. That is the number you work with, not the frozen basis from assignment day.

One more warning. If your short call is later assigned and the shares are called away, meaning you must sell at the strike, the broker’s reported proceeds will often fold in that call premium. You will use the totals from this ledger in Step 3 to see exactly why the broker’s number and your working number diverge.
Ledger integrity check for this step:
- Your sheet shows cumulative covered call premium collected, with each call broken out.
- Your sheet shows a current operator net cost that updates after every expiration, close, and roll.
- Every roll has a timestamp, a close cost, an open credit, and a net roll credit figured from those two inputs.
If those three items are in your sheet, the ledger is current. You have a running number you can trust, and it is ready for the next expiration.
Step 3: Reconcile your cycle ledger to Form 1099-B: why your broker reports it differently
Your ledger now holds a clean running number for every cycle. A cycle is one full round of the wheel trade: selling a put, taking the shares if assigned, then selling a call on them. Now compare the ledger against the form the IRS actually sees.
Pull two documents for the same date range. Get the broker’s realized gain and loss report, plus Form 1099-B, the tax form the broker sends to the IRS showing what it reported about your trades.
Place both documents beside the cycle ledger from Steps 1 and 2, and match each 1099-B line to a cycle event in the following order.
Assigned put. Assignment means you had to buy the shares because the stock dropped below your strike. Often there is no separate 1099-B option line for this event. The premium you collected was folded into the stock’s basis, just as you calculated in Step 1. Basis is the cost used later to figure gain or loss, so the premium only appears later inside the reported basis when you eventually sell the shares.
Covered calls closed before expiration. These usually appear as their own 1099-B option line. Brokers often report the net gain as “proceeds” and show a $0 basis. That is only a formatting habit, not a sign that something is wrong.
Covered call assigned. This appears as a stock sale. The proceeds should reflect the strike price plus the call premium you collected, combined into one number.
While matching lines, you will likely hit three common mismatches.
Broker proceeds include option premium you tracked separately. Your ledger kept the call premium as its own line item. The broker folds that premium into the stock sale proceeds instead. The money is the same, but it sits in a different bucket.
Broker basis includes wash-sale adjustments your spreadsheet does not. A wash sale happens when you sell at a loss and buy a very similar position back within 30 days before or after. The IRS disallows the loss and rolls it into the basis of the new position. A plain spreadsheet will not catch this on its own.
Covered versus non-covered basis differences. Covered means the broker is required to report basis to the IRS. Non-covered lots, often older ones, may show no basis at all or show a different number than you expect.
Run a wash-sale reality check here as well. Wash sales can apply to stocks and options alike. Brokers also cannot see accounts at other firms, so a wash sale created by a trade somewhere else will slip past this 1099-B entirely. If the 1099-B shows a disallowed wash-sale loss, treat that broker-reported basis as a reporting input only. It is not the true net cost built in Step 2, so keep the two numbers separate in your sheet.
Build a simple five-column reconciliation table. Use these columns: 1099-B line, cycle ID, expected treatment, actual broker treatment, and reason for any gap. Every line should land in one of two buckets. Either it maps cleanly to a cycle event, or it is out of scope. Out of scope means it is unrelated to your wheel cycles, such as an index option taxed under different rules.

If your records still differ from the 1099-B after the matching, Form 8949 is typically where you disclose the adjustment to the IRS. This guide is not tax advice, so confirm your specific numbers with a tax professional before filing.
Pass/fail test for this step: every 1099-B line for the period must map to a cycle event in your ledger, or be clearly marked out of scope. If any line cannot be explained either way, stop and investigate that line before moving forward. You should now have a complete reconciliation table that accounts for every relevant 1099-B line against your cycle ledger, with a documented reason for any gap.
What success looks like: a wheel cost basis you can defend
At this point you should have three things. A wheel is a repeating cycle of selling puts, sometimes owning the stock, then selling calls against it.
First, a per-cycle ledger that starts on the assigned put date. That is the date the put was exercised and you had to buy the shares. You built this in Step 1.
Second, a running “net cost” number and a covered call break-even price. Break-even is the stock price where the trade stops losing money. The number updates every time you roll, which means you close one option and open a new one further out in time. That math came from Step 2.
Third, a 1099-B reconciliation table from Step 3. A 1099-B is the tax form your broker sends showing your trades. The table explains every gap between your numbers and the broker’s, instead of hiding it.
Run these checks to confirm your ledger is solid:
- The assigned put’s premium, the cash collected for selling it, shows up exactly once. It only lowers your cost basis on the cycle where that put was actually assigned.
- Premium from puts that expired worthless sits on its own line as income already earned. It never reaches forward to change a later basis.
- If your shares were called away, meaning the stock was sold because the call hit its strike, your ledger’s total premium should match the broker’s proceeds adjustment. The broker may show it in a different place, but the totals should agree.
The goal is not a perfect match to the broker’s screen. The goal is a ledger you can explain line by line.
One boundary still matters. If the reconciliation turns up wash-sale chains stretching across cycles, or trades spread across multiple accounts, stop reconciling on your own. A wash sale is a tax rule that can delay a loss you want to claim, so hand that piece to a tax professional.
Frequently asked questions
What is breakeven in trading, and how is it different from tax cost basis?
Breakeven is your working number. It gives the stock price where a position stops losing money, based on the actual net cost after every premium collected. Tax cost basis is a different figure. The IRS uses it to calculate gain or loss when shares are eventually sold. The two start equal in Step 1 of this guide, then split apart once you add rolls, wash sales, or the broker’s reporting habits. Treat them as separate tools built for separate jobs.
Does selling covered calls lower my cost basis for taxes?
Not while you still hold the shares. A covered call is a promise to sell the stock later at a set price, and the premium you collect lowers your operator net cost right away. That is your own tracking number, covered in Step 2. On the tax side, the same premium usually appears later inside the sale proceeds, but only if the call is assigned and the shares actually sell. Do not manually reduce the stock basis in your tax ledger simply because you banked a premium. That mistake creates larger problems at tax time.
Do wash-sale rules apply to options and wheel trading?
Yes. A wash sale happens when you sell at a loss and then buy a very similar position within 30 days before or after. The rule applies to stocks and options alike. One catch is that your broker cannot see accounts at other firms, so wash sales across different brokerages often do not net together on any single 1099-B, the tax form the broker sends the IRS. If your 1099-B shows a disallowed wash-sale loss, treat that number as a reporting input you still need to reconcile against your own ledger. See Step 3 for the full walkthrough.
Why does my 1099-B show proceeds for an option trade but a $0 cost basis?
This is a common formatting convention, not an error. On many written option closes, brokers report only the net gain or loss as “proceeds” and leave the basis field at $0. The math still nets out the same way in the end. To make sense of the line, map it back to your own cycle ledger. A cycle is one full round of the wheel: selling a put, perhaps getting assigned shares, then selling calls against them. Match the broker’s proceeds figure to the specific call or put event in your sheet, and the $0 basis stops looking like a red flag.
Is there a free cost basis calculator or option break-even calculator that handles the wheel correctly?
Broker tools are often free, but they follow broker reporting rules rather than the operator math a wheel trade needs. A basic spreadsheet can work if it follows two rules from this guide: an assigned put’s premium reduces your share basis, and a put that expires worthless is realized income that never reduces a later basis. Once you run cycles across more than one broker, a plain spreadsheet gets fragile quickly. At that point, tools built specifically for cycle detection and account-wide reconciliation save real time.
This FAQ is educational only. It is not tax advice, so confirm your specific numbers with a tax professional before filing.