Blog
Notes from the strategy factory

Tick data won't save your backtest — for most strategies it makes things worse
More resolution isn't more truth. For most strategies, tick data trades a real problem — bad fill and cost assumptions — for a fake one: the illusion that finer-grained data means a more honest backtest.
Read the post →
How do you backtest an inverse perpetual without mixing up BTC and dollars?
A trade earns $10,000. The account gains $15,000. Both numbers are correct. Your backtest needs to explain the missing $5,000.
Read the post →
Your equity backtest found a short. Could you actually borrow it?
Your gap-fade strategy shorts every name it selects. Your broker has a smaller menu. A letter about the missing transaction before your entry.
Read the post →
Your macro backtest traded the revised jobs report
You downloaded the historical jobs series correctly. Your strategy still traded numbers that wouldn't exist for another two months. Here's how to rebuild its information set.
Read the post →
How much latency should you add to a backtest? We measured every millisecond of ours
195 ms median. 2,970 ms at the 99th percentile. 840 ms median on the minutes your signal actually fires. Only one of those numbers is interesting.
Read the post →
Five sizing rules, one signal: the part of your backtest doing the real work
Most of the variance in your backtest result comes from how big you hold, not from when you enter. Here's the same signal under six sizing rules, with the fee bill and the peak leverage the report forgot to print.
Read the post →
Same code, same data, two different Sharpes: the nondeterminism audit your backtest needs
11,205 bars bit-identical, then a tie in a ranking, then a 0.15 Sharpe gap. If you don't know your backtest's jitter band, you don't know whether your best parameter set won anything.
Read the post →
The row your options backtest is built on: one Deribit BTC call, field by field
The ticker has about twenty fields. Two of them are prices nobody traded at, three are in units your backtest probably misreads, and the number that kills most options strategies isn't in the payload at all.
Read the post →
You backtested $2,000 a clip and now you want $50,000: a letter about capacity
Your edge is 22 bps gross per trade. At $2,000 you pay about 2 bps of impact. At $50,000 you pay 11. The arithmetic that follows decides whether you have a strategy or a screenshot.
Read the post →
Your backtest never got liquidated: margin, mark price and the leverage line you skipped
The equity curve dips 63% in April and recovers by June. On the venue, the account was closed on day 41 and there was nothing left to recover with.
Read the post →
Both your stop and your target were inside the same bar. Which one did your backtest pick?
The bar's low is below your stop. Its high is above your target. One of those happened first, the bar doesn't say which, and something in your code decided anyway.
Read the post →
The minutes that don't exist: gaps, halts and zero-volume bars in OHLCV history
Missing bars aren't randomly scattered through your history. They cluster in exactly the minutes your strategy cares about, and the standard fixes make the damage invisible.
Read the post →
Your limit order didn't fill: a letter about queue position, maker backtests and the Sharpe you invented
Your fill rule is one line long: if the bar's low is at or below my limit, I'm filled. That line is doing more work than your entire alpha, and it's doing it wrong.
Read the post →
Split-adjusted data, taken apart: what NVDA's 10-for-1 does to every row behind it
The row says the close was $120.8781. The tape that day said $1,208.88. Six columns separate those two numbers, and most backtests misread at least three of them.
Read the post →
What breaks when you backtest prediction markets: an eight-day diary
The instrument dies. It pays one dollar or nothing, once, on a date you don't control. Almost every assumption baked into a returns-based backtester is wrong here, and here's the order in which we found that out.
Read the post →
How many trades does a backtest need before the Sharpe means anything?
The standard error of an annualized Sharpe is roughly 1 over the square root of your years of data. Everything uncomfortable follows from that one line.
Read the post →
You built a strategy that only trades at 00:00 UTC — a letter about funding-time artifacts
Your Sharpe is 2.9 and every dollar of it arrives within four minutes of a funding settlement. I've seen this exact result maybe a dozen times. Here's how to find out which kind you have.
Read the post →
Your symbol universe is a time machine: survivorship bias in crypto perp backtests
You built your universe by calling exchangeInfo once, today, and filtering for status == TRADING. That single line quietly deleted every coin that died.
Read the post →
Anatomy of one 1-minute bar: everything OHLCV doesn't tell your backtest
Twelve values in a JSON array. At least four of them mean something different from what your fill engine assumes. Here's the whole bar, taken apart.
Read the post →
Three ways to fail walk-forward optimization without noticing
Walk-forward testing is sold as the antidote to overfitting. Done casually, it's just overfitting with better paperwork. Three failure modes and their tells.
Read the post →
How an AI agent team takes a trading idea from sentence to paper money
Ten agents, one pipeline, and a funnel that's designed to kill ideas. A walkthrough of what actually happens between "funding momentum" and a live paper node.
Read the post →
Paper trading is the only benchmark your backtest answers to
We replay every paper strategy's window through the backtest engine every day and diff the trades. Here's what that ritual keeps catching.
Read the post →
What a round trip really costs on nine venues
Fee pages are marketing. Here's the two-way arithmetic that decides whether your strategy is a business or a donation, venue by venue.
Read the post →
Why most backtests lie, and the four line items that fix them
A strategy that backtests at +40% a year and loses money live isn't unlucky. It was measured wrong. Four line items separate the two numbers.
Read the post →