Skip to main content
US market 13 min read

Dividend Capture Strategy Backtest: A Gap Smaller Than Costs

Does dividend capture work? 31,843 US ex-dividend days, 2016 to 2026, nine settings: prices fell less than the dividend, but none beat QQQ after costs.

Rerun this strategy with AI, no install

FinLab Studio opens in your browser: AI reruns the backtest with this article's rules, then you can change them and test again.

Rerun in Studio
The gap is smaller than costs

Dividend capture strategy backtest: growth of $1 for the capture rule against SPY, RSP and QQQ with dividends, zero cost, July 2016 to November 2026

Reproduce it

Run this strategy

Copy the prompt to reproduce the evidence above with the article’s data, assumptions, and risk checks.

Tell your AI:

Set up FinLab and rerun the dividend capture backtest on US stocks. Please read: https://finlab.finance/en/setup?relatedUrl=/en/blog/dividend-capture-strategy-backtest

No install, open FinLab Studio

A dividend capture strategy buys a stock just before its ex-dividend date and sells it right after. We tested it on US common stocks from July 2016 to November 2026, across 9 settings and 31,843 ex-dividend days. On those days the price fell by less than the dividend, about 76% to 93% of it at the median, so the average one-day trade made 0.17% to 0.18% on mid-sized payments. That gain is smaller than a 0.2% round trip. Buying three days before the ex-date on payments of at least 1% returned 8.6% a year with a Sharpe ratio of 0.75 at zero cost, against QQQ's 20.0% and 0.93. At 0.1% per side it returned 2.7% a year, and that is before tax on the dividends.

The idea is simple and the arithmetic is easy to misread. A stock pays you a dividend, its price falls on the ex-date by about that amount, and you have swapped price for cash. Dividend capture only makes money if the price falls by less than the dividend. In this sample it did, on average, and the rest of this article is about whether that gap is big enough to keep.

Dividend capture results at a glance

Bought before ex-date Minimum yield Sharpe, zero cost CAGR, zero cost Sharpe, 0.1% per side CAGR, 0.1% per side Trades Win rate Mean trade
1 day 0.5% 1.11 10.7% -0.51 -5.1% 17,527 54.6% 0.16%
1 day 1% 0.66 3.6% -0.33 -2.0% 5,849 53.8% 0.14%
1 day 2% 0.08 0.1% -0.44 -0.9% 1,097 53.5% 0.03%
3 days 0.5% 0.80 12.8% -0.04 -2.1% 17,505 54.5% 0.24%
3 days 1% 0.75 8.6% 0.29 2.7% 5,830 55.0% 0.37%
3 days 2% 0.33 1.3% 0.08 0.2% 1,089 53.1% 0.25%
5 days 0.5% 0.78 14.0% 0.18 1.7% 17,023 55.2% 0.37%
5 days 1% 0.76 11.9% 0.43 6.0% 5,644 56.5% 0.61%
5 days 2% 0.54 3.7% 0.40 2.7% 1,032 57.1% 0.78%

QQQ with dividends scored 0.93 and returned 20.0% a year over the same window (0.91 to 0.92 over the three setting windows that start later). The bold row is the original setting. SPY scored 0.86 and RSP, the equal-weight S&P 500 fund, 0.72. Mean trade is the arithmetic mean of each trade's return.

What the dividend capture rule does

  • Which dividends. Every cash dividend of a US common stock trading at least $20M a day on average, with a declaration date known by the day the signal is read. A payment with no declaration date cannot be planned for, so it is skipped.
  • When to buy. The signal is read 1, 3 or 5 trading days plus one before the ex-date, and the trade happens at the next close, so the stock is bought 1, 3 or 5 trading days before the ex-date.
  • When to sell. At the close of the ex-dividend date, once the dividend entitlement is locked in.
  • How big a dividend. The payment must be at least 0.5%, 1% or 2% of the stock price on the signal day.
  • Position size. Equal weight across current holdings, at most 5% of the account per stock, cash for the rest.

Prices are adjusted for dividends, so the holder receives the payment in the return. On 3,806 of 3,810 sampled payments in our data the dividend adjustment landed exactly on the ex-date, so the trade is credited with the dividend on the right day. That check matters: if the adjustment landed a day early or late, a backtest could capture the dividend it never held.

Do ex-dividend prices fall by the full dividend?

Dividend against prior close Events Median price drop / dividend Average one-day return Average return minus QQQ Break-even cost per side
Under 0.5% 14,393 0.77 +0.04% -0.04% 0.02%
0.5% to 1% 11,622 0.76 +0.17% +0.06% 0.08%
1% to 2% 4,737 0.88 +0.18% +0.03% 0.09%
2% and up 1,090 0.93 +0.02% -0.14% 0.01%

