«Ликвидность как игра»
оценку ставят на защите
Выдаётся в конце лекции 2. Команды lab.market.* появляются в SDK вместе с игрой второй лекции — до занятия страница показывает условие целиком, чтобы было видно, к чему готовиться.
Три части. Ставится тот же SDK, что и в первой домашке, вход тот же:
pip install https://defilab.insights-forge.com/sdk/defilab-0.1.5-py3-none-any.whlfrom defilab import Lab
lab = Lab("https://api.defilab.insights-forge.com",
class_code="DEFI-01", name="Твоё Имя", pin="твой PIN")Сдаёшь через lab.hw.submit(2, ...), защита — так же, как в первой: defense_start, defense, defense_say, defense_stop. Оценку ставят по защите, код и отчёт — билет на неё.
Три траектории цены детали. Ты видишь только первые 30 % каждой — остальное открывается, когда сдашь стратегию. Считается локально, сервер не нужен:
from defilab import sim
for t in sim.lp_tracks():
print(t.n, t.head) # видимая часть: первые восемнадцать эпохЧто сделать:
- Для каждой траектории выставь коридоры вкладчика: нижняя и верхняя цена, какая доля капитала, переставляешь ли коридор при выходе цены за границу.
- Объясни каждое решение до того, как увидишь продолжение: почему такой коридор, почему такая доля, почему такое правило перестановки.
- Доиграй траектории и сравни свой результат с тремя опорными вариантами: держать деталь, вложить без коридора, коридор без перестановки.
strategy = {
1: [{"low": 18, "high": 26, "share": 0.6}, {"low": 12, "high": 18, "share": 0.4}],
2: [{"low": 21, "high": 27, "share": 1.0}],
3: [{"low": 24, "high": 34, "share": 1.0}],
}
res = sim.lp_replay(strategy, capital=100)
for row in res["tracks"]:
print(row) # strategy / hold / pool_full_range / range_no_rebalanceОценивается не итог — он зависит от продолжения, которого ты не видел, — а обоснование до и разбор после. В отчёт: таблица «траектория × вариант × итог» и объяснение, где твоё правило сработало, а где нет.
Сейчас эта часть не сдаётся. Рынок лекции 2 в классе закрыт: занятие прошло без игры, и lab.market.* отвечает «рынок закрыт». Делай части 1 и 3 и сдавай без part2. Когда рынок откроют, срок по части 2 объявят отдельно.
В класс-чейне две площадки на одну и ту же деталь с разной ликвидностью. Внешний ценовой фид двигает агент по расписанию, которого ты не знаешь. Твоя задача — бот, который зарабатывает на разнице цен.
lab.market.venues() # обе площадки: лучшие цены и глубина
lab.market.book() # стакан целиком
lab.market.order("bid", price=11, fee=0.5) # своя заявка, комиссия — за место в записи
lab.market.accept(order_id, fee=0.5) # принять чужую
lab.market.swap("buy", amount=2, fee=0.5) # обмен через автоматПравила:
- Рынок остаётся открытым неделю после занятия — преподаватель включает это на панели. Если рынок закрыт, действия вернут «стадия не идёт»: значит, окно кончилось.
- Боты всех учеников работают одновременно и конкурируют за место в пакете.
- Комиссия за запись идёт из твоих монет: сделка на одну монету прибыли при комиссии в две — убыток.
- Агент-сэндвич следит за крупными сделками: слишком большая заявка приедет по худшей цене.
В отчёт: сколько сделок сделал бот, сколько заработал и потерял, три эпизода — где выиграл, где проиграл и почему. «Покупает там, где дешевле» — это не ответ, а начало.
Три вопроса, короткий текст, без кода.
- Придумай, как получить прибыль от падения цены детали, если у тебя есть только спот-рынок — купить и продать. Опиши по шагам, что и в каком порядке делаешь.
- У тебя есть одноклассник, готовый дать детали взаймы. Он не доверяет тебе и не знает, вернёшь ли ты. Какие условия он потребует? Перечисли всё, что придумаешь, и объясни, зачем каждое.
- Что должно произойти, если цена пошла против тебя и ты не можешь вернуть занятое? Кто и как должен это заметить, и что он с этого имеет?
На третий вопрос никто не сдаст правильный ответ — он нужен как список того, во что ты упёрся. Лекция 3 начинается ровно с него.
lab.hw.submit(2,
parts={
"part1": {"tracks": [...], "compare": {...}},
"part2": {"trades": 41, "pnl": 12.5, "episodes": ["..."]},
"part3": {"text": "..."},
},
report_md=open("report.md").read(),
files=[{"path": "bot.py", "content": open("bot.py").read()}])Отчёт (report.md) — свободный текст: что делал, какие числа получил, что объясняешь. Раздел «Что делал LLM, что делал я, где LLM ошибся» обязателен, как и в первой домашке.
Так же, как в первой: письменно, 15–20 минут, экзаменатор задаёт вопросы по твоему коду и твоим числам и даёт живую правку под таймером. Разница одна: половина вопросов будет про часть 1 — почему коридор именно такой и что бы ты поменял, зная продолжение траектории.
- Объясняет, что происходит с вкладом, когда цена выходит за коридор: почему позиция перестаёт работать и во что превращается капитал.
- Понимает размен: узкий коридор — больше комиссий, пока цена внутри, и быстрее выход за границу.
- Может сказать, что сравнивал: холд, пул без коридора, коридор без перестановки — и почему разница получилась именно такая на его траектории.
- Контрфактуал: «а если бы цена весь остаток шла вбок — какой из трёх вариантов выиграл бы?»
- Главный критерий, здесь ловится вайбкодинг.
- Объясняет построчно, как бот решает, торговать ли: где сравнение цен, где учёт комиссии, где размер сделки.
- Знает, почему бот проигрывал в конкретных эпизодах: комиссия съела разницу, опоздал в пакет, слишком большая заявка получила проскальзывание, сэндвич.
- Понимает, что цена в пуле зависит от размера его собственной сделки, и может показать это на своих числах.
- Живая правка: «сделай так, чтобы бот не торговал, когда разница меньше комиссии» или «ограничь размер сделки долей глубины» — правка в нужном месте, компилируется, меняет поведение.
- Придумал работающую схему заработка на падении и понимает, чего в ней не хватает: нужен тот, кто даст взаймы.
- Перечислил условия займа и объясняет назначение каждого: залог, срок, что будет при невозврате.
- Понимает, что «кто-то должен заметить невозврат» — это работа, и у неё должен быть плательщик.
- Связывает арбитраж с местом в пакете из лекции 1: почему быстрая мысль без оплаченного места не выигрывает.
- Раздел про LLM заполнен честно: видно границу между «что делал я» и «что делал инструмент».
Сдача и защита — из кода, кнопок на этой странице нет. Порядок такой:
pip install https://defilab.insights-forge.com/sdk/defilab-0.1.5-py3-none-any.whl
from defilab import Lab
lab = Lab("https://api.defilab.insights-forge.com",
class_code="DEFI-01", name="Твоё Имя", pin="твой PIN")
# сдать работу (можно пересдавать, пока не начал защиту)
lab.hw.submit(2, parts={...}, report_md=open("report.md").read(),
files=[{"path": "MyContract.sol", "content": src}])
# защита: начинается один раз, после старта пересдача закрывается
lab.hw.defense_start()
lab.hw.defense() # прочитать вопрос экзаменатора
lab.hw.defense_say("ответ", code=None)
lab.hw.defense_stop() # закончить и получить предварительную оценкуЧто писать в parts — в разделе «Формат сдачи» выше. Пока защита не начата, каждый новый submit заменяет предыдущий.