Every broker and prop firm will tell you discipline is what separates traders who last from traders who don’t. Several of them ship apps to help with it.
I went looking for a controlled evaluation of any of those tools — a holdout, a before-and-after, any counterfactual at all. There isn’t one. Not a single company in the category has published one.
There are numbers. Topstep publishes “50% Longer” for accounts that set a Daily Loss Limit, footnoted to internal data with no sample and no control — and confounded, because setting a limit also unlocks payout benefits, so the people who set one are self-selected. Capital.com’s 2019 white paper is the most methodologically explicit document in the category and still only reports that newcomers who chose to read its messages improved 6.5%. hoc-trade publishes dozens of percentages attributed to “TradeMedic Research, 2026” on 500,000+ accounts; its own research page reads “Coming Soon.”
The only randomised trial I could find in this space is the Ontario Securities Commission’s 2022 gamification study — 2,430 participants — and it measured harm from gamification rather than benefit from remediation. Points made people trade 39% more.
So instead of a fix, I measured the problem. From public portfolios on a social-trading platform, on data anyone can download free in about ten minutes.
The thing being measured
In 1998 Terrance Odean published a paper with a deliberately boring title — “Are Investors Reluctant to Realize Their Losses?” — and a finding that has refused to go away.
He took brokerage records and asked one question. When someone was sitting on a winner and a loser, which did they sell?
PGR is, of the winning positions someone could have sold, the fraction they sold. PLR is the same, for losing positions. If people were indifferent, these would be about equal.
Odean found PGR 0.148 and PLR 0.098 — winners sold, in his words, “a little over 1.5” times more readily than losers. The dataset was 10,000 accounts at a large discount brokerage, 1987 to 1993; the PGR/PLR test rests on the 6,380 of those accounts trading CRSP-listed stocks, across 97,483 transactions.
That is the disposition effect. It is why “cut your losses, let your winners run” is advice that needs repeating — most people do the opposite and do not notice.
The data
Replication files for a 2021 PLoS ONE study sit on Harvard Dataverse under CC0 1.0 — public domain, no permission, no request form, no login.
Xuejun Jin, Rui Li and Yu Zhu, “Could social interaction reduce the disposition effect? Evidence from retail investors in a directed social trading network,” PLoS ONE 16(2), 11 February 2021, doi:10.1371/journal.pone.0246759. Data: doi:10.7910/DVN/NI6SBJ.
The platform is Xueqiu.com, which the authors describe as China’s largest social trading platform. The holdings are Shanghai and Shenzhen A-shares. The dataset covers 4,732 traders. The main panel file I compute on contains 4,731 of them, across 3,501 distinct stocks and 2,780,879 trader-stock-lot-days, from 24 June 2016 to 27 March 2018.
Each row carries two binary flags: did you close this position today, and was it in profit. PGR and PLR are a two-way crosstab of those two columns. There is no model and nothing to tune — which is the point. There is nowhere to hide a researcher degree of freedom.
One thing to be clear about up front, because it is the first question a careful reader should ask. This dataset’s unit of observation is every stock-day a position is held, not every day a sale happened. So my PGR and PLR are daily hazards: P(close today, given in profit today). That is the authors’ own design, not a choice I imposed. Odean’s convention is different, and it changes which comparisons are legitimate — more on that below.
The result
Pooled across every observation: PGR 0.0785, PLR 0.0535. A ratio of 1.47x.
Computed per trader and then averaged, so that one hyperactive account cannot carry the result: PGR 0.1925, PLR 0.1200. A ratio of 1.61x.
And the number I would actually put in front of someone: 76.1% of individual traders realised gains more readily than losses. That is 3,547 of the 4,659 traders who held at least one winner and at least one loser, so that both measures are defined for them. Paired t = 33.5. Cohen’s d = 0.49. Binomial p on the order of 10^-293.
Three in four, counted trader by trader, so not an artifact of pooling. Whether it reflects a preference for selling gains is not established: the direction survives a holding-age control, but the size depends on how “gain” is timed, and a V-shaped selling pattern is not ruled out (see the robustness update, 17 Oct 2026, below).
Worth noting: Jin, Li and Zhu never report PGR or PLR. They report hazard and odds ratios from survival and logistic models. So this particular measurement appears to be new even on their own data, though it is arithmetic rather than anything clever.
Three caveats that move the number
I would rather state these than have them found.
1. The dataset’s two files are nested, not independent
The archive ships two files. It is tempting to treat them as two samples and report both. They are not independent, and I checked: 2,648 of file 1’s 2,649 traders are also in file 2 — 100.0% — along with all 3,468 of its stocks and 99.6% of its trader-stock-day keys.
File 1 is the subsample of traders selected on having acquired at least one follower; it carries the follow-date columns for the paper’s pre/post-follow design. Selecting on being followed is selecting on a behavioural variable, plausibly correlated with activity and skill.
It gives 1.75x — same sign, larger magnitude. I report it as a robustness check and not as a replication. Anyone adding the two trader counts together to claim 7,380 traders is double-counting. The union is 4,732.
2. Multiple lots in the same stock on the same day
About 0.18% of rows share the same trader, stock and day; in most of those groups the profit flag differs — multiple lots opened at different prices, one in profit and one under water. So the true unit is trader-stock-lot-day.
I keep every lot. Collapsing them to one row per trader-stock-day instead moves the per-trader ratio from 1.61x to 1.78x, and the share from 76.1% to 78.8%.
Robust in sign, sensitive in magnitude. The alternative treatment gives a stronger result, which is exactly why it should be disclosed rather than quietly chosen.
3. My levels are not comparable to Odean’s. Only the ratio is.
Odean counted only days on which a sale occurred. In his words: “On days when no sales take place in an account, no gains or losses, realized or paper, are counted.” Mine counts every held day.
That is not a small difference, and Odean’s own paper shows how large it is. His account-level alternative, on the same data, gives PGR 0.57 and PLR 0.36 — against the 0.148 and 0.098 of his Table I.
So: Odean’s sale-day denominator gives a ratio of 1.51. His account-level alternative gives 1.58. This dataset gives 1.61. The levels move by a factor of roughly four — 3.85× on PGR and 3.67× on PLR. Within Odean’s own data the ratio moves under 5% (1.51 to 1.58); from his 1.51 to this dataset’s 1.61 it moves more, and reproduce.py prints “the ratio moves <7%”.
Ratios survive the change of denominator and levels do not. That is why every comparison in this post is a ratio, and why you should be suspicious of anyone putting a PGR level from one study beside a PGR level from another without saying which denominator each used.
Check it yourself
Download the file and run a few lines.
curl -sL "https://dataverse.harvard.edu/api/access/datafile/4053809" -o sample2.Rdata
pip install pyreadr
import pyreadr
df = list(pyreadr.read_r("sample2.Rdata").values())[0]
print(df[df.gain == 1].sale.mean(), df[df.gain == 0].sale.mean())You should get 0.078536 and 0.053510. If you get anything else, I want to hear about it. There are no nulls in either column, so there is nothing to drop first.
The full code — the download, every number in this post, and the robustness checks — is in a public repo: github.com/donttrade/disposition-effect. One script, MIT licensed, no dependencies beyond pandas, numpy, scipy and pyreadr. If it does not reproduce for you, open an issue. The robustness update below (17 Oct 2026) was computed with separate scripts that are not yet in the repository.
What this does not show
It measures the problem, not a fix. Nothing here says whether anything corrects the disposition effect.
Chinese A-shares, mid-2016 to early 2018, one social-trading platform. Whether it holds for North American retail today is an assumption, not a result.
Social-trading users are a selected population. Xueqiu cube operators chose to run public portfolios.
I did not collect this data. It is someone else’s replication file, released CC0. The contribution is the computation and publishing it.
The pooled and per-trader ratios differ, 1.47x against 1.61x, because the denominators differ. Both are above. Quoting one without the other is picking.
Significance is not effect size. The t-statistics are enormous because n is enormous. Cohen’s d of 0.49 is the honest magnitude of this measure: moderate, not overwhelming. The robustness update below shows the size also depends on how “gain” is timed.
No minimum activity was required. A trader with one winning and one losing held day counts the same as one with thousands; how sensitive the share is to a minimum-activity rule has not been computed.
Traders whose two rates are exactly equal are counted as not showing the effect; reproduce.py does not report how many there are.
The source data’s gain flag is 1 only when a position was in profit, so a break-even day counts on the loss side. The client script, partner_disposition.py, drops break-even rows instead.
Robustness update, 17 Oct 2026: does the effect survive holding age?
In short: the pattern does not go away when holding age is held fixed, but its size depends on how “gain” is timed and on one test that could not be run.
Why we checked. Positions get sold less often the longer they are held. If losing positions tend to be older, they will look “held on to” even when nobody is reluctant to sell them. On made-up data with no disposition effect, only that age pattern, the method used in this study reported an effect in 20 of 20 trials. So I wrote a new test and a pass mark down before running it on this panel. The seal hash is recorded in SEAL-ROBUST.md and will be published in the study repository’s commit history.
What came out.
| Measure | Result |
|---|---|
| Original pooled ratio (all ages mixed) | 1.47 |
| Same, holding age fixed | 1.33 (95% CI 1.31–1.36) |
| Each trader compared with themselves, same holding day (the pre-registered test) | 1.70 (95% CI 1.63–1.78) |
| Positions held ≤ 1 day | 2.27 |
| Held 2–5 / 6–20 / 21–60 / 61–250 days | 1.21 / 1.07 / 1.13 / 1.10 |
| Held more than 250 days | 0.98 (95% CI 0.85–1.12): no detectable effect |
| Traders showing the effect, same sample: before / after holding age is fixed | 75.3% / 74.9% |
The pre-registered rule says the effect survives. The 1.70 is higher than the pooled 1.47 because it compares each trader with themselves; pooling mixes traders, and that dilutes the gap.
What this changes. More than a quarter of the pooled gap was an age effect. Positions held a day or less are 6% of the rows, but most of the pooled effect sits there: without them (a check made after seeing the results), the age-fixed ratio falls from 1.33 to 1.13, and the within-trader estimate falls by about 40%.
Two caveats that limit the result. The pass rule counted the effect as surviving without the Ben-David & Hirshleifer (2012) test, which separates a preference for selling gains from a habit of selling big moves in either direction. That test failed its data check, so a V-shaped selling pattern is not ruled out. And in a second check, also made after seeing the results, I used each position’s gain or loss from the day before instead of the same day. The within-trader ratio then fell to 1.29 and the age-fixed pooled ratio to 1.01, though the within-trader estimate stayed clearly above zero. The same-day flag may partly reflect the sale itself. This is not proven. The flag changes from the day before on 8.22% of sale rows against 3.90% of other rows, but that asymmetry is not by itself evidence of look-ahead: in made-up data with no look-ahead at all, built for the portfolio-driven study’s checks, it was 18.1% against 11.0%.
About the gain flag. “Gain” is the platform’s own flag, from the dataset. It matches the sign of the price change since purchase on 72% of rows, and on only 62% for positions a day old or less. What it is calculated from is not documented.
This shows the pattern is not just an age effect. It does not show how large it is, or why traders sell winners.
Next
Update, 15 Oct 2026: the next study published was a different one, on whether insider buying predicts returns (read it). The PGR/PLR estimate from Form 4 described below has not been published yet. The original text is kept below; the wording corrections made on this site are listed under Versions.
A second estimate, from a population with nothing in common with this one. SEC Form 4 insider transactions — bulk files, free, 2006 to present. Restricted to open-market purchases followed by open-market sales, dropping grants, vesting, option exercises and scheduled 10b5-1 plan sales, none of which are decisions. As far as I can tell nobody has computed PGR/PLR from it.
Two uncorrelated sources agreeing would be worth having. If they disagree, that is more interesting still, and it gets published either way.
Methods and negative results, yes. Live signals, never.
This is independent research published for informational and educational purposes. It is not investment advice, it is not tailored to anyone’s circumstances, and it recommends no security or strategy. No position is held in anything named here, because nothing is named here.