The column "Average one-day return" is buying at the close before the ex-date and selling at the ex-date close, using adjusted prices. Break-even cost per side divides that return by two, so it includes the market's return of that day; the column next to it removes QQQ's return for the day and is the more demanding figure.

Ex-dividend day price drop as a share of the dividend by yield bucket, median and mean, against a full drop

Prices fell by less than the dividend in every bucket. The median drop was 77% of the dividend for the smallest payments and 93% for the largest. The mean ratio, with extreme days clipped at -5 and +5, runs from 0.47 to 0.95; it is lowest for the smallest payments because an ordinary day's price move is large next to a tiny dividend. The closer the drop gets to the full dividend, the less is left to capture, and that is what the larger payments show: their average one-day trade was +0.02%, and it trailed QQQ's return that day by 0.14 points.

This is an old finding. Elton and Gruber (1970) reported ex-day price drops smaller than the dividend and attributed them to taxes: investors value a dollar of dividends at less than a dollar of capital gains. Frank and Jagannathan (1998) found the same in Hong Kong, where neither dividends nor capital gains were taxed, pointing to market microstructure rather than taxes. In both explanations the gap compensates for something.

Average one-day return from the day before the ex-date to the ex-date close, and that return minus QQQ, by yield bucket, against a 0.2% round trip cost

The red line is 0.2%, what a 0.1% per side commission costs on a round trip. No bucket clears it. Payments between 0.5% and 2% have an average one-day return of 0.17% and 0.18%, just under the line, and after subtracting QQQ's return that day only 0.03% to 0.06% is left. With events on the same date averaged first, only the 0.5% to 1% bucket's raw return is reliably above zero (t = 4.26; 1.60 for 1% to 2%). Against QQQ no bucket is: t = 1.56 for 0.5% to 1% and 0.02 for 1% to 2%.

The nine settings: one beat QQQ, and only before costs

Dividend capture daily Sharpe across 9 settings at zero cost and at 0.1% per side, buying 1, 3 or 5 days before the ex-date with minimum yields of 0.5%, 1% and 2%

Only one of the nine settings beat QQQ, which scored 0.91 to 0.93 over these windows, at zero cost: buying one day before the ex-date on payments of at least 0.5%, at a Sharpe ratio of 1.11. It made 17,527 trades over the decade, about 1,700 a year, and with that many trades a 0.2% round trip wipes out the return: 10.7% a year falls to -5.1%. The other eight settings scored 0.08 to 0.80 at zero cost, and the 2% minimum, with the fewest trades, scored lowest at each lead.

The longer you hold, the more the trade becomes an ordinary long stock position with a dividend attached, and it picks up the market's return. Buying five days before the ex-date is more exposed to the market, and at 0.1% per side it held up better (0.43 for the 1% minimum), mainly because it trades less per unit of holding time. This is still far below QQQ's 0.93.

The original setting failed all five checks: 0.75 at zero cost against 0.93, and 0.29 at 0.1% per side; 0.57 against 0.83 on returns above T-bills; 0.70 and 0.86 in the two halves against QQQ's 1.27 and 0.60; 0.86 against 1.26 after removing 2022, the year it led QQQ the most.

Average cumulative return from 10 days before the ex-dividend date to 10 days after, minus QQQ, by yield bucket

The path around the ex-date is flat to slightly falling for every bucket. Over the 20 trading days around the ex-date, stocks with payments above 1% end up behind QQQ by 1.5 to 1.6 percentage points, so there is no run-up to harvest and no rebound to wait for.

Taxes make it worse in the US

The backtest ignores tax, and for this trade the tax is large. In the US, ordinary dividends qualify for the lower long-term capital gains rate only if you hold the stock for more than 60 days within the 121-day period that begins 60 days before the ex-dividend date. A capture trade held for a few days never qualifies, so the dividend is taxed at ordinary income rates. For investors outside the US, the default withholding on US dividends is 30%, which a tax treaty may lower.

Take the average payments in two of the buckets. A 30% withholding on the 0.5%-to-1% bucket costs about 0.22% of the position per trade, and on the 1%-to-2% bucket about 0.39%. The average one-day returns before any cost or tax are 0.17% and 0.18%. Tax alone takes more than the whole edge, on the assumption that a real investor pays it. The equity curve at the top of this article is before tax, so the difference between it and a taxed version is the part the backtest cannot show you. An investor who pays no tax on dividends, in a tax-advantaged account for example, avoids this particular cost, but still pays the 0.2% round trip.

Why this is different from a dividend strategy

Holding dividend payers over the long run is a different trade. That is a bet on the companies that pay dividends. Capture is a bet on a one-day pricing gap and has almost none of the same return drivers. If you want the long-term version, see our dividend growth screen and the Dogs of the Dow backtest.

