article.md

It Passes on 99% of Candles. Here's What the Other 1% Looks Like.

NOVOSKY runs continuously — 24 hours a day, across every trading session, on a 15-minute clock that never pauses.

In the latest 37-day out-of-sample window, it made 99 trades. That's roughly 2.7 trades per day.

A 24-hour M15 session produces 96 candles. Across 36 days, that's 3,456 candles. NOVOSKY looked at every single one and said no to 3,272 of them.

An algorithm doesn't have preferences the way a person does. But when you look at what NOVOSKY actually responds to — what makes it fire vs. what makes it shrug — a consistent character emerges. One that wasn't designed. One that arrived through training.

This is that profile.


The Profile

NOVOSKY · BTC/USD M15 · Quantitative Scalper
71.7%
Win Rate
5.46
Profit Factor
~5.1
Trades / Day
62
Features Checked
"I check 62 things before I commit. My first question is always what H4 RSI is doing — not what the current candle is doing. I have a thing about round numbers. Don't talk to me 30 minutes before a news event. Five consecutive losses in a day and I'm done — not because I can't continue, but because I know myself well enough to stop."
London/NY Overlap Trending Markets Clean Spreads Ranging Chop News Events Round Numbers

Now let's actually explain each of these.


What It's Really Checking

NOVOSKY doesn't look at price and decide. It looks at 62 things and then decides.

Three separate models — Random Forest, XGBoost, LightGBM — each consume those 62 features independently and produce a probability estimate. Their outputs are averaged into a single confidence score. Only if that score clears 65% does a trade fire.

But not all 62 features pull equal weight. SHAP importance analysis — which attributes each model prediction back to its contributing features — consistently reveals the same short list at the top:

Top Features — What Actually Drives NOVOSKY's Decisions
FEATURE IMPORTANCE h4_rsi_norm #1 price_vs_ema200 #2 h1_rsi_norm #3 spread_norm #4 dist_to_round_number #5 price_vs_d1_open #6 adx_14 #7

What does this list actually reveal?

NOVOSKY is a higher-timeframe thinker. The two most important features are h4_rsi_norm and h1_rsi_norm — RSI conditions on the 4-hour and 1-hour charts, not the 15-minute chart it's trading. It looks at the M15 candle last, not first. It wants to know what the bigger picture is saying before it cares what the current candle is saying.

It respects the 200 EMA above almost everything else. price_vs_ema200 — where price sits relative to the 200-period exponential moving average — is the second-strongest signal. This isn't a coincidence. The 200 EMA is one of the most widely-watched levels in all of crypto trading. When price is significantly above it, the model thinks differently than when it's below. Not as a hard filter — as a continuous input that shapes every prediction.

It is genuinely uncomfortable near round numbers. dist_to_round_number — how far BTC price is from the nearest $500 or $1,000 boundary — consistently ranks in the top five features. Near $60,000 or $61,500? Hesitation. Away from those levels? More confidence. Round numbers attract price, create erratic reactions, and produce clustering behavior that degrades signal quality. The model learned this without being told. It just saw it in years of BTC data.


When It Wants to Trade

NOVOSKY is technically available all day. But some hours it's genuinely engaged, and some hours it's just there.

Signal Quality Profile by Session — 24 Hours UTC
ASIAN 00–08 EUROPEAN 07–16 AMERICAN 13–21 peak: NY/London overlap 13–16 UTC

The London/New York overlap — roughly 13:00 to 16:00 UTC — is peak hour. Volume is highest, moves are directional, and spreads are at their tightest. This is when institutional players from both regions are simultaneously active, which creates the kind of momentum-driven price action that NOVOSKY's ensemble models are trained to catch.

NOVOSKY doesn't have a hard rule saying "prefer these hours." But is_london_session and is_ny_session are both binary features in the model, and they found their own weight through training. The model figured out — without being told — that signals during these windows tend to resolve more cleanly. It just observed it in the data.

The Asian session is the opposite. Lower volume, rangier price action, wider spreads on average. The bot is present, but its confidence output is structurally lower during this window. Less likely to reach the 65% threshold. It's not refusing to trade — it's just rarely convinced enough to.


Its Non-Negotiables

Every character has lines they won't cross. NOVOSKY has three.

