I built a market experiment around a small decision model: give it 100 completed daily candles and available news, ask for probabilities over the next session’s return, then fine-tune it on my GPU. The model improved. The trading strategy still lost money.

That gap is the story. On 454 AAPL sessions, fine-tuning reduced five-bin log loss from 1.5906 to 1.5348. A simple class-frequency baseline scored 1.5268, and a numeric classifier scored 1.4980. Better than the original checkpoint was a real improvement, but it was not enough to establish an edge.

What a decision model actually decides

A decision model takes evidence and a typed question, then returns probabilities over allowed answers. For this experiment, those answers were five return ranges. That gives software a bounded distribution to score and act on, without asking it to interpret a paragraph of market commentary.

Laya uses a bidirectional encoder and option scoring. d3-edge maps a prompt representation to answer codes. Jev is a hosted system offering typed probabilistic decisions. Their interfaces make decisions easier to consume; they do not guarantee accurate probabilities on financial data.

I compared open checkpoints below 800 million parameters on a predetermined 2024 validation sample. d3-edge won that comparison, with log loss of 1.5023 versus Laya’s 1.6891. Its measured package contained 594,582,720 parameters. Jev could not be verified under the parameter ceiling or fine-tuned locally, so it remained background rather than a measured candidate.

Define the target before touching the model

The dataset contained 268,166 examples across 34 instruments spanning US, Indian and other global markets, plus FX. I chose daily bars to obtain a long history, including 10,752 distinct AAPL training examples. The broader dataset provided context and diagnostics; the actual fine-tune used AAPL only.

Each origin retained 100 completed OHLCV candles. The model saw a compact rendering of all 100 close-to-close returns in integer basis points, trailing volatility and a numeric narrative, alongside eligible headlines. Retaining candles in the dataset and feeding every raw candle field to the model are different things.

01 /

The forecast starts at the next open

PAST INFORMATION100 completed daily candlesSignal formed after today’s close
Overnight gapOutside the target
NEXT SESSIONOpen → closeOne intraday exposure
Daily inputs, intraday target. Entry is the following session’s open; exit is its close. The overnight move is excluded. Candles are schematic, not observed prices.

The target was log(close/open) for the next session, divided by trailing 100-return daily volatility, with a 0.001 floor. Five bins used boundaries at −1, −0.25, +0.25 and +1 sigma. The middle bin meant a small move, not an exactly unchanged price. This was a range classification problem, not a price target around today’s close.

Training targets ended on December 29, 2023. Validation used 2024; test targets came from 2025 through October 23, 2026. Splitting by target date kept labels across the whole universe on the correct side of each boundary. The 1,246 test examples included a continuous 454-session AAPL series; every other instrument contributed only 24 sampled origins.

News needs a clock, not just a sentiment score

I used archived FNSPID and Yahoo headlines, with conservative availability delays and a 72-hour lookback. The prompt prioritized credible surprises involving earnings, guidance, regulation, disasters, financing or innovation, and downweighted promotion and price recaps. A dramatic headline alone establishes neither surprise nor future price impact.

The filter was heuristic, not a verified relevance dataset. Missing coverage meant unknown information. Only 454 training examples had headlines, compared with 387 of 454 AAPL test examples, and none in AAPL validation. That shift prevents a clean claim that news filtering helped. It also matters that an overnight announcement’s immediate gap was outside the target.

What I actually trained on Vulkan

The backbone stayed frozen. I updated the first five original answer-code readout rows: 5 × 1,024 = 5,120 weights, under 0.001% of the model. This was head fine-tuning, not LoRA or full-backbone training. Cached FP32 representations came from a mix of CPU and Vulkan extraction, with probability parity checks.

02 /

A frozen encoder, a trainable readout

FROZENd3-edgeEncode the state and question
CACHED1,024 featuresFP32
TRAINABLE5,120 weightsFive answer-code rows
Vulkan on Radeon RX 560Forward scores → loss → gradients → Adam updates
Only the readout receives weight updates. The selected checkpoint used 12 epochs and 1,008 GPU updates; an independent Vulkan replay reproduced identical weights.

Native Vulkan kernels performed forward scoring, backward gradients and Adam updates on the Radeon RX 560. CPU reference checks covered all three operations. Validation selected the checkpoint and a temperature of 0.8322. The audit then independently replayed the selected 1,008 updates and recovered bitwise-identical weights. That verifies the training procedure, not the market hypothesis.

The forecast improved, but simple baselines mattered

AAPL holdout: 454 sessions. Lower five-bin log loss is better. Net returns use the later exploratory allocation rule.
ModelLog loss3-class accuracyNet return
Base d3-edge1.590632.4%−37.11%
Fine-tuned d3-edge1.534836.1%−24.98%
Class frequency1.526832.8%−64.45%
Numeric classifier1.498038.5%−38.30%

Log loss evaluates the probability assigned to the outcome that occurred. It penalizes confident errors. The fine-tuned model’s loss difference versus class frequency was +0.0080, with a paired block-bootstrap 95% interval of [−0.0141, +0.0310]. The interval crossed zero, and the point estimate favored the simpler baseline.

The pooled 1,246-example loss did improve from 1.5297 to 1.4502, beating frequency at 1.4766. That aggregate deserves context: FX contributed 144 observations, and the non-AAPL panels were sparse. It did not overturn the primary AAPL result or establish a continuous cross-market trading strategy.

Changing the trading rule changed the question

The predeclared rule required 55% directional confidence. Every model stayed in cash on every AAPL session. Its 0% return meant zero trades, not successful risk management demonstrated through profitable execution.

After seeing those results, I ran a requested exploratory replay: sum the two down probabilities, sum the two up probabilities, then choose the largest of down, flat and up. Up takes a full long position; down takes a full short; flat or a tied winner stays in cash. There is no confidence gate and no probability-based position sizing.

03 /

Fine-tuning mostly reversed the bias

LongShortCash
Base d3-edge
2 Long279 Short173 Cash
Fine-tuned d3-edge
312 Long4 Short138 Cash
Position counts across the same 454 sessions. The smallest segments remain visible at their true proportions; the counts below each bar carry the precise values.

The fine-tuned rule improved net return by 12.14 percentage points, but still lost 24.98%, with a 38.43% maximum drawdown. Its gross compounded return was +2.92%. Charging 5 basis points on entry and exit for each of 316 active sessions changed the outcome dramatically. At twice those costs, it lost 45.33%.

An always-long open-to-close comparator returned +0.70% after the same standard costs. This was not buy-and-hold: it also exited daily and excluded overnight returns. The replay used synthetic unlevered exposures, without fully modeling borrow fees, financing, taxes, additional slippage or short-sale constraints.

What the experiment established

The engineering result was concrete: a small decision model could preserve the intended context, adapt its readout through Vulkan, and produce reproducible probabilities. The financial result was narrower: adaptation improved the base model but did not establish an AAPL advantage over simple forecasting or trading baselines.

The test was newer than the fine-tuning data, but foundation pretraining overlap remained unknown. Validation also served several selection tasks, and the allocation replay came after inspection of test results. My next useful test would freeze the model, news policy and execution rule before collecting future sessions, with realistic fills and the same simple baselines alongside it.

Inspect the experiment

The complete source, training code and reproduction instructions are public in D-Trade on GitHub.

These compact snapshots preserve the reported metrics, training scope and audit checks. They contain no raw news archive or model checkpoint. Hashes identify the exact files used for this article.