The 0.95 wall, and orthogonality as the honest way through
The second installment in a series publicly documenting each session of the WorldQuant BRAIN project. This is the record of a day spent trying to get through the 0.95 wall from Part 1 with an orthogonal signal.
Part 1 ended in an honest defeat. I tuned a common short-term reversal alpha through five rounds and pushed Fitness up to 0.95, but stopped 0.05 short of the 1.0 submission threshold. When I asked the server directly, every other item passed and only Fitness fell short. The conclusion was clear. On its own, this signal had reached its ceiling here. To go further, I needed to mix in another signal that was uncorrelated with the reversal signal. Part 2 is the story of trying exactly that.
The idea of orthogonality
The core idea is the same as diversification. If you mix two signals that do not line up well with each other, in other words signals close to what mathematics calls orthogonal, one can support the other when it wobbles. The combined portfolio can therefore have higher risk-adjusted returns, meaning a higher Sharpe, than either signal alone. My calculation was that if I could attach such a partner to my reversal alpha and lift Sharpe, I might be able to cross the 0.95 wall.
I made one rule here. I would pin down the 0.95 reversal signal I had struggled to find in Part 1 as the “anchor” and never touch it. The proven core would stay as it was, and I would only experiment with how much of another signal to layer on top. Reducing the variable to one makes it much cleaner to read what actually worked.
Building a combination factory
Because I had already built a miner that could mass-produce alphas in Part 1, this time I only had to add a module dedicated to combinations on top of it. It was a generator that fixed the anchor, prepared a library of six orthogonal candidate signals, blended the two with preset weights, and wrapped the result in the trading gate again. Every candidate signal used only data whose validity had already been confirmed, such as price and volume. In Part 1, I had once copied item names from research material as-is and got rejected because “no such variable exists,” so this time I chose only real names and avoided that trap.
The six orthogonal candidates I chose were these: long-term momentum, the trend over the past year; low volatility, preferring stocks that move quietly; volume spike reversion; volume trend reversion; range compression, stocks with a small daily high-low spread; and the vwap gap, selling stocks that consistently trade above the volume-weighted average price. In short, I gathered signals whose character seemed unlikely to overlap with short-term reversal.
Round 1: who is truly orthogonal?
I mixed each of the six into the anchor at half weight and ran them. The result was cold. Long-term momentum, low volatility, and range compression diluted the anchor instead and dragged Sharpe down into the 1.1 range. They looked like good signals, but they were a bad match for my reversal. The two volume signals held up on Sharpe, but raised turnover and cut Fitness.
Only one was different: the vwap gap. Its Fitness came out at the same 0.95 as the anchor, and interestingly, turnover actually fell. It looked like the turnover reduction offset the slight drop in Sharpe and made it a draw. Reducing turnover without ruining the signal was the mark of genuine orthogonality. I dropped the other five and took only this one into the next step.
Drawing the curve
If it was a draw, maybe a lighter weight could preserve more of the anchor's Sharpe. So I drew the curve by changing the vwap gap weight from 0.2 to 1.0. A clean picture came out. Fitness rose to 0.96 at weights 0.2 and 0.3, then declined steadily to 0.95 at 0.5, 0.92 at 0.75, and 0.89 at 1.0.
It was a small but meaningful win. For the first time, I broke past Part 1's 0.95 and printed 0.96. What made me even happier was that it was not a single point but a flat peak. Since both 0.2 and 0.3 produced the same 0.96, it meant the whole neighborhood was good, not that I had luckily landed on one number. A value forced to fit does not make this kind of broad plateau. So this 0.96 was real. The way the score decreased monotonically as the weight increased also matched the interpretation. The vwap gap helps only in small amounts; if I give it too much, it covers the anchor.
Getting greedy and adding two
Once I had reached 0.96, I wondered what would happen if I added one more signal. Volume spike reversion had the highest Sharpe in Round 1, so I thought combining the turnover reduction of the vwap gap with that signal's Sharpe might let me capture both. But the result fell back to 0.93. Adding signals only increased turnover while Sharpe stayed the same. I stopped being greedy there.
The hope and betrayal of fundamentals
The thing I had real hopes for was something else: fundamentals, meaning company value metrics. These metrics change slowly, perhaps once a quarter, so I expected them to trade infrequently and have low turnover, while also being unrelated to short-term price movements. Adding returns without raising turnover was exactly the lever I had been looking for all along. Remembering how I had been blocked in Part 1 because “no such variable exists,” this time I queried the data item list first and got the exact names of real value scores and quality scores.
But the expectation was only half right and half wrong. Lightly adding the value score dropped Fitness to 0.86. My assumption that fundamentals would have low turnover was wrong. Turnover actually rose slightly. Adding the composite score collapsed even worse to 0.56, and it turned out that the composite score contained a momentum component that was fighting my reversal head-on.
Still, one clear signal appeared. In the combination that added both the vwap gap and the value score, Sharpe climbed to 1.39. That was the highest Sharpe I saw that day, and it was even above the anchor's 1.37. It was evidence that the value metric really did add directional returns. The problem was that turnover rose again as the price for that, so Fitness ultimately stopped at 0.95.
What the wall was made of
Here, the pattern that had followed me all day collapsed into one sentence. This short-term reversal alpha's Fitness is tied to turnover. Since Fitness multiplies Sharpe by the square root of “returns divided by turnover,” the problem was that Sharpe and turnover moved almost as one body. The signal that raised Sharpe, the value score, inevitably raised turnover as well. The signal that reduced turnover, the vwap gap, inevitably cut Sharpe as well. Because the two levers held each other back, they always canceled out right before 1.0.
Of course, I could probably scrape out the remaining 0.04 through fine-grained weight tuning, but that is the trap I already warned myself about in Part 1. An alpha twisted to fit past data exactly falls apart in front of future live data. It was better to accept that 0.96 was this signal's honest limit.
What the day taught me
First, orthogonality is not a free lunch. The textbook sentence that diversification raises Sharpe is true, but the story changed once I looked at the cost called turnover as well. The fact that five out of six candidates actually hurt the anchor is proof. Whether a signal is “truly orthogonal” is not decided in your head. You have to run it to know.
Second, even when a hypothesis is wrong, data shows the way. My assumption that fundamentals would lower turnover was wrong. But after seeing that they lifted Sharpe to 1.39, I gained the more important fact that value metrics contain real returns. One wrong hypothesis ended up pointing to the next direction.
Third, once you know what the wall is made of, you stop wasting effort. Holding the sentence “Fitness is tied to turnover” in my hand made it clear that twisting the same signal further would be useless. Knowing where to stop is also progress.
The next story
The direction is clear now. As long as reversal is the core, I cannot escape the turnover trap. Then I should make a naturally low-turnover signal the core from the beginning. If the value score added returns as a helper, a different picture may appear when it becomes the main character instead of the helper. An alpha centered on slowly changing signals such as value, quality, or changes in analyst views, with an orthogonal seasoning like today's vwap gap added on top. I plan to dig in that direction in the next session. Of course, the faster path of immediately testing the strategy my friend promised to send over is still open.
I did not get over the wall, but I found out what the wall was made of. That is what 0.96 gave me.
Technical notes (appendix)
I am leaving details here that did not fit into the prose. This part is for technical readers.
New best candidate (updated the 0.95 anchor, but still below the Fitness gate of 1.0, so it cannot be submitted):
trade_when(ts_rank(ts_std_dev(returns, 22), 252) > 0.55,
rank(-ts_sum(returns, 5)) + 0.3 * rank(-ts_mean(close / vwap - 1, 22)),
-1)
- Settings: USA / TOP3000 / delay 1 / decay 2 / neutralization INDUSTRY / truncation 0.01
- Result: Sharpe 1.36, Fitness 0.96, turnover 0.246, returns 0.124
- Structure: adding a small amount (weight 0.2 ~ 0.3) of the vwap gap orthogonal signal to the proven reversal anchor
rank(-ts_sum(returns, 5))
Combination experiment log (4 rounds, 15 simulations):
- Round 1 (6 orthogonal types, weight 0.5): vwap gap 0.95(turnover reduction), volume spike 0.84, volume trend 0.81, long-term momentum/low volatility/range 0.76. Only the vwap gap was orthogonal without cost.
- Round 2 (vwap gap weight curve): 0.2 → 0.96, 0.3 → 0.96, 0.5 → 0.95, 0.75 → 0.92, 1.0 → 0.89. A flat peak at low weights, not overfitting, and monotonic decline as the weight increased.
- Round 3 (stack): vwap gap 0.3 + volume spike 0.3 → 0.93, + volume trend 0.3 → 0.89. The second signal only added turnover.
- Round 4 (fundamental tilt, exact names confirmed by querying data items): value score 0.3 → 0.86, composite score 0.3 → 0.56(momentum component conflicted with reversal), vwap gap 0.2 + value score 0.3 → Sharpe 1.39(session high) / Fitness 0.95(turnover rose to 0.263).
Core structure: Fitness = Sharpe x sqrt(returns / max(turnover, 0.125)). In this short-term reversal anchor, signals that raise Sharpe also raise turnover, and signals that lower turnover also lower Sharpe. The two levers cancel out right before 1.0, making 0.96 the honest limit. The honest way to break through 1.0 is to design a new alpha that uses a naturally low-turnover signal, such as fundamentals or analysts, as the core rather than as a helper.
Tool addition: I added a combination module on top of the existing miner. Fixed anchor + orthogonal signal library (6 price-volume types + 4 fundamental types) + rank/zscore blend + multi-signal stack + trading gate wrapping. It supports standalone diagnostics, weight sweeps, switching combination forms, and stack mode as options.