Investing · 2026.09.21 · 5 min · Updated 2026.10.26
Does Naked Candlestick Trading Work? Backtesting 1,026 Taiwan Stocks, It Lost to Random Entries Out of Sample
I turned a YouTuber's naked candlestick method into rules, backtested it on daily bars for over 1,000 Taiwan stocks against a random-timing control, and out of sample it lost by 2.62 standard deviations.
Reading
Does naked candlestick (price-action) trading have an edge once it's written as rules and backtested?
I took a YouTube creator's method, turned it into rules, and backtested it on daily bars for 1,026 Taiwan stocks. The control group was random entry: same trades, with only the entry timing shuffled.
The conclusion: at the rules level there's no edge, and out of sample it lost to random entries by 2.62 standard deviations. Out of sample means the data that wasn't used to develop the rules.
Before getting there I misjudged the result three times, and every time the control group was set up wrong. That's the most useful takeaway in this post.
It started with a tutorial on Twitter about building a trading bot with Claude. Following that thread, the question became: this creator explains naked candlestick trading in a very structured way, so can his method be written as rules?
The bar: beat random entries
The acceptance criterion wasn't a profitable backtest. It was beating a random-entry baseline out of sample.
The method keeps each trade's symbol, direction, stop %, and target %, shuffles only the entry timing, runs that several times, and uses the average as the baseline.
A payoff structure with a small stop and a large target will produce positive gross expectancy (average return per trade before costs) even with random entries, as long as the market drifts.
Without subtracting that baseline, you end up crediting market drift to your own skill.

Tuning parameters to find the best combination was ruled out from the start, because that's exactly what I was trying to avoid.
Turning naked candlesticks into rules
The rules came from 12 livestream videos. I transcribed these teaching videos and organized them into a spec. It covers the order of his three questions (location, momentum, pattern), "two points and a line," the false-breakdown reversal, the point-symmetric "Adam flip" projection, and a three-stage exit.
The backtest reused my existing quant research platform. Every position goes through signal.shift(1), which structurally blocks lookahead bias, and there's a holdout that can only be revealed once.
But the original engine was a vectorized "target position × close-to-close return" model. Naked candlestick stops and exits trigger within a bar, so a close-based model is effectively a model with no stops.
So I wrote a separate trade-by-trade engine that walks each bar's high and low. When a single bar hits both the stop and the target, the stop is always assumed to come first.
A single instrument gives too small a sample. Trying BTC on 4-hour bars produced only 50 trades.
The creator repeatedly stresses that the method works on any instrument and any timeframe, and his livestreams demo heavily on daily stock charts. So I switched to daily bars across 1,026 Taiwan stocks: 3.8 million bars and over ten thousand trades.
After writing the rules, I had Codex do an independent audit. It caught two optimistic assumptions.
When the open gapped through the stop, the code still filled at the stop price. And on the bar where a limit order filled, it used the whole bar's high and low to check for a take-profit. A candle can't tell you whether price touched the target before the fill.
Fixing both halved train gross expectancy from +0.211R to +0.104R. R is a return measured in units of the stop distance.
Results: 2.62 sd behind random
The final version used 1,026 stocks, 10 control runs, and a baseline computed separately for each segment:

The val segment, the out-of-sample part, covers 2020 to 2023. Random entries had a gross expectancy of +0.124R because the bull market lifted everything, while following the rules got only +0.005R.
The rules kept the trader out of good opportunities more often than they kept him out of bad ones.
Add Taiwan's 0.571% round-trip friction (including the 0.3% securities transaction tax), and the net is −0.4R per trade.
Wrong three times, all in the control
Here's how I misjudged it, in order (sd is standard deviation):
- "Gross edge is positive, friction is the main problem": there was no control group, so the effect of the payoff structure got read as signal.
- "+1.59 sd, above the baseline for the first time": the baseline was computed over the full period, and val happened to be a big bull run, so the result was systematically overstated.
- "+0.49 sd, within noise": the sample was only 268 stocks, and the val baseline's sd was as high as 0.070.
The misaligned baseline period and the small sample were independent mistakes, but they happened to push in the same direction. Stacked together, they made a negative result look positive.
Only with 1,026 stocks and per-segment baselines did the sample and the method line up.

The one to keep: always compute the baseline over the same period as the segment it's compared against.
A train/val split guards against overfitting. A random control guards against crediting market drift to your own skill. This time the second one mattered more.
What a backtest can't prove
Mechanizing only covers what can be written as conditions.
In his livestreams, the creator spends more than half the time on discretionary vetoes: he doesn't like this chart, this location is a bit awkward, he's busy today so he skipped it. None of that can be backtested, and that doesn't mean it isn't there.
So my conclusion is that there's nothing at the rules level, not that his method doesn't work.
The holdout was never touched. That same day I deleted the whole research platform. The naked candlestick code had never been committed and wasn't kept, so this post was written from my notes at the time.

Engineering
Google Only Saw a Spinner on a Static Next.js Export: Multilingual Prerendering and robots.txt Fixes
My Next.js static export served HTML with nothing but a spinner, and Google only recognized the English version. I switched to URL-based locale prerendering, then fixed two indexing problems caused by robots.txt.
Letters
Loading comments…