
I stop treating my alpha model like a notebook artifact and make it sit in the real BitMEX stream. The goal is not trading yet. It is seeing whether my features, normalization, and inference loop survive reality without quietly cheating.
Axel Domingues
In September I finally got a Deep Silos model to behave. Not "win the leaderboard" behave - behave like an engineer would trust it: stable training curves, controlled capacity, clear feature families, and fewer ways to accidentally leak.
So naturally, I did the most dangerous thing.
I took the model out of the notebook and let it stare at a real BitMEX (Bitcoin Mercantile Exchange) order book.
Not to trade.
Just to watch.
Because the first time your model sees the live stream, you discover what your dataset politely hid.
There is a version of this project where I jump straight from "good validation curve" to "place orders".
I am not doing that.
This month is about building a live inference loop that:
If the loop cannot do that, trading would just be gambling with extra steps.
I am calling the running process Chappie.
In October 2019, Chappie's job is simple:
The key constraint: no secret feature code path.
If training and live inference do not share the same feature logic, then any success is probably a bug.
This month is mostly about turning three files into a cohesive process:
BitmexPythonChappie/main.pyBitmexPythonChappie/SnapshotManager.pyBitmexPythonChappie/OrderBookMovePredictor.pyBitmexPythonChappie/main.pymain.py does the boring but critical orchestration:
Boring is good. Boring means reproducible.
BitmexPythonChappie/SnapshotManager.pyThis is where monitoring becomes real.
A loop (LoopingCall) runs __process_snapshot() on a fixed schedule. Inside that loop:
In code, it looks roughly like this:
prediction = self.predictor.predict(pd.DataFrame([features_dict]))
self.BitMEX_bot_client.inform_new_prediction(prediction)
That line is basically the whole month: "can I produce live predictions without lying?"
BitmexPythonChappie/OrderBookMovePredictor.pyThis file is the bridge between research artifacts and a running process.
It loads the latest checkpoint and applies the same normalization artifacts I produced earlier:
mean-*.npysigma-*.npybitmex_index_diff-*.npy (if used)Then it turns "feature dict" into "model input", produces a prediction, and returns something the bot client can act on (right now: log/alert, not trade).
The live stream quickly forces one issue to the surface:
timestamps are not optional.
If your snapshot time is wrong by even a little, every look-ahead label and every alignment step becomes suspect.
My basic approach this month is:
clock_diff = local_time - server_time,now - clock_diff inside the snapshot manager.It is not perfect, but it is consistent - and consistency is what lets me debug.
A good offline validation curve makes you think the model is smart.
Then live monitoring happens and you realize something sharper:
the market is adversarial input.
A few patterns I see immediately in the live prediction logs:
And at least once per session:
That is why this month is monitoring, not trading.
I am not building a fancy UI yet. I am building logs and plots that let me answer: "is this real?"
Here is what I log/plot/check in October:
April was about dataset honesty. October is about live honesty.
I keep a few hard rules:
These show up fast in a live loop. I am writing them down in "symptom -> likely cause -> first check" format:
This month's artifact is not a new model.
It is a running process:
BitmexPythonChappie/main.py) that can run for hours,SnapshotManager.py) that produces both HDF5 output and predictions,OrderBookMovePredictor.py) that is strict about preprocessing,Expected result: I can run Chappie in "listen-only mode" and collect a daily HDF5 file plus a prediction log that I can replay offline.
That sounds small - but it is the step that makes everything else honest.
This month taught me that the market does not just provide data.
It pushes back.
Next month: The 503 Lesson - the moment I realize that some strategies fail not because the model is wrong, but because the exchange is unreachable exactly when the model becomes most confident.
The 503 Lesson - Outages as a Signal, Not Just a Bug
My first live alpha monitor was “working”… until BitMEX started replying 503 right when the model got excited. That’s when I learned availability is part of market microstructure.
Deep Silos - Representation Learning That Respects Feature Families
My first serious attempt at making the model “see” microstructure features the way I designed them — grouped, compressed, and only then fused.