Decision models · Vulkan training
Fine-tuning a decision model for markets: better forecasts, no trading edge
100 daily candles, 5,120 Vulkan-trained weights, and 454 AAPL sessions: what improved, what failed, and why costs changed the result.
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.
The forecast starts at the next open
Try changing the overnight gap and the next session separately.
Illustrative prices: previous close → next open → next close100.00 → 103.00 → 104.03
Trailing volatility is fixed at 2% here. Only the session move changes the forecast target and its bin.
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.
A frozen encoder, a trainable readout
Walk through one training update.
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
| Model | Log loss | 3-class accuracy | Net return |
|---|---|---|---|
| Base d3-edge | 1.5906 | 32.4% | −37.11% |
| Fine-tuned d3-edge | 1.5348 | 36.1% | −24.98% |
| Class frequency | 1.5268 | 32.8% | −64.45% |
| Numeric classifier | 1.4980 | 38.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.
Fine-tuning mostly reversed the bias
Compare the original gate with the later allocation rule, then vary trading costs.
Costs replay the same 454 saved sessions. Forecasts stay fixed. This does not train a model or validate a new strategy.
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.
Measured experiment report · Training implementation · Allocation replay implementation
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.