Skip to content

Instantly share code, notes, and snippets.

@demidovakatya
Last active December 8, 2017 11:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save demidovakatya/70be0012e7bfeead323a6272b50667de to your computer and use it in GitHub Desktop.
Save demidovakatya/70be0012e7bfeead323a6272b50667de to your computer and use it in GitHub Desktop.

Постановка задачи

Будут предоставлены данные по двум финансовым инструментам PIZZA и PASTA. Вам предстоит проанализировать и сгенерировать прогнозы значений волатильности для инструмента PIZZA на 100 изменений в данных (на финансовом сленге на 100 "тиков") PIZZA вперед. При этом, вы можете исследовать изменение качества прогноза волатильности PIZZA путем добавления в модель данных по финансовому инструменту PASTA. Инструмент PASTA прогнозировать не нужно, он предоставляется исключительно, как вспомогательный.

Предсказания Y рассчитываются по формуле:

  • Y = pd.Series(mid_price).rolling(window=100).std().shift(-99),

где mid_price - это 1/2 * (лучшая цена спроса + лучшая цена предложения).

Метрика качества:

  • 10 / rmse

где rmse = numpy.sqrt(sklearn.metrics.mean_squared_error(наши_эталоны, ваши_предсказания)).

Т.е мы берем Ваши предсказания, вычисляем метрику качества по указанной формуле и чем больше оказывается эта метрика, тем лучше результат и тем вы точнее выполняете предсказания.

