Дмитpий Hecтepук

Блог о программировании — C#, F#, C++, архитектура, и многое другое

Хранение и анализ биржевых данных

6 комментариев

Я должен признаться, что когда только начал общаться с коллегами на тему алготрейдинга, инфраструктуры у меня было где-то ровно нуль. Если мне не изменяет память, у меня было меньше 3-х мониторов (сейчас это немыслимо), да и комп был достаточно сомнительный. Поэтому, когда коллега отгрузил мне full order log Московской Биржи за несколько лет, мне пришлось пойти в магазин и купить пару «терабайтников» чтобы все это где-то хранить.

Полный ордер лог оказался просто огромным набором баз SQLite. На каждый день есть две основные базы — ордера и сделки. Естественно что формат этих баз «в лучших традициях». Вот например, допустим вам нужно записать в базу цену актива. Какой вы тип выберете? Правильный ответ тут — конечно же int, целое число, ведь цена имеет фиксированную точность далее которой не имеет смысла копать. Брать float/double нельзя т.к. там сразу теряется представление данных (зато в финмате у нас очень много где именно FP). Что же выбрала биржа?

Не, ну че, нормально так. Это даже не строка, это bcd_char(16,5), хотя я ввиду ограниченности драйвера который я использую вычитываю эту штуку именно как строку и потом просто конвертирую ее в соответствующий тип. Бонусные очки даются если угадаете в какой тип (намек: мы не можем полностью гарантировать сколько цифр будет после запятой, а FP теряет точность…).

Естественно что проблем вычитывания базы намного больше чем со странным представлением цен. Чего только стоит конверсия времени из varchar(22). Я может был бы рад хранить эту информацию в формате posix time, но проблема в том что для рассчетов это катастрофически неудобно, поэтому в коде порой появляются полностью нечитабельные перлы вроде этого:

static uint64_t netEpochOffset = 441481536000000000LL;
static ptime netEpoch(date(1400, 1, 1), time_duration(0, 0, 0));
static int64_t TimeToTicks(ptime time)
{
  time_duration td = time - netEpoch;
  uint64_t nano = td.total_microseconds() * 10LL;
  return nano + netEpochOffset;
}

К счастью, каждый из таких файлов вмещается в оперативной памяти, но обработка всего этого добра занимает огромное количество времени.

Итак, естественный вопрос, а что же мы собственно хотели от всей этой кухни? На самом деле, обработка данных с биржи — это поэтапная процедура.

Шаг первый — это объединение разрозненных файлов в одну базу. Просто потому что с этим проще работать. Тут уже начинаются проблемы с консистентностью того, что дает биржа. Плюс к этому, начинаются различные вопросы оптимизации, т.к. база на несколько терабайт по определению не может работать быстро если вам нужно выборочно из нее что-то выдергивать. Но именно тут появляются две очень полезные возможности:

  • Из данных можно выпилить все, что не нужно, или даже немного преобразовать типы данных, если надо. Например, я не хочу хранить цены как строки, т.к. их слишком долго вычитывать.

  • На базе можно производить индексирование и реорганизацию структуры.

Отчасти все, о чем я пишу — это экспериментальный процесс, который сильно зависит от выбранной базы данных. Моя база (MongoDB) была и является достаточно бажной с большим кол-вом сомнительных решений, что тем не менее не мешает мне гонять на ней огромные датасеты. Да и не только мне, крупные банки тоже используют ее и вроде как довольны.

Следующий этап после того как вы собственно получили базу данных (ордеров, допустим) — это попытка выудить цену актива. Цены, как вы понимаете, формируется из бидов и асков, но у вас их нет! У вас есть только заявки в стакане, и соотственно чтобы получить эту заветную цену, нужно для каждого нужного вам инструмента сформировать стакан и «дотянуть» этот стакан до того момента, когда вам нужна цена.

Естественно что иногда сама цена тоже недостаточна и хочется заниматься «микроструктурным анализом» — звучит пафосно но на самом деле этот анализ в основном делается визуально нежели алгоритмически (я работаю над этим!). В этом случае наличие стаканов тоже полезно, но вот сериализовывать стаканы для последующего использования я не считаю нужным т.к. это порождает невменяемый переизбыток данных. Но с другой стороны, работа с тиковыми данными очень болезненна, и эту проблему, похоже, не залить никакими деньгами.

Самый банальный пример анализа по этому делу: это когда ты строишь портфель на основе собственных рассчетов волатильности «я ж умнее всех» и потом хочешь дотянуть этот портфель до экспирации. В этом случае можно сделать ставку на то что рынок достаточно-ликвиден (тут все зависит от гранулярности, конечно, надо перепроверять) чтобы в любой момент можно было делать хэджирование с теми объемами которые нужно. Тут мы либо берем среднюю по больнице цену на краях стакана, либо строим стаканы ограниченной глубины. И конечно это не тиковые данные.

Раз нам нужны не тиковые данные, мы делаем дискретизацию или «квантизацию»: один раз все же строим полный стакан в памяти, но сэмплим этот стакан, например, раз в секунду, минуту, час и так далее. Если вам хочется держать руку на пульсе и следить за перепадами цен, которые могут цепануть ваши роботы, можно вместо краев или среднего (bid+ask)/2 брать high/low/open/close, опять же, все зависит от ваших допущений относительно волатильности.

Да, насчет волатильности: это отдельная тема т.к. в отличии от одного инструмента, эта штука сразу цепляет целый стрип опционов, и тем самым приходится анализировать намного больше данных. Опять же, можно записывать показатели выведенной из рынка волатильности, которая дискретизирована, но в этом случае вы естественно теряете надежду на всякий арбитраж, т.к. вы его просто не заметите. Но на рынке очень редко бывает когда улыбка волатильности отходит от интерполированных методом координатного спуска значений (и сам метод этот иногда приносит сюрпризы в форме ласточки вместо улыбки) поэтому что тут ловить напрямую — непонятно.

Резюмируя, обработка данных подразумевает как наличие хороших мощностей для хранения и вычислений, т.к. и проработанной инфраструктуры для того чтобы быстро и эффективно получить те или иные данные. Поэтому серьезные конторы вроде GS делают свои SecDB/Slang, а нам простым смертным остается только на коленке писать какие-то небольшие скрипты чтобы хоть что-то посчитать. Но к счастью, порой, и этого хватает. ■

Реклама

Written by Dmitri

16 января 2019 at 14:51

Опубликовано в Data

Tagged with , , , ,

Мой подход к инженерии

6 комментариев

Вы может заметили что у меня в блоге нет ничего связанно с «хорошими практиками», DDD, «чистым» кодом и всем вот этим. И я если честно не особо фанат обсуждать все эти темы потому что считаю их природно-нерелевантными. Каждый раз когда мне кто-то в социалочке начинает заливать что «твой подход некомильфо», у меня мысль одна — если вы, ребята-айтишники, все такие умные и все знаете, почему вы такие бедные?!

В этом посте я немного расскажу про то, как лично я пишу код, и какого этот код качества. Думаю вы уже чуете неладное, и правильно, ибо для перфикционизма тут места нет.

Кодогенерация

Блииин, сколько же у меня кодогенерации. На самом деле, не один я ее практикую, например та же MOEX генерит сишные структуры прямо из потоков… а потом я прохожусь своим генератором по этому нагенеренному коду и делают эти структуры еще лучше, добавляю немного ООПшной магии чтобы код был более юзабельным.

Знаете есть такая шутка — «пиши код как будто следующий мейнтейнер будет агрессивным психопатом который знает где ты живешь». Так у меня есть свой вариант — «пиши код так будто тебе завтра нужно будет его оборачивать в SoC решение». В моем случае, SoC это когда у тебя есть, например, PCI плата с ethernet портом, а на плане как FPGA так и какой-нибудь ARM, и хочется чтобы все это работало быстро и в гармонии.

Две вещи которые я точно генерю почти всегда — это перечисления и сущности.

Перечисления нужно делать потому что реализация перечислений (enum-ов) в современных ООП языках это кошмарный ад. Кто и по каким причинам сделал все так криво я не знаю, но я обычно выношу перечисления в отдельный Т4 файл, который генерит все перечисления в проекте сразу, одним файлом вне зависимости от языка (хз работает ли это в Java но я не пишу на Java).

Суть тут в следующем: иногда, тебе нужно чтобы перечисление было тупо числом. Например ты посылаешь код на CUDA, туда что-то иное нельзя пихать. А иногда нужно чтобы к перечислению было приписано куча всяких метаданных вроде например правильной формы описания этого enum-а при выводе. Вот например:

enum class Rarity
{
  Common,
  Uncommon,
  Rare,
  MythicRare,
};
std::ostream& operator<<(std::ostream& os, const Rarity value)
{
  string result;
  switch (value)
  {
    case Rarity::Common: result = "Common"; break;
    case Rarity::Uncommon: result = "Uncommon"; break;
    case Rarity::Rare: result = "Rare"; break;
    case Rarity::MythicRare: result = "Mythic Rare"; break;
  }
  return os << result;
}