A related, slower effect exists. Hartzmark and Solomon (2013) document a dividend month premium: stocks tend to earn higher abnormal returns in months when a dividend is expected, and the effect fades after the ex-date. This test does not measure that premium over a whole month. In the path chart above, only the smallest payments rise against QQQ before the ex-date, by about 0.1 point.

The code

This is the original setting: buy three days before the ex-date, payments of at least 1%. On data through 2026-11-06 it prints a daily Sharpe of 0.75; the last digit can move as FinLab revises its data. The full research.py also runs the other eight settings, the cost runs and the ex-day study.

Show Code
import finlab
import numpy as np
import pandas as pd
from finlab import data
from finlab.backtest import sim
 
finlab.login()
data.set_market("us")
data.truncate_end = "2026-11-06"
 
LEAD_DAYS = 3
MIN_YIELD = 0.01
 
adj_close = data.get("us_price:adj_close")
raw_close = data.get("us_price:close")
volume = data.get("us_price:volume")
days = adj_close.index
 
# US common stocks, delisted ones included, one share class per company
profile = pd.DataFrame(data.get("us_company_profile")).astype({"stock_id": str}).drop_duplicates("stock_id")
keep = (
    (profile["security_type"] == "common_stock")
    & ~profile["is_etf"].fillna(False).astype(bool)
    & ~profile["is_fund"].fillna(False).astype(bool)
    & ~profile["is_adr"].fillna(False).astype(bool)
)
stocks = profile.loc[keep, ["stock_id", "company_name", "country"]].astype(str).sort_values("stock_id")
stocks = stocks.drop_duplicates("company_name")
stocks = stocks[stocks["stock_id"].isin(adj_close.columns)]
us_stocks = stocks.loc[stocks["country"].isin(["US", "nan"]), "stock_id"]
columns = sorted(stocks["stock_id"])
 
# Tradable on the day the signal is read: above $5, $20M a day, no +/-50% day in a year
dollar_volume = (raw_close * volume).rolling(60, min_periods=20).mean()
daily_return = adj_close.pct_change(fill_method=None)
wild = (daily_return.abs() >= 0.5).astype(float).rolling(252, min_periods=1).max().shift(1).fillna(0) > 0
tradable = (raw_close > 5) & (dollar_volume > 20e6) & ~wild
tradable = pd.DataFrame(tradable).reindex(index=days, columns=columns).fillna(False).astype(bool).values
close = pd.DataFrame(raw_close).reindex(index=days, columns=columns).values
 
# Every cash dividend with its ex-dividend date and declaration date
actions = pd.DataFrame(data.get("us_corporate_actions")).astype({"symbol": str})
dividends = actions[(actions["dividend"] > 0) & actions["symbol"].isin(us_stocks)]
 
holding = np.zeros((len(days), len(columns)), dtype=bool)
column_of = {symbol: i for i, symbol in enumerate(columns)}
ex_rows = np.searchsorted(days.values, pd.DatetimeIndex(dividends["date"]).values)
 
for symbol, ex, dividend, declared in zip(
    dividends["symbol"], ex_rows, dividends["dividend"], dividends["declaration_date"]
):
    col = column_of.get(symbol)
    signal = ex - LEAD_DAYS - 1          # read at this close, bought at the next close
    if col is None or signal < 0 or ex >= len(days):
        continue
    if pd.isna(declared) or declared > days[signal] or not tradable[signal, col]:
        continue                         # the dividend must be declared by the signal day
    if dividend / close[signal, col] >= MIN_YIELD:
        holding[signal:ex - 1, col] = True   # the last True day is ex - 2, so it is sold at the ex-date close
 
position = pd.DataFrame(holding, index=days, columns=columns).loc["2016-07-01":"2026-11-06"]
position = position.loc[:, position.any()]
 
report = sim(position, resample=None, position_limit=0.05, upload=False)
returns = report.creturn.pct_change().dropna()
print("Daily Sharpe:", round(returns.mean() / returns.std() * 252 ** 0.5, 2))

Install the FinLab skill for your AI agent

You do not need to write this yourself. Install the FinLab skill in Claude Code, Codex or Gemini CLI with one command:

Show Code
npx skills add koreal6803/finlab-ai --skill finlab -g -y

Then ask your agent in plain language, for example "rerun dividend capture on S&P 500 members with 0.05% per side" or "test holding each dividend stock for one week after the ex-date". The agent setup page has the details, and FinLab Studio runs the same research in a browser.

Backtest method and limits