Предполагаемые этапы

  1. Разработка модели: Вы разрабатываете модель, для этого Вам будут предоставлены примеры исходного кода и данные в формате csv (формат см. ниже).

  2. Валидация: для этого нужно подготовить решение, упакованное в zip архив. Коммуникация с вашей моделью происходит в интерактивном режиме. Ваша модель получает в обновления лимитной книги заявок (стакана, orderbook'a) пошагово (строка из csv) и после каждого шага необходимо вернуть предсказанную волатильность. Вам нужно предоставить модель, которая будет автоматически упакована в контейнер и провалидирована на сервере. Инструкции по подготовке решения см. ниже. Валидацию можно выполнять много раз, по итогам валидации вы получаете место в таблице интерактивного рейтинга. Вы должны уложиться во временные параметры проверки на валидации. Время валидации составляет не более 5 минут на 1 000 000 записей. Модель должна обрабатывать валидационные данные с этой частотой на нашем проверочном железе, чтобы результат был засчитан. 

  3. Итоговый прогон стартует после окончания активной части соревнования. Вы должны представить вашу наилучшую модель для итогового прогона на нашем тестовом сете. Итоговый прогон выполняется только один раз - Вы должны уложиться во временные параметры проверки на тестовом сете. Размер итогового тестового сета в 4 раза больше размера сета валидации.

Требования к ПО

  • ZIP
  • Python 2.7 или Python 3.5 с модулями: pandas, numpyscikit-learn, docker, scipy

Выполнение производится в контейнере docker под ОС Linux. В качестве образа для docker-контейнеров используется последняя версия kaggle/python.

Предоставляемые файлы

Архив public.zip

Архив содержит:

Файл Описание
data/train_data.csv Тренировочные данные
jupyter_solution_example Пример создания модели в Jupyter Notebook
solution_example/hackathon_protocol.py Реализация сетевого протокола
solution_example/metadata.ini Содержит команду запуска. Должен обязательно присутствовать в корне zip-архива с решением.
solution_example/predict_online.py Пример простого работающего клиента, возвращает текущую волатильность вместо предсказанной. На основе этого файла вы можете построить свою предсказательную модель. TCP соединение устанавливается по указанному IP адресу и порту, указанных в переменных окружения: HACKATHON_CONNECT_IP, HACKATHON_CONNECT_PORT (если переменные не заданы, то по умолчанию при локальном запуске predict_online.py будет использованы localhost:12345 при запущенном check_solution_server.py). Обязательно необходимо указать в переменных: USERNAME, PASSWORD (ваш логин и пароль, использованный при регистрации на сайте).
check_solution_server.py Локальный сервер для проверки решения, который вы можете запускать на своем компьютере. Оценивает предсказания и выводит результат. Обязательно (!) перед отправкой решения на сервер проверить корректность его работы с помощью данного локального сервера.

   

Как подготовить zip архив c решением

Предположим, Вы подготовили модель в Jupyter Notebook. Нужно перенести модель в standalone скрипт, который можно запускать из командной строки, и который сможет обмениваться данными с проверяющим сервером.

  • В файле predict_online.py прописать ваши USERNAME и PASSWORD, выбранные Вами при регистрации (см. наш пример решения).
  • Сохранить обученную модель в файл. Например, модель lightgbm.Booster имеет метод save_model('my_model.txt'). Сохраненный файл вы будете использовать при интерактивном выполнении.
  • Составить скрипт python для интерактивного исполнения, который один раз подгрузит сохраненную на шаге 1, обученную модель. 
Глобально, в этом скрипте Вам нужно выполнять следующее:
    • Загрузить свою модель. Например, для lightgbm.Booster нужно указать сохраненный файл модели model = lightgbm.Booster(model_file='my_model.txt').
    • При вызове коллбека on_orderbook() Вам будут передаваться очередные данные, и вы должны сохранять их для того, чтобы потом выполнить предсказания при вызове коллбека make_prediction().
    • В коллбеке make_prediction() вы обязаны вызвать реализованный и унаследованный метод вашего клиента self.send_volatility(answer).
  • Дождаться выполнения скрипта до финального вызова коллбека on_score(items_processed, time_elapsed, score_value), где в переменной score_value будет возвращено оценочное значение Вашего решения по объявленной методике.
  • Поместить файлы решения в zip архив, содержащий в имени файла название команды и состоящего только из букв и цифр латинского алфавита (например: MySuperTeam-MyBestSolution_v1.zip).
  • Перейти к пункту "Как отправить на проверку решение"

Как отправить на проверку решение

  • Подготовить zip архив с сохраненной моделью. В корне должен содержаться metadata.ini, где прописана команда запуска для выбранной версии python.
  • Отправить zip архив через http://alfahack.dhis.org/upload. Сервер рассчитывает и сохраняет md5-хеш загружаемого файла - не пытайтесь загрузить один и тот же файл (даже с другим именем) повторно. 
  • В случае успешной загрузки файла на сервер на странице загрузки появится ссылка вида:
    • You can check solution for errors by following link: d84581140e548373c54ec332899b2bcd, по которой Вы можете проверить результат выполения вашего решения на сервере
    • Общая таблица выполняющихся в данный момент решений на сервере будет доступна по ссылке: http://alfahack.dhis.org/tasks.
  • В случае успешной проверки, ожидать появления обновленного результата на scoreboard: http://alfahack.dhis.org.

Формат данных csv

Тренировочные данные - это csv вида:

?
0_ID;1_TIME;BID_P_1;BID_V_1;BID_P_2;BID_V_2;BID_P_3;BID_V_3;BID_P_4;BID_V_4;BID_P_5;BID_V_5;BID_P_6;BID_V_6;BID_P_7;BID_V_7;BID_P_8;BID_V_8;BID_P_9;BID_V_9;BID_P_10;BID_V_10;ASK_P_1;ASK_V_1;ASK_P_2;ASK_V_2;ASK_P_3;ASK_V_3;ASK_P_4;ASK_V_4;ASK_P_5;ASK_V_5;ASK_P_6;ASK_V_6;ASK_P_7;ASK_V_7;ASK_P_8;ASK_V_8;ASK_P_9;ASK_V_9;ASK_P_10;ASK_V_10;Y
PIZZA;1970.01.01 01:11:29.966690;2418;7;2417;3;2416;3;2415;3;2414;57;2413;9;2412;8;2411;7;2410;10;2409;5;2421;5;2422;5;2423;5;2424;5;2425;5;2430;1;2431;2;2436;1;2437;1;2438;1;0.4195656724940916
PIZZA;1970.01.01 01:11:32.444868;2418;7;2417;3;2416;3;2415;4;2414;57;2413;9;2412;8;2411;7;2410;10;2409;5;2421;5;2422;5;2423;5;2424;5;2425;5;2430;1;2431;2;2436;1;
PIZZA;1970.01.01 01:11:33.886045;2420;1;2418;7;2417;3;2416;3;2415;4;2414;57;2413;9;2412;8;2411;7;2410;10;2421;5;2422;5;2423;5;2424;5;2425;5;2430;1;2431;2;2436;1;2437;1;2438;1;0.42091770831337116
PIZZA;1970.01.01 01:11:36.895255;2420;1;2418;7;2417;4;2416;3;2415;4;2414;57;2413;9;2412;8;2411;7;2410;10;2421;5;2422;5;2423;5;2424;5;2425;5;2430;1;2431;2;2436;1;2437;1;2438;1;0.41350314204962735
PASTA;1970.01.01 01:21:29.006102;128694;53;128693;150;128692;107;128691;123;128690;45;128689;108;128688;98;128687;204;128686;108;128685;143;128695;110;128696;90;128697;87;128698;90;128699;167;128700;88;128701;172;128702;192;128703;155;128704;213;NaN
PASTA;1970.01.01 01:21:29.006131;128694;53;128693;150;128692;107;128691;123;128690;45;128689;108;128688;98;128687;204;128686;108;128685;175;128695;110;128696;90;128697;87;128698;90;128699;167;128700;88;128701;172;128702;192;128703;155;128704;213;NaN
  • 0_ID: идентификатор финансового инструмента (PIZZA или PASTA). Предсказываем волатильность по PIZZA. PASTA может помочь, может испортить, решать Вам.
  • 1_TIME: время изменения данных, микросекундная точность.
  • BID_P_1 - BID_P_10: цены спроса с самой лучшей (BID_P_1) до самой плохой (BID_P_10)
  • BID_V_1 - BID_V_10: объемы спроса, соответствующие цене спроса с соответствующим индексом (BID_V_1 соответствует BID_P_1 и т.д.)
  • ASK_P_1 - ASK_P_10: цены предложения, по аналогии
  • ASK_V_1 - ASK_V_10: объемы предложения, по аналогии
  • Y: если изобразить в псевдокоде:
    • для PIZZA: pd.Series((BID_P_1 + ASK_P_1)/2).rolling(window=100).std().shift(-99)
    • для PASTA: NaN.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment