домашки / домашка 2
сдача через SDK · lab.hw.submit

«Ликвидность как игра»

домашка 2
оценку ставят на защите

Выдаётся в конце лекции 2. Команды lab.market.* появляются в SDK вместе с игрой второй лекции — до занятия страница показывает условие целиком, чтобы было видно, к чему готовиться.

Три части. Ставится тот же SDK, что и в первой домашке, вход тот же:

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, ...), защита — так же, как в первой: defense_start, defense, defense_say, defense_stop. Оценку ставят по защите, код и отчёт — билет на неё.

/01Часть 1. Стратегия вкладчика

Три траектории цены детали. Ты видишь только первые 30 % каждой — остальное открывается, когда сдашь стратегию. Считается локально, сервер не нужен:

from defilab import sim

for t in sim.lp_tracks():
    print(t.n, t.head)            # видимая часть: первые восемнадцать эпох

Что сделать:

  1. Для каждой траектории выставь коридоры вкладчика: нижняя и верхняя цена, какая доля капитала, переставляешь ли коридор при выходе цены за границу.
  2. Объясни каждое решение до того, как увидишь продолжение: почему такой коридор, почему такая доля, почему такое правило перестановки.
  3. Доиграй траектории и сравни свой результат с тремя опорными вариантами: держать деталь, вложить без коридора, коридор без перестановки.
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

Оценивается не итог — он зависит от продолжения, которого ты не видел, — а обоснование до и разбор после. В отчёт: таблица «траектория × вариант × итог» и объяснение, где твоё правило сработало, а где нет.

/02Часть 2. Арбитражный бот

Сейчас эта часть не сдаётся. Рынок лекции 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)      # обмен через автомат

Правила:

  • Рынок остаётся открытым неделю после занятия — преподаватель включает это на панели. Если рынок закрыт, действия вернут «стадия не идёт»: значит, окно кончилось.
  • Боты всех учеников работают одновременно и конкурируют за место в пакете.
  • Комиссия за запись идёт из твоих монет: сделка на одну монету прибыли при комиссии в две — убыток.
  • Агент-сэндвич следит за крупными сделками: слишком большая заявка приедет по худшей цене.

В отчёт: сколько сделок сделал бот, сколько заработал и потерял, три эпизода — где выиграл, где проиграл и почему. «Покупает там, где дешевле» — это не ответ, а начало.

/03Часть 3. Заработать на падении

Три вопроса, короткий текст, без кода.

  1. Придумай, как получить прибыль от падения цены детали, если у тебя есть только спот-рынок — купить и продать. Опиши по шагам, что и в каком порядке делаешь.
  2. У тебя есть одноклассник, готовый дать детали взаймы. Он не доверяет тебе и не знает, вернёшь ли ты. Какие условия он потребует? Перечисли всё, что придумаешь, и объясни, зачем каждое.
  3. Что должно произойти, если цена пошла против тебя и ты не можешь вернуть занятое? Кто и как должен это заметить, и что он с этого имеет?

На третий вопрос никто не сдаст правильный ответ — он нужен как список того, во что ты упёрся. Лекция 3 начинается ровно с него.

/04Формат сдачи
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 ошибся» обязателен, как и в первой домашке.

/05Как проходит защита

Так же, как в первой: письменно, 15–20 минут, экзаменатор задаёт вопросы по твоему коду и твоим числам и даёт живую правку под таймером. Разница одна: половина вопросов будет про часть 1 — почему коридор именно такой и что бы ты поменял, зная продолжение траектории.

/06За что ставят оценку
A. Коридор вкладчика (часть 1)вес 30
  • Объясняет, что происходит с вкладом, когда цена выходит за коридор: почему позиция перестаёт работать и во что превращается капитал.
  • Понимает размен: узкий коридор — больше комиссий, пока цена внутри, и быстрее выход за границу.
  • Может сказать, что сравнивал: холд, пул без коридора, коридор без перестановки — и почему разница получилась именно такая на его траектории.
  • Контрфактуал: «а если бы цена весь остаток шла вбок — какой из трёх вариантов выиграл бы?»
B. Бот и издержки (часть 2)вес 40
  • Главный критерий, здесь ловится вайбкодинг.
  • Объясняет построчно, как бот решает, торговать ли: где сравнение цен, где учёт комиссии, где размер сделки.
  • Знает, почему бот проигрывал в конкретных эпизодах: комиссия съела разницу, опоздал в пакет, слишком большая заявка получила проскальзывание, сэндвич.
  • Понимает, что цена в пуле зависит от размера его собственной сделки, и может показать это на своих числах.
  • Живая правка: «сделай так, чтобы бот не торговал, когда разница меньше комиссии» или «ограничь размер сделки долей глубины» — правка в нужном месте, компилируется, меняет поведение.
C. Падение и заём (часть 3)вес 20
  • Придумал работающую схему заработка на падении и понимает, чего в ней не хватает: нужен тот, кто даст взаймы.
  • Перечислил условия займа и объясняет назначение каждого: залог, срок, что будет при невозврате.
  • Понимает, что «кто-то должен заметить невозврат» — это работа, и у неё должен быть плательщик.
D. Связь с лекцией и честность про LLMвес 10
  • Связывает арбитраж с местом в пакете из лекции 1: почему быстрая мысль без оплаченного места не выигрывает.
  • Раздел про LLM заполнен честно: видно границу между «что делал я» и «что делал инструмент».
/07Сдача

Сдача и защита — из кода, кнопок на этой странице нет. Порядок такой:

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 заменяет предыдущий.