Из кода выше понятно какой фигней я занимаюсь в свободное время. Но суть всего этого простая: иногда хочется воспринимать перечисление как некий токен с набором метаданных, к которым можно достучаться без лишнего шаманства вроде дотнетных атрибутов. Ну или наоборот, я могу передумать и сделать все на #define-ах.

Сущности, то есть простые классы в стиле POCO (plain old C/C#/C++ object) можно было бы тоже писать руками, но на самом деле нет. И суть вовсе не в штучках вроде паттерна наблюдатель (INotifyPropertyChanged и иже с ним, если мы про дотнет), а в том что очень часто степерь ахтунга обычной структуры идет over 9000, у меня кончается терпение чтобы сделать все через ООП, а делать АОП я не хочу потому что это черный ящик который плохо дебажится.

Хотите посмотреть на лютый ппц из сферы M:tG? Окей. Вот так примерно может выглядеть сущность под названием Mana:

struct Mana
{
  int32_t red{0}, green{0}, black{0}, white{0}, blue{0};
  int32_t  two_red{0}, two_green{0}, two_black{0}, two_white{0}, two_blue{0};
  int32_t colorless{0};
  bool is_red() const { return red > 0 || two_red > 0 || blue_red > 0 || black_red > 0 || red_green > 0 || red_white > 0;
  bool is_green() const { return green > 0 || two_green > 0 || black_green > 0 || red_green > 0 || green_white > 0 || green_blue > 0;
  bool is_black() const { return black > 0 || two_black > 0 || white_black > 0 || blue_black > 0 || black_red > 0 || black_green > 0;
  bool is_white() const { return white > 0 || two_white > 0 || white_blue > 0 || white_black > 0 || red_white > 0 || green_white > 0;
  bool is_blue() const { return blue > 0 || two_blue > 0 || white_blue > 0 || blue_black > 0 || blue_red > 0 || green_blue > 0;
  int32_t cmc() const { return colorless + 
    red + two_red + 
    green + two_green + 
    black + two_black + 
    white + two_white + 
    blue + two_blue; 
  }
  std::string str() const
  {
    string result;
    for (int i = 0; i < red; ++i) result += "R"; 
    for (int i = 0; i < green; ++i) result += "G"; 
    for (int i = 0; i < black; ++i) result += "B"; 
    for (int i = 0; i < white; ++i) result += "W"; 
    for (int i = 0; i < blue; ++i) result += "U"; 
    for (int i = 0; i < white_blue; ++i) { result += "{WU}"; }
    for (int i = 0; i < white_black; ++i) { result += "{WB}"; }
  // и еще дофига такого же ада⋮

Вообще, все что можно кодогенерировать я генерирую. Это упрощает задачу потом переводить это на новые парадигмы. Хоть какой-то контоль за процессом, т.к. в обычной ООП разработке контроля никакого нет, ой, мы сломали все тесты, бежим переписывать.

Да, еще много кодогенерации у меня делается из формул (MathSharp) и из Excel (X2C). Там тоже все очень няшно: помимо математических оптимизаций, можно еще делать хитрые численные перестановки, например выбирать между float и double, делать обработку ошибок и диапазонов. Кстати! Формочки для ввода данных тоже создаются автоматом.

Короче, что я хочу сказать? Что у меня код местами забросан вот всем этим адом, при этом поскольку это сгенерированный ад, я еще могу на него всякие интересные тесты генерить, плюс автогенерация — это бесплатные оптимизации в стиле «давайте засунем несколько байт в один int» (например, на GPU иногда приходится так делать).

Кодогенерация — это не nuclear option, это вообще норма.

Dropbox для всего и вся

У нас очень модно использовать всякие системы вроде Git/GitHub, но я не фанат. Вообще все, что у меня есть, лежит в Dropbox, который просто синхронизируется везде и всегда.

Какой в этом смысл? Ну, я всегда знаю где что лежит. На разных системах одна и та же программа будет писать в один и тот же путь, который засинхронизируется на всех компах. Например, если у вас один из компов настроен гнать юнит-тесты из определенной директории, он всегда будет получить обновленные файлы оттуда и гнать их. Это круче чем сигналы, которые сорсконтрол якобы посылает ТимСити и подобным.

Когда мне нужно синхронизировать системы по Dropbox, я использую… токен-файлы! Прямо как Microsoft Office. Просто создаю например файл в котором написан таймстэмп, другой комп на него смотрит и принимает решения. Брутально но работает.

Единственное чего не записать в Dropbox это биржевые данные. Их чуть более чем дофига, и синхронизировать все это не особо нужно. Обычно идет это на RAID, а вот уже некоторые обработанные куски данных можно держать в дропбоксе, хотя… на самом деле анализ все равно происходит не локально.

Да, кстати насчет этого. Как я уже говорил, у меня исследовательская позиция, которая «активна» года этак с 2002… ухх, много воды утекло. Зачем мне она? Ну потому что там есть нереально мощный кластер. Иногда мне кажется что я единственный во всем универе кто реально умеет этим кластером пользоваться: на самом деле есть студенты которые че-то шарят в HPC, но они в основном делают курсовые. Вообщем много моего анализа происходит там, но там другая среда: там Linux, InfiniBand, конечно синхронизация файлов между нодами, а для оркестрации используется MPI. Ну, тоже, как вы понимаете, в основном плюсы. И Dropbox конечно там не применим — я просто перекидываю туда свои «долгие» задачи. Это отдельный рассказ, там много тонкостей и не думаю что они кому-нибудь интересны.

Центральный текстовый репо

Кому-то покажется, что пакетные менеджеры вроде NuGet — это прям решение всех проблем для шаринга когда между проектами. Но хорошо это работает только для дотнета, и только когда шаришь много. Если нужно пошарить одну функцию, то использовать нугет (или еще что-нибудь) крайне бессмысленно.

У меня другой подход. У меня есть директория, в которой находится более менее организованная свалка всякого добра которое нужно в разных проектах. Когда приходит время, я просто физически линкую нужный мне файл в проект, тем самым импортируя его не как бинарную либу или .h/.lib а как текст!

Вообще, шаринг кода и либ это нерешенная проблема. Мне уже если честно надоело пересобирать по ночам Boost или QuantLib — конечно, это делает мой CI, но постоянно возникают какие-то косяки, новые флаги компиляции, новые блин компиляторы которые ломают код.

Intel C++ Compiler

Ёжики кололись но продолжали есть кактус. Что не удивительно, т.к. интелевский компилятор, обладающий просто чудовищной поддержкой фич современного С++, при этом дает различные очень хитрые механизмы оптимизации. Помимо этого, у него интересный тулсет профиляции. Не могу сказать что он прям интуитивен, но юзать можно.

Отдельно стоит упомянуть «игрушки» под названием Xeon Phi, которые Intel сначала выпустил как PCI карточки, а сейчас делает их как просто процессоры (делает ли?). Для них, несмотря на x86 совместимость, нужна перекомпиляция интелевским компилятором. Phi — это полумертвая технология, но мне она все равно нравится потому что засунуть комп в комп это всегда круто. Пусть себе работает, 60 ядер, никаких проблем с branch divergence в отличии от CUDA.

CUDA Toolkit

CUDA позволяет считать некоторые data-parallel вещи на GPU. На ней лучше всего считать то, что вы считаете постоянно и регулярно, т.к. разработка сама по себе более затратна и проблемы тут тоже бывают. Естественно, что задачи где много conditional logic лучше тут не гонять, хотя как знать, если правильно дробить, можно все равно получить хороший прирост.

Есть небольшое кол-во специфики когда у вас несколько карточек, на некольких компах. Есть всякие нюансы с запуском нескольких кернелов одновременно. Но CUDA это просто весело и необычно и помимо прироста производительности открывает ваши глаза на другой подход к программрованию. Но классические алгоритмы придется переписывать, ага. Например, никаких хэш-таблиц, ооп и прочих благ на GPU нет и быть не может, разве что фиксированные массивы.

Что меня больше всего удивляет в куде так это NSight, система удаленной отдадки. Это гениально т.к. твой GPU не должен находиться локально.

Плохой код

Не хочу сказать «говнокод» (все не настолько плохо), но все же я с овновном пишу плохой код который как-то работает. Суть в том, чтобы быстро тестировать идеи, т.к. априори понимаешь, что большинство из них провальные. Ну и не будем забывать что время которое нужно чтобы прогнать тест иногда совсем не нулевое.

Вообще код можно улучшать когда у вас есть свободная минутка. Причесывание кода прятно, но еще более приятно переводить сомнительный код на сишарпе, например, в плюсы или на какую-то аппаратную платформу. Конечно, с кодом легче работать когда ты знаешь уже что он работает.

На самом деле, нулевой цикл достаточно отвратителен. Например, освоение новой биржевой инфраструктуры это по определению головная боль. Сначала ты пишешь на коленке какие-то последовательности. Потом, где-то спустя Н месяцев, ты уже можешь сесть и написать красивый конечный автомат, чуть побольше продумать обработку ошибок. В реальном использовании вскрывается еще какая-то бяка и дай сотона ты не потерял на ней бабло. Стремно все это.

Я тут подчеркну, что я не считаю все эти шаги и действия «скиллами программирования»… это common sense. Ты хочешь сделать все чуть более упорядоченным, снизить энтропию. Мне, к счастью, не нужно например чтобы код кем-то читался. Я использую сокращения которые остаются у меня в голове, я использую нестандартные фичи языка когда это удобно. По крайней мере, в отличии от F#, я могу спокойно вернуться в свой код через пару месяцев и все более менее понятно.

Вот такая вот «инженерная культура». Или ее отстутвие. ■

Written by Dmitri

19 декабря 2018 at 23:13

Опубликовано в Engineering

Обучение математике для quant finance

14 комментариев

Есть такая хорошая фраза — quit while you’re ahead. Уйти из игры до того, как ты стал немощный и уже не можещь даже номинально отрабатывать те деньги, которые тебе платят. Меня эта фраза всегда и драйвила, потому что я прекрасно понимал, что ничто не вечно. Собственно поэтому я всегда искал себе последнюю сферу деятельности, то есть что-то что может раз и навсегда закрыть хотя бы финансовый вопрос.

Поймите меня правильно — у меня на самом деле очень много хобби и много всяких интересных проектов (например, постройка дома) которые ведутся в параллель. Но количество именно профессиональных занятий, кмк, весьма ограничено ввиду того, что чем старее мы становимся, тем сложнее постигать какие-то новые области. А мне, честно говоря, чертовски надоело что знания в ИТ устаревают, поэтому я хотел пойти в сферу, где хотя бы фундаментальная база знаний в каком-то смысле «закреплена» и является вечной, даже если детали реализации придется периодически подкручивать.

В этом посте рассказ пойдет про математические навыки. Скажу сразу — в этом деле я не профессионал от слова вообще, у меня нет высшего математического, математику я учил сам и не то, чтобы я ее идеально знаю. Разница лишь в том, что в отличии от большинства выпускников условного МатМеха, я хоть что-то использую.

Итак, давайте возьмем как данное что у всех есть какие-то школьные знания. К сожалению этого совсем мало. Чтобы хоть как-то плавать в quant finance, нужно знать еще много всяких специфичных областей.

Во главе всего стоит, конечно, статистика — предмет, который я всегда ненавидел и начал хоть как-то понимать только когда пошел в аспирантуру. И то, начал понимать только когда начал косячить в экспериментах, а мой научный руководитель начал показывать мне ошибки в моем анализе (и это в SPSS, где все за тебя машина делает).

Для того чтобы прочитать учебник по мат статистике не нужно каких-то особых навыков. Обычно базовые понятия теории множеств вводятся прямо в учебнике, дается бытовое (не measure-theoretic) определение вероятности, а в выведении различных формул плотностей итд нужно разве что базовые знания дифференциалов и интегралов — школьной программы должно хватить.

Одна из вещей которые лучше вкурить сразу пока вы не получили люлей это понимание того, что такое тестирование гипотез. Иначе говоря, как доказать что тот эффект, который вы нашли в ваших данных, действительно имеет место быть. Это не так просто как кажется, и поверьте, в отличии от социальной психологии, в финансовой сфере у вас не получится делать p-hacking т.к. с натянутыми результатами вы просто получите маржин колл.

Ключевым с точки зрения финмата является не только знание того что такое стандартное отклонение (я кстати, как и Талеб, не фанат всего этого) или то или иное распределение, а оценка. Оценка, то что называется estimation, позволяет нам оценивать параметры распределения случайной переменной на основе некоторых тестов. Зачем это надо? На самом деле все просто: в финмате очень много времени посвящено анализу процесса цены и подгонки его под тот или иной процесс. Естественно, что идеально оно ложится не всегда, но нужно же хоть как-то понять, какая модель лучше всего подходит к тому или иному активу. Это называется calibration.

С базовыми знаниями статистики уже можно начать разбираться в анализе временных данных. Опять же, есть хорошая книга (Analysis of Financial Time Series, Tsay) которая с примерами на R расскажет вам про такие вещи как стационарность, GARCH, и все вот это. Параллельно с этим я бы советовал взять почитать какую-нибудь книгу по истории статистического арбитража, т.к. там очень хорошо рассказывается про то, с каких стратегий люди начинали арбитражить. Естественно, что мир сейчас намного сложнее, но все равно, это очень интересное чтиво.

Вообще современный финмат построен на анализе функций случайных переменных, если там можно выразиться. С этим можно делать очень много веселых экспериментов, с которыми я до сих пор балуюсь: например, делаешь набор данных, которые обладают тем или иным распределением (может даже каким-нибудь сложным, вроде VG) и потом пытаешься обратным числом понять, с какими параметрами была распределена случайная величина.

Есть хорошая книжка Brownian Motion Calculus (Wiersema), которая немного открыла мои глаза на всю эту кухню. Например, я раньше не мог думать в терминах «матожидание матожидания» (E[E[X]]) потому что мой мозг не был настроен на подобные вещи. Эта книжка оказалась хорошей переходной литературой от «бытовой» статистики до чего-то применимого.

Если говорить про процессы цены, то для этого есть целый отдельный раздел математики под названием Стохастика (stochastic calculus). К сожалению, порог входа в эту область достаточно высок, и подразумевает что вы знаете как классический анализ (а это минимум год вашей жизни) так и теорию меры — один из, вероятно, самых неприятных предметов в математике который существует. Но к сожалению, все книги, в т.ч. и основная книга которая у нас используется (Stochastic Differential Equations, Ocksendal) используют measure-theoretic язык чтобы донести свои идеи. К этому привыкаешь, но привыкаешь очень медленно. Кстати, анализ и теория меры приводят к серьезной «профдеформации» в голове со всякими там эпсилон-окрестностями и другим шумом. Плюс, конечно же, все это подразумевает что вы знаете дифф.ур.-ы на нормальном уровне, но с этим не должно быть каких-то серьезных проблем.

Еще одна сопряженная, и любимая мною область — это монте-карло симуляции, т.е. попытки делать выводы из множества симуляций тех или иных процессов. Тут тоже много теории (Glasserman написал шикарную книгу!) а также много веселья, которые можно применять и в других сферах. В моем случае, поскольку я фанат всяких CCG, для меня монте-карло так же естественно как и боты.

Да, пока не забыл, для всей этой кухни есть, конечно, свои языки программирования. Если говорить чисто про анализ, то тут используется все что душе угодно: R, Python, MATLAB, новые языки вроде Julia (SPSS не вариант, сорян). Когда у вас небольшие объемы данных, все нормально. Вот когда вы уже начинаете строить свою собственную инфру (RAID-ы всякие) для данных и анализа, тогда вам возможно придется перейти на что-то потяжелее. Основной язык финансовой инженерии — С++. Так что плюсы, которые используются на стороне исполнения, знать нужно. Они используются на классическом железе, но также С или С++ (зависит от ситуации) используются на аппаратных ускорителях. Так что С++ нужно знать и понимать без вариантов. У Mark Joshi есть книжка которая индикативна тому что реально пишут… for better or for worse.

Раз уж мы заговорили про программирование, у вас конечно должны быть навыки численных методов. Например, как интерполировать улыбку волатильности чтобы найти искривление, которое рынок почему-то не учел? Ну, надо использовать метод координатного спуска (кажется это Levenberg-Marquardt по-буржуйски), а это численная процедура. Тот же подсчет функций плотности по нормальному распределению делается численными методами (Abramowitz-Stegun, до сих пор где-то книжка лежит) которые тоже нужно знать и понимать. Еще было бы вообще здорово разжиться интуицией касательно того, когда нужно делать single/double floating point а когда вообще fixed-point (!). По секрету скажу, что у меня, особенно когда нет чего-то мерзко-итеративного, вычисления все single-point; сейчас single/double на CPU работают более-менее одинаково, а вот на GPU… это другая история.

Все что я описал выше займет годы изучения. Нет никаких коротких путей, и не нужно забывать, что помимо всего того что я перечислил выше (а также то, что я забыл), еще нужно разбираться в финансовой стороне дел (даже банальный money/risk management), плюс нужно кодить все это. Поскольку большинству людей это нафиг не надо, проще на 2-недельные курсы в местный форекс сходить и слить все, имеем то, что имеем. Интересно, что даже в профессиональных трейдерских сообществах (например смартлаб) мало кто знает эту кухню, ведь большинство людей занимаются тем что мы именуем systematic trading. Настоящих квантов мало, и в основном они сидят в банках и фондах, а не у себя дома. ■

Written by Dmitri

15 декабря 2018 at 11:44

Опубликовано в Mathematics

Tagged with ,

Заметка про ботов

15 комментариев

Давайте возьмем небольшую паузу и, прежде чем я начну рассказывать уже про «мясцо» мы обсудим более банальную, зато более приближенную к реальной жизни тему, а именно ботов.

Как я уже неоднократно говорил, у меня нет социальной жизни от слова совсем. Основная причина, если я вдруг сейчас начну заниматься самоанализом, заключается в том что мне просто неинтересно — люди в большинстве своем достаточно унылые, интеллектом не обделены, большинству нужна просто стабильная зарплата в конце месяца, кредитовозка или две, дачка в области кабачки растить, ну и летать пару раз в год в Турцию или на Кипр. В таких условиях не может быть никакого полета мысли потому что большинство, помимо вовремя сданного проекта, мало какими ачивками может похвастаться. А обсуждать что нынче идет по телевизору — это не ко мне, увольте.

Кто-то может пожать плечами и сказать «ну что поделать», но на самом деле, эпидемия безыдейности, как я ее называю, имеет такие адские масштабы что по сути, 99.9(9)% населения существует по факту лишь для того, чтобы поддерживать тот статистический разброс, в котором появляются люди которые пилят интересные проекты.

К чему я это пишу? А к тому что всей это идиллии, в долгосрочной перспективе, придет конец. У нас уже есть пример прихода индустриальной революции, но там люди достаточно легко отделались — те, кто делали иголки вручную, стали операторами оборудования по производству иголок. Теперь же операторов попросту не будет. Вот скажите, куда пойдут работать миллион водителей, когда автомобили будут сами ездить? Водить самолеты? Танкеры? Может водить машинки в компьютерных играх?

На самом деле нет. Единственный их шанс — это идти делать роботов. Чем собственно я и занимаюсь, ведь я пишу софтверных ботов, которые автономно делают некоторые действия сами по себе, на основе некоторых правил.

Приведу пример бота которого я написал сегодня. Как вы знаете, в РФ можно ввозить беспошлинно до EUR1000 на одного человека. Если вам нужно ввезти товаров на большую сумму, посылки нужно разбить и послать на несколько человек. На стороне отправщика (freight forwarder) есть услуга по консолидации, когда несколько небольших посылок тебе складывают в одну большую коробку. Очень удобно.

Так вот, я написал бота который просто ходит на сайт, смотрит на мои посылки и подсказывает мне, как и в каком количестве сделать консолидацию, и на кого следует послать ту или иную посылку.

Этот бот — это конечно очень небольшой, тривиальный бот. Я бы сам мог попробовать покомутировать посылки просто на листке бумаги. Но с посылками все не очень просто: например, есть посылки с зимними вещами (шипованные покрышки, например), которые не имеет смысл откладывать на потом. С другой стороны, есть посылки которые не к спеху, хотя боту следует помнить, что срок бесплатного хранения посылки на складе не бесконечен и ее все равно рано или поздно придется послать.

Моя история с ботами начиналась очень давно. Было время, когда у меня было совсем мало денег, хотелось куда-то летать, а билеты на самолеты вели себя как-то уж совсем непредсказуемо. И вот я написал бота, который на основе моих критериев начал ходить на разные сайты и смотреть дешевые билеты, присылая мне сообщения когда нашлось что-то интересное.

Естественно, что владельцы некоторых сайтов пытаются детектировать ботов. Делаеться это всяким javascript-ом который, например, хочет чтобы мыши прямо прошлась по кнопке сабмита а, в ином случае, выдает вам на ружу капчу в стиле «выберете все картинки где автобус». Это не очень приятно и порой с этими выскочками очень сложно бороться.

В конечном счете, мне захотелось стричь с ботов бабло. Я бота написал, пущай он идет в «эти ваши интернеты» и приносит лавэ, пока я греюсь на солнышке на Канарах. Сначала я хотел сунуться в покер, но к тому времени как я затеял всю эту канитель, в покере уже было over 9000 ботоводов — настолько, что по текущим оценкам, где-то 50% всех учатников покер-румов это боты. Опять же, владельцы покер-румов как-то пытаются с этим бороться, но не особо успешно т.к. по сути дела любое их действие тут же отыгрывается умными ботописателями.

Вместо покера я выбрал другую карточную игру, конкретно какую сказать не могу, сорри. В этой игре, к сожалению, очень сложно заскрейпить собственно экран чтобы распознать карты (может это реально, но сложно), я просто написал прогу где специальной игровой установкой (Razer Nostromo) я вводил текущие карты и система переанализировала игровой процесс, подсказывая мне что было дальше. Не то чтобы в этой игре есть какие-то золотые горы, но занятие это действительно веселое, особенно когда понимаешь что анализ дискретных позиций можно делать через монте-карло симуляции на GPU. Конечно, автономным ботом все это не назвать, но это нечто схожее.

Я написал достаточно много всяких ботов, не связанных с алготрейдингом. Например есть боты которые мониторят банковские счета, есть боты которые транслирут медленные сайты так, чтобы я мог комфортно с ними работать (это я про любые тормозные сайты, начиная со всяких форумов Microsoft и заканчивая, простите, YouTrack-ом). Автоматизация некоторых процессов в соцсетях тоже работает «на ура» — например, я хочу дать человеку ссылку на книгу, но ссылки под рукой нет — я пишу название и автора книги, как помню, а бот потом переписывает мой комментарий уже с правильной ссылкой на Amazon. Конечно, все это в основном мелочи, но они делают жизнь чуть более интересной. Вот вам еще пример: как-то я нашел издательство, которое выдавало постранично свои книги в открытый доступ. Естественно, я написал бота который из этих страниц делал полноценные PDFы.

Вообще, с ботами у меня очень много примеров. Касательно инфраструктуры, единственная проблема с теми ботами что работают в интернете — это взаимодействие с браузером. Не все так просто, и запуск вагона разных потоков на вкладки браузера быстро приводит вас к тому, что ничего толком не работает, не хватает памяти, и так далее. Тут у меня подход прост: я агрегирую всех ботов в один сервис, который просто запускает их по очереди. Ведь по сути механизм работы ботов это polling, поэтому нет проблем чтобы этот поллинг для разных сайтов делать в разное время.

По сути, вся алготрейдинговая кухня — это тоже боты, только боты более опасные, т.к. с плохо запрограммированным ботом можно попасть на маржин колл. Рыночный бот также намного больше проверяет/валидирует т.к. биржа это одна большая подстава и если вдруг польются неправильные данные, никто в этом не виноват, лося перекинут на трейдеров. Смысл бота заключается в том чтобы держать какую-то позицию, постепенно перестраивая ее, мониторя рынок, и возможно даже взаимодействуя с другими ботами — ведь высока вероятность, что у этого бота с другими могут быть или пересечения по инструментам или один общий кошелек. Также, биржи очень не любят когда например один бот бьет в заявку другого бота, если оба аккаунта зарегистрированы на вас конечно же. Все это называется красочным словом «перелив» и наказывается оно штрафами.

Не существует какого-то сакрального знания по написанию ботов. Вам просто нужен язык и АПИ которые позволяют дергать ту или иную систему (например браузер или биржевой протокол). Дальше вы используете этот АПИ чтобы получать данные, хранить их, манипулировать и в случае с биржей подавать заявки или менять их. Вот и все. Никакой магии. ■

Written by Dmitri

12 декабря 2018 at 18:55

Опубликовано в Programming

Tagged with

Медленный путь в алготрейдинг

29 комментариев

Попробую продолжить мою историю, только для того, чтобы что-то дельное рассказать, придется сначала вернуться на студенческую «скамью» и начать рассказ оттуда.

Когда-то я сидел в аспирантуре и писал диссертацию по социальной психологии. Это был еще один фейл в моей жизни, т.к. профессия академического психолога предполагает не только нищенство (это само собой разумеется), но также весьма сомнительного качества исследования, 60% из которых (цифра официальная) не реплицируются от слова совсем. Вся эта тема налажена на поток чтобы тянуть исследовательские деньги из фондов вроде ESRC, и мне она не подошла тем, что было банально неинтересно. Но я тут не для того, чтобы разглагольствовать про психологию — это особая, очень специфичная, очень женская дисциплина в которой, в отличии от какого-нибудь программирования, до «применения по существу» как до луны. Вещь в себе.

Так вот, будучи на психологии, я периодически рыскал в рунетах (ностальгия? возможно!) и наткнулся, как вы думаете на что, на Форекс Клуб — один из наших старейших форексолохотронов которые убеждают домохозяек, что за 2 недели изучения технического анализа (лжедисциплина, но об этом позже) можно стать «трейдером на валютном рынке». Я, конечно, в тот момент был дебилом, и повелся на всю эту хрень. Денег я, конечно, туда не вливал, но целиком поверил что «мне везет» и я вообще понимаю что со всей этой кухней происходит.

Время шло, и я постепенно наткнулся на популярный терминал MetaTrader, который многие кухни использовали для якобы проведения сделок (на самом деле нет) с плечом аж до 200:1. Примечательным свойством МТ было то, что там можно было писать торговых роботов, а ушлые поставщики сего терминала даже запустили мировой чемпионат (!) где люди могли соревноваться в написании торговых ботов. Называется это сейчас World Cup Trading Championship и является прекрасной заманухой тех, кто считает, что торговать на голом спотовом инструменте это нормально.

Примечательным свойством MetaTrader является то, что прямо в систему встроен C++образный API для написания ботов, которых можно прямо в системе и тестировать. Под «тестировать» нужно понимать, что тесты он проводит на исторических данных без учета того беспредела с проскальзыванием и полным адом, который устраивают кухни. В общем, до реальной жизни тем бэктестам как до луны, но АПИ богат и напичкан всякими погремушками теханализа так что любой advanced домохозяйке надолго хватит.

В контексте этих ботов (их MT называет adviser-ами) у меня появился первый спортивный интерес. А почему бы не пописать роботов, которые там чем-то торгуют? Ведь это так весело, ты сидишь а софтинка тебе денежки приносит. Прям мечта, и масштабы практически безграничны.

Для начала я решил попробовать ручную торговлю. Открыл счет на FXCM (те еще проходимцы), влил туда тыщу фунтов (!) и начал «торговать» вручную. Естественно, что без какого либо базового мани менеджмента, я не мог ничего заработать даже когда фундаментальные показатели шли в мою пользу — при прибыли мои тейкпрофиты не отрабатывали, а кухня прикрывалась тем, что и не гарантирует исполнение в момент выхода новостей. В общем, результат был достаточно предсказуем, примерно как поиграть в казино. Мне кажется, этот опыт пошел мне на пользу т.к. лучше выкинуть тысячу чем «соточку».

Мои заигрывания с FXCM (баланс колебался туда-сюда) продолжились даже когда я переехал в РФ. Терминал стоял у меня прямо на рабочем компе и я периодчески поглядывал, оправдывались ли мои ожидания, базированные, вы угадали, на техническом анализе. Естественно, о том чтобы чуток поизучать математику всего этого не было и речи и, более того, я был убежден что математика программистам вообще не нужна и только отвлекает.

В какой-то момент я наткнулся на такой концепт как «нейронные сети». Систематической литературы по этому феномену тогда не было, были лишь тривиальные кейсы про то как это использовать в OCR плюс очень много воды про то что якобы это применимо в других областях, в т.ч. и в трейдинге. Меня все это как-то сильно цепануло, и я напечатал себе целую огромную папку статей (многие из которых я до конца не понимал т.к. в академии в comp sci все пишут очень плохо и размазано), плюс я начал писать код и даже тестировать торговлю с помощью нейросетей на исторических данных. У меня конечно ничего не работало, но и методологически я, в то время, не смог бы правильно оценить влияние ТС даже если бы все действительно работало как надо.

В общем, вся эта форексовая тема как-то схлопнулась сама собой. Сидя потом без работы, я прочитал в сети достаточно на эту тему чтобы понять, что эта сфера не для меня и что хитрые системы (т.н. «кухни») настроены против игроков и даже их ставки ни на какие «междунородные рынки» в большинстве случаев не выходят. А денег на полноценные ECN-ы у меня не было, да и игра без плеча 100:1 казалось какой-то уж совсем бессмысленной. Все это дело затихло и я не слишком горевал по этому поводу.

После того как я попал в JetBrains, оттуда уволился один из сотрудников из команды Решарпера, причем ушел он не в МС или Одноклассники (да-да, бывает и такое), а пошел делать свой стартап. Он вышел со мной на связь, и мы встретились с ним, а также с его другом и одновременно инвестором — человеком который делал реальные деньги торговлей на бирже. Мой интерес к алготрейдерской теме снова пробудился, и мне было приятно пообсуждать различные механизмы реального заработка на рынках.

Примерно на этом этапе я понял что я нифига не понимаю во всей этой канители, и что в первую очередь нужно учиться. Нужно понять рынки, инструменты которые на них торгуются, откуда берутся цены и где, собственно, есть возможности для заработка. Проблема оказалась лишь в том, что для тех математических знаний, которые были нужны для того чтобы даже только понять, ничего не заработав, пришлось несколько лет просидеть за книгами.

Изучение высшей математики когда тебе «за 30» — это не шутка. Это реально, но мозг уже забит всяким мусором, и раскочегаривание его занятие весьма мучительное. Поясню, что в Английских универах на comp sci, в отличии от РФ, не дается высшая математика а лишь азы, поэтому начать пришлось буквально с базовых вещей вроде математической статистики и вероятности, линейной алгебры, и прочими весьма банальными дисциплинами. Но было бы слишком легко если бы можно было просто копнуть эти темы на поверхностном уровне и бежать считать реальный рынок. На практике пришлось пройти вводный курс анализа, изучить теорию меры и углубиться в стохастику — тему, которая до того момента была мне вообще неизвестна. Тут, для полноты картины, следует упомянуть, что у меня склонности к математике — я сдал математику в школе в 9 классе, в универе по (рудиментарной) математике у меня был высший балл, да и вообще, у меня родители матфизики так что когда-то там, в далеком прошлом, мне это все очень легко давалось. Это я к тому, что я в очередной раз амортизировал то, что подходит лично мне и не факт что подойдет кому-то еще.

Даже освоив какие-то математические дисциплины, очень сложно понять как все это многообразие сухой математической теории применить к реальному рынку. Например, недостаточно знать какие-то базовые распределения, нужно еще знать как формулировать гипотезы присутствия этих распределений в цене. И конечно, существует огромный прыжок от известных и устоявшихся моделей до чего-то оригинального, для каких-то собственных моделей и изысканий.

Лучше всего на меня в этой истории повлияли проработанные кейсы. Например, удачно выбранная книга по time series analysis иллюстрировала с примерами кода как можно анализировать различные свойства рядов данных. Естественно, ни одна книга не ответит на вопрос «а где альфа?» (то есть прибыль), ее нужно искать самостоятельно. Но по крайней мере это толчок в нужном направлении.

Как изучить математику, нужную для финансовой области? Мой алгоритм примерно таков:

  • Оцените свой уровень и подготовьте список литературы

  • Начинайте читать несколько книг одновременно — я часто читаю по 2 книги из одной области. Например, у меня одновременно были 2 книги по мат статистике, очень похожие но с некоторыми отличиями

  • Ознакомитесь с системой компьютерной алгебры и начинайте писать простой код как только у вас есть знания чтобы его написать

  • Не бойтесь задавать глупые вопросы и делать расчеты «не как все». Например, если вам не нравится дисперсия и вы хотите считать mean absolute deviation, узнайте плюсы и минусы того и другого

  • Не бойтесь возвращаться к уже «изученным» темам, т.к. иногда знания раскрываются в нелинейном порядке, как бы не старались авторы книг

К сожалению, уровень усилий нужный для того чтобы понять современную финансовую теорию колоссальный. И это при понимании того, что инфу вы будете черпать из академических источников, а весь финансовый мир — банки, фонды, итд. — они лет на 10 ускакали вперед академии. Обидно? Да, но я как пешка в этом большом и жестоком мире мало могу сделать… ну, с одной стороны мало. С другой, если учесть то что репликация в облаке у нас бесплатна, почему это я как индивид не могу обуздать финансовые рынки?

«Квантовая» (от quantitative finance — количественные финансы) сфера является совокупностью трех направлений: финансов, математики и программирования. Математика является основой, она применяется к финансам и, в конце концов, кто-то должен сесть за компьютер и запрограммировать все это безобразие. К сожалению, в отсутствии альтернатив, этот кто-то — тоже я. Я пробовал искать себе помощников в этом нелегком деле, но оказалось что даже люди с высшим математическим не обучены тем областям которые нужны. А учить их долго и сложно.

Если брать очень грубо, то вся разработка делится на 2 этапа: анализ и исполнение. На этапе анализа, вы, сидя в тапочках с кружкой чая у себя в офисе, анализируете свои данные на каком-нибудь сверхмощном железе. Естественно, сверхмощное железо на дороге не валяется, но мне, признаюсь, в очередной раз повезло: я, видите ли, не увольнялся из своего универа после ухода (а зачем?), а мой универ часть консорциума, которому принадлежит 2й по размеру кластер в Англии. Что как бы хорошо, потому что студенты и профессора — бездари, которые не умеют пользоваться даже «классическими» ресурсами кластера, не говоря уже про всякие аппаратные ускорители которыми он тоже хорошо напичкан. А я умею. Так что это большой плюс.

Вторая сторона медали — исполнение — подразумевает собственно написание торговых роботов которые используют ваши алгоритмы и торгуют либо на тестовых счетах (что не возбраняется, т.к. никакие синтетические тесты не подготовят вас полностью к реальному трэшу рыночных АПИ), либо же на живых счетах с реальными деньгами. Не стоило бы говорить про то, что на живых счетах ошибки фатальны, но когда у нас даже именитые трейдерские конторы порой пересекают по ошибке биды и аски, буквально раздавая деньги всем направо и налево, не грех об этом лишний раз упомянуть.

Естественно, всем этим имеет смысл заниматься если играть по-крупному. Если ваш удел «делать соточку» (а я это стремление уважаю), то можно заниматься видеокурсами, стоковой фотографией, стримить игры в ютубах, и все вот это. Это все хорошие, веселые хобби и лично мне просто по кайфу все это. Но если есть желание куда-то расти, то алготрейдинг — это вполне себе актуальная область с достаточно большими рамками ликвидности (зависит от рынка, конечно) и — главное — огромной технологической составляющей, что должно радовать гиков.

Алготрейдинг привлекает меня тем, что я почти никого не кормлю. Да, я подкармливаю биржу и маркетмейкеров, но это не те проценты! Udemy у вас возьмет 50% дохода, PS или же, например, издатель книг — все 80% (ну, я попробовал и self-publishing, только что-то никто не берет). Вообще мне алготрейдинг больше подходит по идеологическим соображениям, т.к. мне крайне не нравится навязанная модель что я обязательно должен кому-то приносить пользу. 😀 Никому я ничего не должен! И в трейдинге весь код который я пишу, я пишу для себя, с моими стандартами качества и косяками, под мою, заранее известную, инфраструктуру.

Самое же классное в алготрейдинге то, что у тебя другие ограничения. Конечно, торгуя крупными лотами ты сам влияешь на рынок (а это влияние спрогнозировать очень сложно), конечно есть ограничения по ликвидности, но масштабы рынка не сравнимы с той лужицей ликвидности мейнстримовых занятий вроде ИТ. Это просто небо и земля. И соответственно для человека вроде меня, для которого реальный сектор как вампиру в церковь войти, меня вся эта идея управлять торговыми ботами привлекает намного больше.

Теперь-то вы, мои дорогие читатели, поняли почему я затеял весь этот эпос у себя в блоге. Суть всего этого в том, чтобы не только идеологически толкнуть вас в направлении финансовой независимости (думаю все образованные люди понимают что это the only way), но также рассказать про финансы и рынки. Так что до скорой встречи! ■

Written by Dmitri

3 декабря 2018 at 10:47

Опубликовано в Algotrading

Tagged with ,

Как я выбрался из порочного круга

17 комментариев

Поскольку мы постепенно двигаемся к развязке всей этой истории, я решил посветить эту часть моего повествования моей работе в JetBrains (месте где я провел 5½ лет). JetBrains, для тех кто почему-то не знает, это компания, которую подняли три разработчика из России. Компания занимается производством инструментария для разработки, в т.ч. IDE, тулы командной работы, и даже собственный язык программирования!

Тут будет рассказ про то как я там работал и как я оттуда ушел и что я вообще обо всем этом думаю.

Для начала следует пояснить, что попал я туда очень… странно. Вся история достаточно странная и не очень укладывается. Дело было так: сидел я 2½ года дома и искал работу, но ничего не получалось. И вот, пошел я как-то в одно агенство искать работу — кстати, в то агенство которое мне нашло, собственно, мою первую в РФ работу (так что посыл уже нехороший). Сунулся к ним, они предложили сходить отсобеседоваться в некую достаточно стремную немецкую контору, ооочень сильно смахивующую на тот процессконтрол, который я попал несколькими годами ранее.

Это отдельная история, причем забавная. Контора куда меня послали находилась в заводе ЛОМО (Ленинградское Опто-Механическое Объединение), большом страшном здании которое, как и всю бывшую в СССР индустрию, распилили и раздали арендаторам. Само местоположения работы делало все это невозможным, т.к. ездить каждый день в Старую Деревню не имея машины (а ЗСД вроде бы в том направлении еще не было) мне не представлялось возможным, но, я решил сходить чисто из спортивного интереса интереса.

И это был провал. Это был провал запредельных масштабов. По каким-то причинам, я пришел туда после праздника, который был днем ранее, и на котором был алкоголь. Я не выспался, простоял час в метро, был под стрессом, собачки возле здания тоже доставили (тогда я ездил без оружия, о чем жалею, сейчас я блохастых раскидываю на ура). Охрана попытавшаяся забрать мой паспорт на входе тоже не порадовала — если перед собеседованием у вас пытаются забрать паспорт, поверьте, работать там не в ваших интересах.

Сама контора, филиал немецкой продуктовой фирмы, которая делала машины для подсчета денег. Единственное что думалось мне в тот момент: я хотел бы иметь машину чтобы считать свои горы денег. Всё. Но вот, начинается собеседование, мне задают вопросы, простые очевидные вопросы вроде «что такое .NET», а мой мозг просто берет и посылает меня нафиг. Полностью. Я не могу ответить ни на что. Такое впечатление, что на совокупность стрессоров, мое сознание просто ответило: нет, дружок, не сегодня, иди отдхони пожалуй.

Это был позор. Я думаю что те люди кто меня собеседовал тоже прифигели: человек вроде MVP, постит дофига интересного, подкаст, юзергруппа, и тут… но поделом, хорого что мне туда не светило, там были те же CMMI и прочие дурные запахи плохого кодинга и низких зарплат.

Связавшись снова с КА, а честно сказал им что «не судьба» и попросил их найти что-нибудь еще. Они сказали что да, вот тут есть контора, JetBrains называется, мы твое резюме зашлем. И пропали — я от них больше ничего никогда не услышал. Зато появился сам JetBrains.

Когда я пришел на собеседование в JB, в руках у кадровички (как-то невежливо звучит… от сотрудника отдела кадров компании, вот, сорян) было вовсе не то резюме которое должно было послать КА, а другое, которое я посылал сам в JB двумя годами ранее и которое было просто проигнорировано. Что это было? Думаю вы догадываетесь: КА послало мое фактическое резюме в контору, получило это свое «нам не интересно», а мня все-таки позвали т.к. все контакты были на моем CV которое уже было там. Этично ли такое поведение со стороны нанимателя? Это вам решать, но премия ускользнула из рук КА в этом случае, это точно.

Как я уже говорил, JB дал мне минимально возможную для сотрудника зарплату, но на самом деле нет. На самом деле я, как человек, который любит ломать комедию и даже в критическом положении понимал что нужно свой кусочек хлеба отгрызть, честно сказал: ребята, все супер, только я это, резидент Англии, а у вас офис в Чехии, давайте это, как-то, контрактинг и все такое. JB согласился. А когда такая пьянка пошла, мне пришло письмо, в котором меня попросили посчитать, сколько же нужно мне платить чтобы gross чтобы net был такой, как мне обещали. И вот тут стало совсем весело… думаю вы все уже догадались что я сделал.

Теперь, пожалуй, самое важное, для тех кто хочет там работать: JB обалденный работодатель и я глубоко им благодарен. Без них, я бы не сделал первый шаг на пути в нормальным деньгам и нормальной жизни. Интересные задачи, нормальные коллеги, отсутствие процессов и драмы на работе, бесплатная еда, спортзал, полеты бизнес-классом над Атлантикой — все это было прекрасно. Точнее было бы прекрасно если бы мне было лет 20 и у меня не было ребенка и более четкого понимания что все это золотая клетка и что активный доход — это вообще адъ. Но если вам 20 с хвостиком, JB — почти идеальное место работы. Я сам привел в компанию 2 человека и вижу, что их прет от работы там… и это хорошо!

При этом, нельзя сказать, что JB это тотальный идеал. Действительно, в большинстве продуктовых команд хорошо и можно много творить. Деньги вы можете посмотреть на Glassdoor, они, как бы сказать, даже по индустрии середнячок, и я не думаю что кто-то из девелоперов делает там «соточку» (а для меня это критерий, увы). Спектр задач узко специализирует вас в область алгоритмов что, с одной стороны, хорошо, с другой ограничивает вас в плане применения, например, real-life фреймворков. Мне в то время было с высокой башни и на то, и на то, и как я уже говорил, все мысли были о том как все это переиграть в свою пользу. Инфраструктура у JB была откровенно так себе — как я уже писал, я работал на достаточно плохом железе, на серверах где работали всякие CI системы тоже все «не подарок». Офисные реалии до переезда были так себе, читайте мой эпос про рестораны в предыдущих частях повествования.

Чтобы понять, как отжать себе маленький кусочек рая, я задал простой вопрос: если в JB так офигенно, то куда же уходят люди? Оказалось, что программисты если оттуда и уходят, то идут в именитые конторы вроде Microsoft или Google. Депрессирует ли это меня? Да, пожалуй. Во-первых, потому, что хоть зарплаты в этих местах и в разы больше, чем в JetBrains (это не должно удивлять), но корпоративная культура в этих энтерпрайзах… это что-то с чем-то. Microsoft, когда я ходил к ним в гости по работе — это просто бизнес, ребята в костюмах, разные отделы которые друг друга ненавидят, куча внутренней конкуренции и, самое главное, эта ситуация «лебедь, рак и щука» когда компания даже имея классные продукты (Нокия итд.) умудряется продалбывать целые сегменты рынка. Ну или Синофский который пытался убить дотнет… все эти истории плохо пахнут. Да, посмотрите на сегодняшний день, что у компании с ее главной ОСью? Да ничего. Все так же уныло и безыдейно, а в приоритетах уже только Azure.

Про другие конторы вроде Гугла (чего стоит внутреннее видео где сотрудники плачут после выборов бога-императора Трампа) у меня примерно такое же мнение: как только ты видишь в лексиконе компании такие слова как diversity, читать уже не стоит, т.к. белых гетеромужчин там очевидно угнетают (гребаные расисты-гетеросексисты!). А гугол как раз отличился 50-ю оттенками толерастии, так что я бы туда не пошел чисто по политическим соображениям. Примечательно что технический директор JetBrains ушел программистом именно в гугл… программистом, а не менеджером или руководителем продукта! Он потом вернулся, но… этот факт многое говорит о положении JB в табели о рангах ИТ индустрии. Покажите мне еще компанию, где техдир уходит на позицию кодера!

Короче, посмотрев на это, я все понял: какого-то прогресса ребята, уходящие из JB, не нашли, это не «качественный скачок» а просто развитие карьеры, где ты уезжаешь в долину на «сытные» для обычного айтишника 200к в год (налоги и конские траты можете посчитать самостоятельно). Только один человек из тех что я знаю стал исключением, и про него мы вскользь поговорим, но не сегодня. Сегодня у нас обсуждение того куда уходят люди из JB.

Нужно понимать, что я, работая в JB, не работал в JB. У меня даже в контракте было написано «не сотрудник», поэтому я не имел некоторых плюшек вроде медстраховки (до сих пор нет, сорян), но, с другой стороны, я имел плюшку в том, что будучи приписан к Пражскому офису, я был лишен всей бюрократии связанной с РФ. И это было хорошо, т.к. в Европе бизнес делается намного проще: все очень неформально и «был ли мальчик», этого тоже никто не узнает.

Команда евангелизма внутри JB — это вообще как отдельная компания. Там только иностранцы (в РФ мало у кого есть свободный инглиш, а тем у кого есть — мой респект и уважуха, вы крутые!), поэтому у нас в основном были люди из США, Британии и стран Европы где с английским лучше чем в Окоянной. Нельзя сказать что у них у всех идеальный английский, но но достаточно хорош чтобы рассказывать и делать видосики, писать статьи и все в этом духе. Как люди они… вменяемые. Серьезно, команда евангелизма это команда абсолютно адекватных людей, с похожими на мои взгляды на жизнь. Так же как и основной (программистский) состав JB, в евангелизме не любят буллшит и непрофессионализм, и все люди стараются чтобы «было хорошо».

В целом, все евангелисты были старше меня. И я, опять же, задал себе вопрос: вот эти ребята иногда уходят (текучка в евангелизме намного больше чем в основном JB, сюрприз!), а куда они уходят-то? Ведь явно куда-то где лучше, где больше бабла, они же не настолько наивны чтобы менять работу «идейно», у них дома, машины, семьи, яхты и вся эта кухня, за все это надо платить. И вот тут я кажется выиграл свой первый джэкпот.

Одного из наших евангелистов звали John Lindquist. Был он у нас недолго, а ушел потому, что сделал немало приносящий проект egghead.io — сайт с видосиками по разным веб технологиям вроде Node.js. Вся эта тема с курсами меня заинтриговала: я конечно не верил что там какие-то золотые горы, но знал что есть по крайней мере одна контора, Pluralsight, которая платит авторам чтобы они что-то там для нее писали.

Все мои попытки «питчить» курсы в Pluralsight были неуспешны: мне просто не отвечали. А потом я заметил что еще у одного автора, James Kovacs, который тоже какое-то время работал в JB (а потом ушел и вообще исчез куда-то), есть там какие-то курсы, и я просто попросил его пробросить контакт. И вот тут мне уже ответили, я предложил курс (по MATLAB), мне его зааппрувили и… предложили $4k за производство курса!

Я, если честно, прифигел. Жил я в то время небогато, а тут контора давала 4 тысячи за производство 3-5 часов видеоконтента, плюс еще давала после этого процент с просмотра этого же контента. Я подумал, что даже если делать по курсу в месяц, лишние 4к в месяц будет ой как неплохо, а если еще и пассив какой-то будет капать, то вообще хорошо!

Я написал несколько курсов, но один из курсов чего-то не задался: писал я его долго, Pluralsight были в раздумье то ли я им сделал что они хотели, достаточно ли он отличается от того что у них уже есть. И так далее. Но потом курс все-таки выпустили и он начал приносить, эмм, около $4k пассива!!!

Тут я сильно прифигел, так что прям задумался. Одно дело активный доход, а тут тебе такая же сумма сама в месяц падает, пиши-не пиши. Мне это как бы все понравилось и я взял и написал для Pluralsight еще много курсов на интересные технические темы. И сам обучился, и денег поднял еще больше, как на единовременных выплатах так и на роялти, которые со временем только росли.

На тот момент, работать евангелистом, при моем отвращении к поездкам и социуму, уже было как-то совсем глупо: деньги от этого евангелизирования не делали никакой погоды вообще (дошло даже до того, что я забыл подать инвойс на несколько тысяч и спохватился только несколькими месяцами спустя… мне было пофиг), меня это все только отвлекало. Я продложил писать курсы для Pluralsight и одновременно попробовал написать что-то для другой площадки, Udemy. И что вы думаете: за один год работы (один suka год!!!) мой график выглядел вот так:

$20k пассива… вы только вдумайтесь, у нас пиковая зарплата разработчика это $5k (и эта сумма не растет уже лет 10!), больше этого платят мало кому, вакансий таких практически нет, и даже если ты и получишь больше, тебе нужно за эти деньги работать… Вообщем, если сложить это и то что я делал на Pluralsight, ну, по идее все это повествование можно закрывать, т.к. на такие деньги уже можно как-то худо-бедно жить, кушать в ресторанах (ну, не всегда с мишленовскими звездами), и заниматься персональными проектами. Можно даже купить себе что-нибудь, например… первую в жизни машину!

Весь мой эпос по идее должен закончиться на этой ноте как на «грани возможного», и так бы и было, не познакомься я в JB, будучи еще там, с одним разработчиком который, уволившись оттуда, не пошел работать по найму, а решил делать свой собственный стартап. Но это — тема для другого разговора. А сейчас, я лишь скажу что я не жалею что провел более 5 лет в JetBrains. Если у вас есть шанс идти туда работать — идите, т.к. по РФ в плане кодинга трудно найти что-то лучше. ■

Written by Dmitri

27 ноября 2018 at 19:26

Опубликовано в Career

Tagged with

Мой опыт наемной работы

9 комментариев

В предыдущих двух постах я не объяснил, откуда у меня такой цинизм и эгоизм. Но теперь-то вы все узнаете. Это конечно совокупность многих факторов, но основной такой: я на 2½ года остался без работы с маленьким ребенком. Дело было вот как…

После ухода из той не особо веселой конторы, я пошел работать на зарплату в 3 (три!) раза больше в один крупный аутсорсер. Пошел работать ПМом т.к. в тот момент я именно в этой сфере имел скиллы. И все бы хорошо, но тот аутсорсер был сильно завязан на фин заказчиков, а то был 2008 год — год как раз когда subprime mortgage crisis, провалы по CDO и каскадный эффект по всем тем рынкам. Просидев 3 месяца в «айдле», аутсорсер попросил меня на выход при этом, правда, дав еще лишние 3 месяца оклада. Это было немного необычно что контора так «благородно» поступила, но 3 месяца моей, даже немаленькой, зарплаты рассосались очень быстро. В то время у меня было много трат вроде, например, самовозгоревшегося холодильника (не шучу!) который нужно было заменить.

Я, естественно, пытался найти работу. Всеми силами. Но рынок остыл настолько, что ничего внятного на нем не было. Зато были четкие пацанчики, которые хотели ПМа на зарплату которая у меня была несколькими месяцами ранее, были очень стремные конторы с трубчатыми мониторами в полуразваленных заводах. Было очень много курьезных историй на которые ушло более 2-х лет моей жизни, в т.ч. попытки найти работу в Швеции (нуль результата), очень много странных предложений от не менее странных контор (в основном с элементами дэмпинга), и все в этом духе.

За 2 года, мой менталитет переформатировался чуть более чем полностью. Если ранее я верил в какое-то развитие карьеры, то сейчас я уже не верил ни во что. Я был на 100% уверен что сама идея карьеры ошибочна, провальна, что я вообще не хочу быть в одной реальности с этими людьми. Я четко понимал что даже попав снова в игру, я буду в ней фальшивым игроком. Да, у меня будут те же ужимки и прыжки, но все это будет фальш и очковтирательство, а по факту я буду просто пилить свою линию, тянуть одеяло на себя, и пусть оно все горит огнем.

Теперь вы знаете почему. Когда, после перерыва, я получил работу в крупной и именитой продуктовой компании, все как бы снова вернулось на круги своя, вплоть до того что я вернулся в то же здание, где и начинал работать когда приехал в СПб. Вот как судьба! Я искренне верю, что если бы я хотел, я бы мог сделать полноценную карьеру разработчика, может даже дорасти до лида какого-то продукта. Но мой мозг был уже отравлен другими идеями, и как я рад что я никакой карьеры я не сделал! Это бы было предательством самому себе, очередная капитуляция перед рынком, который оказался сильнее тебя.

Выйдя снова на работу на ооочень скромные деньги («у нас все начинают с такой зарплаты»), мой мозг был порабощен крамольными идеями чуть более чем полностью. Работал ли я? Да, я помню что я что-то делал, но первый год, пока я еще был в офисе (всего я проработал 5½ лет), я постоянно думал о чем угодно, только не о работе. У меня была, по сути, одна цель: выйти из игры, выйти быстро, чем быстрее тем лучше. О таких вещах как «Канары» я тогда не знал, я просто хотел независимости от системы чтобы когда случится новый 2008 год (а для России он действительно случился в 2014-16!) у меня был хоть какой-то буфер, и всячески искал пути. Конечно, я нашел то что искал, но не будем торопиться! Надо же растянуть рассказ на несколько постов.

В какой-то момент, после года работы, я по лютой ошибке допустил локальный кризис, который вылился в мои побегушки по Стокгольмским лесам со шведскими полицейскими (про это когда-нибудь тоже будет рассказ). Под шумок этого кризиса (конечно, об этом по факту никто не знал), я предложил начальству в конторе отпустить меня в свободное плавание. Решение было принято за день, и вот, я был свободен от офиса навсегда! Офис мне совсем не нравился — плохое компьютерное оборудование, неидеальный климат-контроль (как всегда, хехе), плохая еда в столовой, езда по 45мин туда-назад, все это совсем не радовало, так что я в один момент ушел и забыл обо всем этом. Да, про еду вообще можно писать отдельный рассказ: в то время собственной столовой у компании не было, а столовая в БЦ была «так себе», так что мы с моей 2й половиной начали ходить сначала в столовую Microsoft (у них-то был БЦ класса «А» и ресторан с пивоварней), а потом ситуация как-то вообще ушла из под контроля потому что мы стали ходить в дорогой ресторан «Рыба», что начало выливаться в ланчи длиной в час а также употреблением вина (!) что выбивало из колеи так, что вернувшись в офис, работалось очень плохо. Это было очень странное время. А я всего лишь хотел нормально питаться, черт возьми!!!

После ухода на удаленку, работа практически перестала существовать. Если она занимала 1 час в день — это было нормально. Единственное, что действительно напрягало, так это поездки на всякие конференции: сначало это было весело, но когда ты делаешь это постоянно, начинается какое-то бурление другой, новой ненависти. Плюс, в какой-то период я много ездил по России. Россия, для тех кто не в теме, это не страна для покатушек. Это где-то от «некомфортно» до «опасно», и я никому не советую заниматься евангелизмом по РФ. Просто не стоит оно того. Природа в РФ не красивая, а бурелом и дебри, а люди, условия… ну не предназначена Окоянная для туризма, увы. Она предназначена для разбитых судеб, для страданий, для падения духом, для эмиграции в теплые и красивые страны, в конце концов. Но не для sightseeing.

Так вот, оставшись снова наедине с собой и своими мыслями, какое-то время действительного ничего интересного не происходило. Ребенок рос, а я, даже на скромную по тем меркам зарплату, решал какие-то банальные, бытовые, проблемы но ни о каком креативе или финансовом прогрессе не могло быть и речи. Но и нагрузки тоже не было от слова совсем, что давало полную свободу передвижений. В принципе, так можно было бы жить вечно и те мои коллеги кто остались в евангелизме — они вероятно так и живут, и в этом нет ничего ужасного, если скромный достаток и предсказуемость вас устраивает.

Не то чтобы все в жизни было так гладко. Во-первых, у меня пока я работал в офисе все еще оставались различные проблемы со здоровьем, в т.ч. загнание себя в стресс, отравления, адовые проблемы с зубами («двойная доза анастетика» для меня была практически нормой) — подозреваю что из-за Питерской воды, т.к. мы не сразу начали заказывать воду. Но это еще полбеды — из офиса-то я ушел, так что эти проблемы отчасти решились сами собой. Что меня начало выбешивать чуть более чем полностью это дальние поездки, причем выбешивало все — и перелеты когда я в лаунже выпивал целую бутылку (!) красного вина просто для того чтобы не помнить полет, и однообразные отели, и нежелание вообще никого видеть или слышать в новых местах. У меня развилась тотальная социальная апатия, в перерывах между конференционнымми днями я порой запирался в отеле и ел суши (и тут, даже тут я удивился травануться, причем настолько что пришлось экстренно бежать к коллеге за антигистаминными!), я просто не хочел ничего видеть и слышать, я даже там был поглощен какими-то своими идеями.

Отдельной статьей можно выделить полеты в Штаты. В таких полетах очень сложно мониторить свои сервисы и боты, но главное что я помню — это острое желание вернуться назад в самолет, где кровать, вкусное вино, можно посмотреть фильм и уснуть, чтобы подождать, когда же все это закончится. Прилетев в Штаты, я оставлял свой график «как есть». Я ложился спать в 7 вечера, вставал в 4 утра и наслаждался тишиной. Желания побыть немного туристом у меня не было никакого, хотя иногда коллеги и затаскивали меня в рестораны или, например, на Алькатрас. В фоне у меня в голове была всегда только одна мысль: я хочу путешествовать только за свой счет, туда, куда я хочу и тогда, когда мне удобно. Большие города, посиделки в инвестбанках и прочих интерпрайзах, конференции и визиты в МС — это то чего мне хотелось меньше всего.

Постепенно, за все эти годы поездки по конфам и общения с разработчиками, я понял что я не хочу видеть и слышать никого и ничего, я не хочу ни с кем общаться вообще. Почему? Потому что у нас нет общего языка. Можно подумать что айтишники все одинаковые, но на самом деле нет: большинство людей предпочитают обыденные вещи. Никому не сдались мои дискуссии про аппаратные ускорители или FusionIO потому что у людей нет ни денег ни желания что-то в этой сфере делать. Никому толком не нужны новые ЯП, метапрограммирование, кодогенерация, боты которые собирают и обрабатывают данные в Biztalk. Даже мои более «гиковые» наклонности вроде D&D или M:tG обсуждать не с кем.

Касательно социалочки, it’s not you, it’s me. То есть проблемы скорее во мне чем в вас. Мне прекрасно живется «как есть», и я склонен думать, что один из показателей эмоциональной зрелости — это когда вы можете просто быть наедине с собой и найти в жизни мотивацию делать что-то, что не связано с другими людьми. Да, иногда я пытаюсь помочь другим людям, по возможности, толкать именно ту идиологическую линию эгоцентризма, которая описана в этих постах, но мотивирует это мое желание «другого уровня счастья» для других людей которые, я верю, вполне могут его достичь.

Еще раз повторюсь: я мог бы залипнуть в этой посредтвенности надолго. 5½ лет это огромный срок, но некоторые люди работают на одной работе десятилетиями в отсутствии альтернатив. Разве что переезжают в филиал той же компании в другой стране где, с одной стороны должно быть лучше жить, а с другой они продолжают получать все те же нищенские деньги, на которые даже жилье не купить.

Для того чтобы понять, где еда слаще а трава зеленее нужно смотреть на то, куда люди уходят. Ведь они уходят в лучшие места, не так ли? Об этом как раз и будет следующий пост. ■

Written by Dmitri

22 ноября 2018 at 1:08

Опубликовано в Career