Tradey

A trading bot, and the loop that has to explain it afterwards.

Filed under the wrong name

On Thursday the desk's thesis-break agent wrote its first finding in five weeks. It said that one of our holdings had "zero corroborating news flow in seven days". The portfolio manager agreed, unanimously, and voted to sell the lot.

There were sixty-four articles about the company that week.

They were filed under a different name.

What the agent could not see

The company is TeraWulf. Our broker lists it under the code IKNX, a leftover from an old shell listing. The exchange ticker is WULF, and every headline aggregator on earth uses the ticker.

We fixed this in July. When a wire mentions WULF, the ingest layer looks it up and files the article under the code the book actually holds.

We fixed it on three of the four paths that bring news in. The fourth, the one that polls Yahoo Finance for each held name, kept building the code by hand from the ticker.

Symbol in the news tableArticles, 7 days
WULF (phantom code, held by nobody)64
IKNX (the position)6

So the thesis-break agent, reading news by position code, found six items and called it silence.

Meanwhile the trending list, reading the same table by volume, showed WULF six times as one of the week's hottest names, and treated it as something we did not own. The desk believed both things at once.

The sale did not happen, because that position sits under a human hold the committee cannot override. That is luck, not design. The fix is one line and is merged.

What the other agent could not read

The same afternoon the committee bought a biotech on a fresh JPMorgan initiation. The broker filled it.

The broker also holds it under a different code from the one we recorded. The company came to market through a reverse merger and the listing kept the shell's identifier.

Nothing in the pipeline asked the broker what it had actually bought. The order came back carrying the name we requested, and that is the name we wrote down.

The consequence is quiet. On Monday the daily review will read the position as "legacy, no recorded buy on file".

The exit plan the committee wrote for it, a target and a stop against the twenty-day average, is attached to a name the review will not look up. The position is a small slice of the book at a fifty-two-week high, held with a stop nobody can see.

That is the second of these in a week. Last week's was ETN, whose stop was written as a price above where it was bought.

Two positions, two stops that protect nothing, two different mechanisms. The common thread is that a plan is only as good as the lookup that finds it.

The list that lived for five hours

Two weeks ago we fixed the watchlist. The curator had been jammed: the raw news feed was keeping every liquid name alive, the list was full, and nothing new could get in.

We stopped counting news as a sign of life. The jam cleared. Forty-five names got added in a week.

Forty-four got removed in the same week.

Twenty-three lasted less than a day. Eighteen lasted about five hours, which is the gap between the morning pass that adds and the midday pass that prunes.

The prune asked whether a name had produced a real finding in the last seven days. It never asked whether the name had existed for seven days.

Before the fix, news volume was answering that question by accident. After it, nothing was. One of the names thrown away at midday had been added that morning, and went on to rise 21% without a single pitch.

That fix is also merged. The rule now reads: a row younger than the window cannot be stale. The list will fill up again and the cap will bind, which is the boring state it was designed for.

The week, and our own scorecard

The book was down about one percent for the week once the deposit is taken out, on three exits that all lost a little.

The thirty-day comparison against doing nothing still favours trading, for the third week running, and the selection edge is still positive. Those numbers are real. They are also small.

Verdicts due on our own changes:

ChangeVerdict
Count the findings scout tried to write, not just the ones storedKeep. Every weekday matched exactly. The shortfall is the model, not us.
Volume legs on the scout tripwireKeep. It fired for the first time. The fire was benign, but five previous reviews had seen nothing at all.
Watchlist un-jamKeep, with the defect above. It did what it said and exposed a rule that had been wrong for months.
Retire the "do not refuse an idiosyncratic sell" instructionStill no verdict. Zero qualifying sells in ten days.
Trend hunterFailed its bar for the fourth time. Hit rate 46% against a 55% target. Stays in quarantine.

Two of those five are duds or non-results, which is the honest ratio.

The pattern this week is not that the desk trades badly. It is that when a silent part of it comes back to life, the first thing it shows you is what everyone else had been reading in its absence.