Търговска система на Polymarket
Търговска система на живо, която при отказ блокира всичко и в която всяка стратегия първо среща фиксирани правила
- Роля
- Собственик и оператор; агентите го изградиха при правила, които при отказ блокират
- Статус
- В процес
- Код
- Частно хранилище
- Технологии
- PythonTypeScriptNext.jsSQLitesystemdDockerHermes Agent (NousResearch)GitHub ActionsChromium extension (MV3)

В числа
15
семейства стратегии, тествани срещу живи книги с поръчки от паралелни линии за изследване
3 072
конфигурации, претърсени в едно обхождане, като всеки кандидат е фиксиран, преди да бъде оценен
3
условия, които трябва да са изпълнени едновременно преди поръчка на живо: режим на живо в конфигурацията, файл-флаг ARMED и липса на файл HALT
0
езикови модела в цикъла с парите
1s
такт на демона на цикъла с парите, който записва спот цените, книгите с поръчки и лентата със сделки
Проблемът
Краткосрочните пазари за прогнози приключват на всеки няколко минути, а това изкушава към бърз извод от една добра серия. Исках маса, на която стратегията стига до реални пари само след като мине правила, написани преди теста, и където частта, която търгува, е защитена от агентите, които помагат да бъде изградена и управлявана, включително когато ги притискам най-силно.
Подходът
Разделих системата по власт. Цикълът с парите е детерминиран демон, в който няма езиков модел. Агентите работят по тестването на стратегии и по слой за управление, който може да наблюдава и да дава съвети, но по подразбиране няма право да търгува. Статистиката беше записана, преди да съществува какъвто и да е цикъл на самообучение, а правилата на кандидатите се фиксират, преди да бъдат оценени. Агенти на Claude и Codex го изградиха в паралелни git worktree, като всеки пуск завършваше с писмен отчет, брой тестове и независим преглед само за четене. При едно предаване на работата Codex прие пет pull request, направени от Claude, като работа на друг автор, вместо да вярва на отчетите им за завършване: сля ги в еднократен git worktree и пусна общия набор от тестове, преминаха 1 117, пропуснати бяха 90, преди нещо да стигне до main.
Как работи
Цикъл с парите, в който няма модел
Демон на Python под systemd работи на такт веднъж в секунда и записва спот цените, книгите с поръчки и лентата със сделки в SQLite. В режим на сянка (shadow) той поставя виртуални котировки, отчита изпълнение само когато лентата със сделки мине през неговата цена, и отчита резултата при приключването на пазара. За да тръгне на живо, трябват три неща едновременно: режим на живо в конфигурацията, файл-флаг ARMED и липса на файл HALT. Създаването на файла HALT отменя котировките, стоп при дневна загуба спира сам, а отмените се правят по идентификатор на поръчката, защото акаунтът може да държи ръчни поръчки. Разширението за оператора взвежда търговски бот само след точно изписаната фраза ARM, следвана от името ѝ, а защита за единствена работеща инстанция беше добавена, след като веднъж два демона управляваха един и същи търговски бот.
Слой за управление, който при отказ блокира
Моят агент Jeisan (има собствена страница) работи върху Hermes Agent на NousResearch на отделен хост и достига до търговските ботове само през верига от стъпки с минимални права, която свършва в строг парсер от страна на сървъра. Единствената промяна в продукция се извършва от systemd таймер с root права, в който няма модел. За старт на живо са нужни мандат с изтичане и без възможност за повторно използване, хешове на конфигурацията, заверени от root, и пресни подписани данни от борсата, а политиката и мандатът се доставят изключени, така че инсталирането на слоя за управление не може нито да взведе, нито да търгува. Отделни задачи за наблюдение държат HALT, който не се премахва сам и има предимство пред мениджъра.
Статистика преди цикъла на самообучение
Преди да изградя цикъл, който сам се пренастройва, записах статистическите защити като задача (issue) и като документ. Те определят колко доказателства трябва да носи една промяна, за да се брои, а проверките са чисти функции в кода. Слоят за вземане на решения е ограничен до оперативни факти и предварително регистрирани експерименти.
Изследователски екип, който проверява сам себе си
Четири паралелни линии на Opus изследваха едновременно и проверяваха работата си взаимно. Тест върху исторически данни (backtest) от една линия беше сверен със запис на жива книга с поръчки с точност до милисекунда от друга линия, а проверката разкри две клопки в данните, които след това отидоха при всяка линия: остарели моментни снимки на книгата и времена на сделките, които са време на блока, закъснели с около две секунди. Правилата на кандидатите бяха фиксирани и подпечатани с хеш преди оценяването, после оценени веднъж спрямо предварително регистриран праг.
Симулатор, който трябва да доказва изпълненията си
Изследователски спринт на Codex преработи симулатора така, че всяко симулирано изпълнение да доказва, че цената му е била реално достъпна за сделка, с помощта на времена от борсата и статус на търговията. Отчитането на изпълненията, възрастта на котировките, таксите и приключването е закрепено с 70 проверки (assertions) на изпълнението, 50 сценария за търговски инварианти и 26 теста за времево претеглени средни цени. Скенер за тайни в CI не допусна публикуването на два изследователски пакета.
Какво избрах и какво отпадна
Избрах
Без езиков модел в цикъла с парите
Пред
Агент, който търгува и сам се пренастройва
Моделът в цикъла добавя вид отказ, зад който стоят реални пари, а записаната статистика ограничава всяко пренастройване до предварително регистрирани експерименти. Агентите изследват, преглеждат и съветват; търгува детерминиран демон.
Избрах
Фиксиране и хеширане на правилата на кандидатите, после еднократно оценяване спрямо предварително регистриран праг
Пред
Итерации върху едни и същи данни, докато тестът върху исторически данни започне да изглежда добре
Итерациите върху един набор от данни, докато резултатът изглежда добре, нагаждат стратегията към шума. Един спринт претърси 3 072 конфигурации, а всеки кандидат, който продължи напред, беше фиксиран първо и оценен веднъж, и точно това прави всеки резултат достоверен.
Резултатът
Масата търгува на живо и е печеливша. Резултатите остават частни: баланси, позиции, изпълнения и кои стратегии са оцелели не са на тази страница, а тя не дава парични суми. Стратегиите, които са минали, работят като търговски ботове зад аварийните прекъсвачи по-горе: в режим на сянка, докато не бъдат взведени, взвеждат се само с изписаната фраза и се спират с файл или със стоп при дневна загуба. Инженерството е проверимо: слой за управление, който се доставя невзведен, симулатор, чиито изпълнения трябва да доказват цените си, и писмен метод за тестване на следващата идея, преди да докосне пари.
Бележки от практиката
От търговската система
Две копия на един и същ AI се бият
Веднъж загубих един следобед заради схватка между две копия на един и същ AI, а и двете ги бях пуснал аз.
Две сесии на Claude Code споделяха един сървър, на който работеха автоматичните ми търговски демони. Първата започна като въпрос как да отворя един сайт от телефона си, после сама се назначи за пазач на папката с търговската система и активира собствени програми за наблюдение. Часове по-рано бях спрял да я ползвам и бях преминал към нова сесия, за да продължа разработката. Новата сесия знаеше, че съществува друга, паралелна. Не знаеше, че към старата още постъпват сигнали от аларми, нито какво старата смята за проникване.
Новата сесия пусна websocket модул. Старият пазач намери файл, който не беше писал той, и го премести в папка за карантина. Часове по-късно новата сесия качи отново същия файл и вдигна втори отделен търговски бот. Аларма събуди пазача, който реши, че нашественик пуска промени направо в работещата система, и спря всички търговски процеси. Натиснах START в конзолата, а пазачът го изтълкува като съпротива на нашественика. Затова спря услугите, уби процесите, прибра папката на новата единица в папка с дата и час и изтри файла на услугата ѝ (service unit).
Пари не бяха преместени и нищо не беше загубено. Когато открих кой е виновен, новата ми сесия изпрати на старата съобщение да се оттегли. Старата се извини и остави точен списък на всичко, което беше преместила. Всичко беше възстановено и проверено по хеш. Хранилището вече съдържа едно правило: един оператор на сървър.
Един оператор на сървър.