Research
Two theses, and the method behind them
Both are written up in plain language first, with the statistics one click below. Every figure is generated from a committed result file by a script in this repository.
Start here
The whole thing, in five sentences
A prediction market is a market where you buy a contract that pays $1 if some event happens and nothing if it does not, so a contract trading at 63¢ means the crowd thinks there is roughly a 63% chance — the price is the forecast. I collected these markets moving, second by second, and asked a single question: does a market have a hidden mood that turns busy shortly before its price starts moving, or is it simply that price moves cause more price moves? If the first were true you could see activity coming, which would be useful and slightly surprising. I found the second: the model that assumes a hidden mood detects busy spells but never anticipates them, and a model where each price move simply makes the next one more likely predicts better. Along the way the markets did something I did not expect — as a market approaches its deadline it goes quieter, not busier.
Everything below is that story in more detail. Terms are defined where they first appear, and collected in the glossary.
The two theses
Latent Dynamics of Prediction-Market Price Paths
MSc, UCL. A hierarchical point-process model of when prediction markets move, fitted with a Metropolis-within-Gibbs sampler written from scratch and benchmarked against self-exciting and neural alternatives. custom MCMC34/34 markets
Self-supervised models for human activity recognition
BSc, Leiden. A full self-supervised pipeline benchmarking six architectures on wearable-sensor data, with every model tested on people it had never seen in training. 6 architecturesleave-one-subject-out
Why this is unusual
A result that goes against you is a credential
Three of the four findings above went against what I hoped to show, which is not how most research reads. The reason is an incentive: when a result comes out flat, the easy path is to say nothing, adjust the measurement, and try again until something looks convincing. Nobody sees the versions that failed, so nobody can tell the difference between a real finding and the one attempt out of twenty that happened to look good.
Writing down what counts as success before looking at the answer, and committing it with a timestamp, closes that path. If I move the goalposts afterwards, the history shows it. That is the entire value of the practice, and it is why I would rather show you a null result I pre-registered than a strong result I did not.
Method
How I keep myself honest
The reason to trust any number above is the protocol that produced it, so here is the protocol — including where it falls short.
- Decide what counts as success before looking. The MSc work carries 14 pre-registered components, each committed to version control before the corresponding result, so the order is provable. One amendment exists and is disclosed: the original scoring rule failed its own simulated false-alarm check, so an already-registered alternative replaced it — before any real number was computed.
- Make the test prove itself first. Several tests had to demonstrate, on simulated data with a known answer, that they could find a real effect and return nothing when there was nothing there — before being pointed at real data.
- Allow "no effect" as an outcome in advance. Writing "no answer" into the specification as an acceptable result is what makes reporting one afterwards meaningful rather than merely disappointing.
- Count the right thing. Uncertainty is estimated by resampling whole markets, not individual trades — see clustered bootstrap — because trades within one market are not independent, and treating them as though they were would make every result look more certain than it is.
- Never test on what you trained on. Leave-one-out as the standard, time-ordered splits where time matters, and any deviation disclosed where it is used.
- Correct for asking many questions. Test twenty things and one will look significant by luck; the correction accounts for that before any result is called.
How to check this
Every figure on this page is generated by a committed script that reads the underlying result files directly, so a figure cannot drift from its data without the script changing. The numbers behind each one are published beside it as a spreadsheet file, linked from its caption, so you can check the chart against the data rather than taking it on trust.
Two things are named rather than quietly omitted. The pre-registered specifications and full reports for the MSc studies are written and committed but not published until after submission in September 2026 — the commit ordering is what makes them evidence, and that is worth publishing properly rather than early. And the research repository is private, so the commit references quoted here are not reader-verifiable today.
The technical version
Where the protocol falls short
Pre-registration did not prevent two of my own metrics from turning out to be artifacts of their measurement design — one apparent lead tracked the length of its own lookback window exactly, and one rising hazard was an artifact of a minimum-length floor. Both were diagnosed, dissected, and the verdicts rebuilt on artifact-free re-analyses.
Beyond that: the research repository is private, so the commit ordering is not reader-verifiable; no library versions or containers are pinned anywhere; and not every figure comes from a pre-registered component. The cohorts are nested rather than independent, and the corpus is six weeks of one venue's liquid, actively-repriced head.