Quantitative Research

Portfolio lab

The published pages answer questions someone else asked. This one is the simulator behind them, opened up: choose the exit window, the holding period, how capital gets allocated when signals overlap, which slice of the universe to trade, what friction to assume, and how much money you actually have. Everything recomputes in your browser, on the raw events, every time you change something.

Every published page on this site shows one configuration that someone else chose. This one recomputes the entire portfolio in your browser under whatever assumptions you set. Nothing here is precomputed except the raw events. The defaults are the pre-registered configuration โ€” the one fixed before any result was seen. Everything you change from there is exploration, and the panel at the bottom tells you how much weight your exploration deserves.

Start from
Broker cost model

Friction

The published backtest assumes 0.1% per side. This strategy breaks even at 0.272% per side, and the effective spread estimated from our own daily highs and lows (Corwin-Schultz) sits above that in every price tier. Which is why these are not numbers anyone picked: the defaults are measured from the data, per tier, and shown to you so you can disagree with them.

The broker buttons only touch the friction fields, so you can combine any broker with any strategy above. They map to what each one actually charges on US equities: IBKR Lite is commission-free with smart routing, so the effective spread lands below the quoted one. IBKR Pro charges $0.005 a share with a $1 minimum per order โ€” modelled here as a flat $1 per side, which is the term that bites on small positions and is the single most damaging cost at a small balance. eToro charges no commission but earns on the spread and gives no price improvement, so the effective spread is set to the full quoted estimate. Not modelled: eToro's ~0.5% currency conversion if you fund in anything other than dollars, and the fact that fractional shares often cannot be routed as market-on-close orders โ€” this strategy trades at the close.

Universe filters

Three size axes, because they are not the same question. Price tier drives the bid-ask cost you actually pay and covers 100% of events โ€” "penny" is the SEC definition, under $5 a share, which is a price, not a size. Market-cap bucket is the literature ladder and covers 74% (the rest have no share count filed before the event). Within-month tercile is size relative to the universe that month. Each filter shows what it costs you in events.

Price tier
Market-cap bucket
Within-month tercile
Sector

Conviction is the dollar value of the insider purchase โ€” the simplest measure and the one covering 99.5% of events. (?)

Result

Two benchmark lines, on purpose. Buy-and-hold SPY answers "would I have been better off just owning the index". Exposure-matched SPY answers "does the edge exist" โ€” it only counts the days the book is actually invested, which for a one-day holding period is a fraction of the calendar. They can differ by an order of magnitude for the same index over the same years. Reading the wrong one is the easiest mistake to make on this page.

Is it consistent, or is it one lucky stretch?

A filter combination picked after seeing the full-sample result and then judged on that same sample proves nothing. Persistent out-performance across independent stretches of time is a different claim, and it is a claim that can be checked. These numbers recompute with every change you make above.

How to read the trade count. A configuration that beats the index on 40 trades is noise with good luck. One that beats it across both halves of the sample, in most calendar years, on thousands of trades, and still clears the out-of-sample split, is making a much stronger claim. The specification counter tracks how many distinct configurations you have run this session, because the more you try, the more likely one of them looks good by chance alone.

Trade journal

Every fill the simulation makes, in MetaTrader Strategy Tester order. Prices shown are the raw quoted price of the day, not the split-adjusted series used to compute returns โ€” so a stock that traded at $60 in 2010 shows as $60 here, even if the adjusted series carries it as $6 today.

What this still does not model

Read this before trusting any number above. Market impact is capped, not modelled: the ADV control shrinks a position rather than moving the price against you. Borrow availability is ignored, which matters if you ever enable the short leg. The universe is 309 SEC registrants that are still active today, so companies that went bankrupt or delisted are missing entirely โ€” precisely where insider selling would be most informative. Corwin-Schultz estimates the quoted spread; the effective spread paid is typically 50-70% of that, and trading at the close is usually cheaper still, so the measured defaults are more likely too harsh than too kind. And every backtest on this page is a backtest: it is what the rules would have produced, not what you would have earned.