Item How it was handled
Window 2016-07-01 to 2026-11-06. FinLab's US prices and dividend history start in January 2016, and the first months warm up the liquidity filter
Universe US common stocks, delisted ones included, one share class per company, no ETFs, funds or ADRs, and no companies whose profile names a country other than the US
Liquidity 60-day average of raw close times volume above $20M on the signal day, close above $5, no +/-50% day in the past year
Signals The dividend must be declared on or before the signal day, so this rule uses only information available when you buy (look-ahead bias control). Payments with no declaration date in the source are excluded, about 16% of payments from 2016 to 2026
Execution Signal read at a close, traded at the next close; sold at the ex-dividend close
Weights Equal weight, at most 5% per stock, rest in cash; the portfolio was 32% invested on average at the original setting. Turnover was 27.5 times a year one way on target weights
Cost finlab sim() default US cost of zero, plus a rerun at 0.1% per side. Slippage is not estimated separately, and capacity is not estimated
Taxes Not modelled. See the tax section
Sample Whole window in-sample. The halves only check stability; no out-of-sample test was run

What this result does and does not say

In this test, the ex-dividend day price drop is smaller than the dividend on average, so dividend capture trades had a positive gross return. It is small: the average one-day trade made 0.17% to 0.18% on payments between 0.5% and 2% of the price, before the market's return is removed and before costs or tax, and against QQQ's return that day no size group is reliably above zero. At a 0.1% per side commission, none of the nine settings beat QQQ, and the strategy's return fell well below that of holding SPY or RSP.

This is a test of liquid US stocks in one decade. A trader who can execute close to the midpoint at very low cost, for example with a broker that pays rebates, is closer to the zero-cost column. That column is still below QQQ in eight of nine settings. The table is the place to decide whether your own costs clear the hurdle.

For more results on US stocks, see the US corporate actions backtest, which covers dividend raises and initiations too, the covered call ETF comparison on income strategies, the low volatility stocks backtest and the US quant trading strategies overview. If you are new to rule-based investing, start with our quant trading guide.

FAQ

Does the dividend capture strategy work?

Before costs, on average, a little. Prices fell by less than the dividend on ex-dates in this sample, so a one-day trade around mid-sized payments made about 0.17% to 0.18%. At 0.1% per side, that gain is gone: the original setting returned 2.7% a year with a Sharpe ratio of 0.29.

How much does a stock price drop on the ex-dividend date?

In this sample the median drop was 76% to 93% of the dividend, depending on the size of the payment. Larger payments came closer to a full drop, and the very smallest ones (below 0.5% of the price) were 77% at the median.

Can you make money by buying the day before the ex-dividend date?

At zero cost, about 0.17% to 0.18% per trade on payments of 0.5% to 2%, only 0.03 to 0.06 points more than QQQ that day. With 0.1% per side, you lose money on average. The setting that bought one day before the ex-date with a 0.5% minimum yield scored 1.11 at zero cost and -0.51 at 0.1% per side.

Is dividend capture better than holding QQQ?

No. The zero-cost Sharpe ratio was 0.08 to 1.11 across the nine settings, with one setting above QQQ's 0.93. At 0.1% per side, every setting was below QQQ's 0.92, and the original setting returned 2.7% a year against QQQ's 20.0%.

What are the tax consequences of dividend capture?

The dividend from a trade held only a few days does not meet the holding period for qualified dividends in the US, so it is taxed as ordinary income. Non-US investors usually pay withholding tax on US dividends, 30% by default before treaty relief. This test does not include tax.

Does holding longer around the ex-date help?

Buying five days before the ex-date scored 0.54 to 0.78 at zero cost, and 0.18 to 0.43 at 0.1% per side, so it held up better after costs mainly because it trades less often for the same time in the market. It still stayed below QQQ.

Can I rerun this?

Yes. Install the FinLab skill through the AI-assisted setup, download research.py below and run python research.py.

Reproduce it yourself

  • research.py: the full study, including all nine settings, both halves, the cost runs and the ex-dividend day measurements.
  • data.csv: daily equity curves of the dividend capture rule at its original setting, plus QQQ, SPY and RSP.
  • metrics.json: the statistics behind this article, including the yield buckets and the 9 settings.

Disclaimer: this article is for education only and does not constitute investment advice. Past performance does not guarantee future results, and investing involves risk. Nothing here recommends any individual stock, and this is not tax advice. All results are in-sample, and the two halves were not validated out of sample.

Last updated: 2026-11 | Backtest window: 2016-07 to 2026-11 | Data through 2026-11-06, run 2026-11-09 | Benchmark: QQQ total return | Author: FinLab Quant Research (reviewed by a quantitative researcher)

FinLab AI

Want to build your own strategy?

Describe your stock-picking ideas in natural language. AI automatically validates, backtests, and gives you answers

Start Free

More Guides & Concepts research

View all