Programs

CashCow

A local pipeline that tests, statistically, whether corporate disclosures (DART, SEC) move a stock within the same day. Collection, measurement, backtesting and adjudication live in one app, and the pass criteria were frozen before any result was seen. The finding so far is "no verified edge", and protecting that finding is the project's design goal.

2026In progressAI-assisted

Screenshots

3

Overview

A verification pipeline asking whether a stock with a fresh disclosure moves, within the same day, by more than it costs to trade. It collects Korean DART and US SEC filings and runs the same measurement against non-disclosure days of the same stock, matched 1:1 as a control group.

The result first: no strategy has passed yet. This entry is not a record of returns, it is a record of how the absence of returns was established.

What keeps the conclusion honest

Once you have seen the numbers, you want to lower the bar. So the bar was made unlowerable.

Power, multiple-comparison correction and cell-selection rules all sit in one go_criteria.json, fixed before any result existed. That the file's mtime precedes the result files is itself the audit evidence.

The most recent period has an access budget of 1. Looking spends it, and six preconditions must all hold before it is opened.

Stopping when things look good is optional stopping, which is p-hacking. So adjudication happens once, after collection completes.

Orders sit behind four locks: a code guard, a broker-side hard block, and two expiring unlock files. Everything defaults to locked, and if a config file is missing or malformed it is read as shadow (paper) mode. When in doubt, it does not order.

What it actually taught me

Three failures came not from wrong hypotheses but from wrong measurement. Daily bars had after-hours trading mixed in; US minute bars were scraped over a Korean-market time window, so overnight trading was mistaken for the regular session; and a small-cap sample was benchmarked against a large-cap index, manufacturing a size factor that looked like excess return.

One rule survived all of it. When several independent subjects all look wrong in the same direction, that is not several findings, it is one measurement error.

Another was a flaw in the criteria themselves. As the sample window shortens, standard error grows with √D while the pass threshold does not loosen as much, so no strategy could ever clear the second validation stage. It was documented rather than fixed. Change a threshold after seeing the result and the verdict stops being evidence and becomes an explanation.

Composition

58 Python modules (~20k lines) and a single-window tkinter GUI. Collection, normalisation, scoring, backtesting, sweeps and execution all live in one app; 35 configuration files are split out as JSON with their rationale kept in _why notes. A local LLM (ollama · qwen2.5:7b) assists adjudication, specifically so that tickers and positions never leave the machine through an external API.