Spread. If the spread is too wide relative to current ATR, no trade fires. NOVOSKY doesn't negotiate with bad execution conditions. A wide spread signals either an illiquid period or an incoming news event — in both cases, the expected edge collapses because entry cost eats the signal. spread_norm is the fourth-most important feature in the entire model. It's not just a filter; it's a continuous input the model weighs constantly.

News. Thirty minutes around any major economic event, NOVOSKY goes dark. Three separate features handle this: is_news_near, news_minutes_away, and is_news_risk_window. The bot doesn't fear news — it simply knows it can't model the reaction. Whatever happens in that 30-minute window is largely random from an ML perspective. The distribution of outcomes shifts from "signal-driven" to "headline-driven," and the model has nothing useful to say about headlines.

Five consecutive losses. The circuit breaker. After five losses in a row within a single trading day, NOVOSKY stops. New entries are blocked until the next calendar day.

The Math Behind Five
At a 71.7% win rate, the probability of five consecutive losses is (0.397)⁵ ≈ 0.99%. It's rare — but across hundreds of trades, it happens a handful of times. The circuit breaker treats it as a signal to step back, not as evidence of catastrophic failure. At some threshold, a losing streak stops being variance and starts being "something in today's conditions is working against the model." Five is where we currently draw that line.

What It Cannot Stand

Some conditions make NOVOSKY measurably worse. Not just "less confident" — worse outcomes.

Choppy, sideways markets. adx_14 — the Average Directional Index — ranks seventh in feature importance. Low ADX means no trend. No trend means noise. The entire ensemble was trained on directional price moves, and its edge comes from correctly identifying when momentum will continue. In a grinding sideways market, that signal collapses. The model "knows" this — its confidence output drops in ranging conditions — but it can't always stop itself from being wrong during prolonged chop. It hesitates more often. It still occasionally fires and regrets it.

Sundays. NOVOSKY doesn't have a "closed on Sundays" rule. But day_of_week_sin and day_of_week_cos are features in the model (encoded cyclically so the model understands weekday structure). Sunday BTC volume is structurally lower, spreads drift wider, and institutional participation is minimal. The training data showed Sunday candles producing lower-quality signals, and the model internalized it. It's present on Sundays. Just quieter.

Being half-convinced. Below the 65% confidence threshold, NOVOSKY passes. It won't trade on a 61% signal. This isn't rigidity — it's calibration. The ensemble's probability estimates are reliable enough that the gap between a 61% and a 67% prediction is meaningful. A system that trades when it's half-convinced is a system that slowly bleeds on marginal setups.


The Paradox of Pickiness

Here's the counterintuitive result: a system that says no this often should theoretically underperform a system that says yes to more opportunities. More trades = more chances to profit, right?

Not when the marginal trades are losing ones.

71.7%
Win Rate
OOS 36-day
5.46
Profit Factor
latest optimize
4.3%
Max Drawdown
OOS window
+137%
OOS Return
36-day period

A 5.46 profit factor means that for every dollar lost, nearly three dollars come back. That ratio only holds if the system avoids bad trades — the ones where the signal is marginal and the edge is thin. Every time NOVOSKY passes on a 60% signal, it's protecting that ratio.

The 5.1 trades per day that clear the 62-feature filter are the best 5.1 opportunities in that session. The hundreds of candles that got rejected? That's not inactivity. That's the filter earning its keep.


Did We Build This? Or Did It Show Up?

The round-number aversion was not programmed. The higher-timeframe RSI obsession was not specified. The Sunday hesitancy was not hardcoded.

We specified: the objective function (directional accuracy). The features (62 engineered inputs). The training data (BTC/USD M15, multi-year history). The validation split (37-day OOS window). The model architecture (RF + XGBoost + LightGBM ensemble).

What emerged from all of that — the specific weights, the specific feature hierarchy, the specific behavioral fingerprint you've just read — we didn't write that. The training data wrote it.

This is what makes ML trading systems genuinely interesting to build: you set up the conditions, you run the process, and then something comes out the other side that you have to study like it's a new species. Not to debug it. To understand it.

The Actual Lesson
If you want to understand what your model learned, don't just read the accuracy numbers. Watch its behavior. Where does it fire? Where does it hesitate? What conditions produce its highest-confidence outputs? SHAP values and feature importances tell part of the story — but the behavioral profile tells the rest. An ML model's personality is its most honest documentation.

NOVOSKY has a type. We just had to watch long enough to figure out what it was.