Re-judging Performance, Going Live on Early Entry, Two Rounds of Review on a Fund-Transfer Feature — a Week of Double-Checking Numbers
I had a strict AI-led re-judgment of performance against the benchmark, pushed an early-entry structure live, and only caught a silent reporting bug and hidden money-safety flaws by checking things myself a second time.
This is the English version of a post originally written in Korean for my algorithmic trading system devlog(new tab).
First, the infrastructure got cleaned up
Early in the week, I finished narrowing the broker path down to one primary broker.
I kept the secondary broker's integration code and credentials around instead of deleting them. But I switched the comparison track used in the fully-automated paper-trading validation effort(new tab) — from faking it through a secondary broker's paper account to a self-built simulation broker, all in one day.
Alongside the switch, I built an unattended health checker that watches the key states and alerts automatically. The bigger the transition, the more things slip through if the only safety net is someone reading logs the next morning.
I separated gut feeling from evidence to re-judge performance
Looking at the cumulative return, I started feeling like there was no reason to keep putting resources into this system if it couldn't beat just holding the index. So I asked an AI advisor for a strict judgment, no slack given.
The answer differed from how it felt. Against the pre-set benchmark, it wasn't actually underperforming. But there was no evidence the stock selection itself was skillful either — most of the loss came from the market being bad overall, and turnover-driven costs were the one thing draining out for certain.
I pushed further and asked for an actual money-making structure, not just a monitoring rule. What came back was a two-layer proposal: park most of the capital in index-tracking to remove the downside risk structurally, and concentrate a small remainder on the areas where a signal had actually been observed. Neither result touched the code — both stayed pending approval.
Early entry went live; the two-layer structure got shelved over funding
An early-entry structure — freezing the ranking ahead of time and moving up the first trading round's execution — got deployed to the live account the next morning, and the freeze, fills, and follow-up rounds all ran as expected through the first day.
The same day, the execution code for the two-layer structure got finished and merged — but left disabled. A proposal to fund it from new deposits came back, then got discarded once I re-confirmed the premise: no new deposits, no selling existing holdings. The structure itself is on hold. The code is already in, though, so it can be switched on the moment funding is settled.
Six pre-registered hypotheses also got tested that day, and none showed a statistically meaningful signal. One even had an implementation bug — fixing it didn't change the conclusion, and the test design itself got flagged as too loose to catch an effect even if one existed. Instead of testing hypotheses one by one, I re-registered a longer, stricter version; judgment is pushed to early next year.
When an advisor suggested consolidating the turnover cap from per-round to daily, I pushed back on the reported number and asked for a re-check. It turned out some of the trades blamed on the turnover cap had actually been rejected for a different limit entirely. Once the attribution got corrected, the fix landed as: keep the cap, aggregate it daily, and raise it slightly — effective next week.
Two bugs that had been sitting quietly got traced down
A weekly operations report that feeds the blog had been silently skipped every Saturday since mid-September, and I finally dug into why.
One cause was simple — the snapshot timer itself had been off for a few days, fixed right away. The trickier one: a safety check that verifies the ledger matches the actual account balance was reading from an account-state file that hadn't been updated in over a month. The account had already moved during an earlier migration, but one reference in the reporting path got left pointing at the old account — and it took weeks to surface. Pointing it at the new account let the check pass again.
Separately, on the data archive(new tab) side, I found and fixed a bug where the market code used to tell minute-bar data apart from different brokers had been set to an aggregated-index definition instead of the actual exchange definition.
I built a fund-transfer feature for a December account restructuring, and reviewed it twice
Ahead of an account restructuring planned for mid-December, I built a feature to move part of a balance from one account to another. It stays off by default and only gets switched on when actually needed.
Borrowing the same design patterns used in the execution/safety layer(new tab), I made the withdraw and deposit legs idempotent and added a step that verifies the total balance across accounts doesn't change once the transfer completes.
An independent review flagged the most serious issue: if the withdrawal succeeds but the deposit fails, the money from one account quietly disappears with no alert and no record. I fixed it so a failed deposit immediately locks the whole transfer and raises an alert.
A second review of the patched code found another gap — resuming an interrupted transfer with a different amount than originally submitted still went through. The reviewer actually reproduced it by submitting a changed amount. The fix rejects any resume whose amount doesn't match what was originally recorded. Only after that second fix did it get merged — the feature itself stays off until December.
The thread through the week
What ran through this week was not taking a result at face value and checking it myself.
On performance, I separated gut feeling from evidence. On the turnover number, I caught the advisor's attribution being wrong by pushing back. The report bug only surfaced after I traced a weeks-long silence myself, and the fund-transfer code only gave up its hidden flaws after two rounds of review.
A lot gets delegated to automation and AI judgment here, but that doesn't substitute for the final check. This week was a collection of cases where that last check didn't get deferred — it got done by looking directly.