План самообучения для желающих самостоятельно освоить профессию количественного (квантового)[1] разработчика (Quantitative Developer). От перечня прокомментированных базовых знаний - до подачи заявки на вакансию Quantitative Developer в количественной фирме. Каждый раздел подкреплен списком полезных книг с аннотациями. Адаптированный перевод[2] статьи “Self-Study Plan for Becoming a Quantitative Developer”.
Содержание:
- Предисловие переводчика. Яков Зельдович, Гейтс и Цукерберг с01
- Введение с02
- Компьютерные науки / Информатика (Scientific Computing) с03
- Навыки программирования с04
- Э. Кениг и Б. Му “Ускоренный C++” с06
- С. Мейерс “Эффективный C++” с07
- С. Мейерс “Более эффективный C++” и “Эффективный STL” с08
- М. Лутц “Изучая Python” с10
- М. Лутц “Программирование на Python” с11
- У. МакКини “Python для анализа данных” с12
- С. МакКоннелл “Полный код” и Р. Мартин “Чистый код” с14
- Э. Гамма и др. “Шаблоны проектирования” с15
- С. Чакон и Б. Штрауб “Pro Git” с16
- П. Дюваль и др. “Непрерывная интеграция” с17
- А. Бьюли “Изучение SQL” и Э. Молинаро “Поваренная книга” SQL” с19
- Б. Шварц и др. “Высокопроизводительный MySQL” и Чарльз Белл и др. “Высокая доступность MySQL” с20
- Финансы и числовые алгоритмы (Finance and Numerical Algorithms) с21
- Подача заявки на вакансию количественного разработчика с22
- Примечания c23
- Список источников с24
- Используемые сокращения с25
Ценность образования не в том, чтобы выучить как можно больше фактов.
А в том, чтобы натренировать мозг думать.
Альберт Эйнштейн
Предисловие переводчика. Яков Зельдович, Гейтс и Цукерберг
Предлагаемый материал - попытка автора дать советы по самообразованию тем, кто хочет попробовать себя в качестве количественного разработчика. Представлена американская точка зрения, но публикация носит вполне интернациональный характер и будет актуальна, в том числе, для российского пользователя.
Не думаю, что вообще нулевой человек в области математики, статистики и программировании имеет здесь какие-либо шансы. Об этом не раз говорит и сам финансовый райтер от Quantstart. Какую-то базу необходимо-таки иметь. Идеально - физфак или матфак хорошего универа или политеха.
Но и гуманитариям не стоит отчаиваться. Главное - склонность и настойчивость в овладении знаниями. Жизнь полна удивительными историями.
Советский физик Я́ков Борисович Зельдо́вич (1914-1987).
Доктор физико-математических наук, профессор, академик АН СССР. Три звезды Героя соцтруда, Ленинская и четыре (!) Сталинских премии. Принимал активное участие в советских военных ядерных проектах - атомная (1949) и водородная бомбы (1953).
Так вот, у Я.Б. Зельдовича не было законченного высшего образования. Учился экстерном в Ленинградском университете и посещал лекции (не более) в Ленинградском политехе. Никаких дипломов об окончании ВУЗа.
Я.Б. Зельдович
(Википедия)
Что помогло Якову Борисовичу достигнуть столь неслыханных высот в физике (включая теоретическое направление)?
Самообразование.
<Вставка переводчика>[3]
Википедия содержит формальную трактовку даже такого, казалось бы очевидного термина:
“Самообразование - образование, при котором знания, умения и навыки приобретаются самостоятельно, без помощи обучающих лиц. Человека, занимающегося самообразованием, называют самоучкой”.
К самоучкам можно отнести отца Microsoft Билла Гейтса, отчисленного из Гарварда после, всего лишь, двух лет учебы. Б. Гейтс, конечно, не большой ученый, но создать Microsoft Corporation без самообучения, он вряд ли смог бы.
Билл Гейтс в 2018 г.
(Википедия)
Отец FaceBook Марк Цукерберг тоже выдержал в Гарварде только два года.
Поэтому - дерзайте.
Портал Rusforexclub уделяет особое внимание ликбезу в сфере точных наук, прежде всего, по математике и статистике, а также по смежным дисциплинам. Полтора десятка статей в категории “Финансовая математика” плюс ряд текстов (или их отдельные разделы), размещенные в других рубриках сайта:
- “Облигация – понятие, виды, математика”;
- ”Топ-пятерка книг по алготрейдингу”;
- “Ренессанс” Джеймса Саймонса. Квантовый подход (часть I и часть II);
- “Two Sigma Investments”.
Переводы-рерайты статей портала Quantstart (источника исходного материала) смотрите по ссылкам:
- Тактическое распределение активов (TAA). Систематический подход
- Систематический трейдинг. Простые или сложные торговые стратегии - что лучше?
- Основы математики для алготрейдера, версия Quantstart. Скаляры, векторы, матрицы и тензоры
<Изложение по тексту - от первого лица>
Я получаю много писем от людей, желающих сменить карьеру, от инженеров, преподавателей и программистов. В последнее время количественные финансы стали весьма привлекательным направлением из-за сочетания интеллектуального труда и высокой зарплаты/дохода. <Что, увы, бывает крайне редко, согласитесь>.
В письмах часто звучит вопрос: “Что надо знать, чтобы получить место в квантовой фирме?” Мы обсудим план обучения, дающий приличные шансы при собеседовании на вакансию количественного разработчика.
Карьера в области количественных финансов требует скорее обобщения, чем узкой специализации. Это в полной мере относится и к профессии Quantitative Developer.
Он должен вписаться в команду трейдеров, финансовых инженеров и IT-специалистов, помогая инвестбанкам создавать и продавать новые структурированные инвестиционные продукты или давая возможность фондам развивать торговую инфраструктуру и системы управления портфелем.
Компьютерные науки / Информатика (Scientific Computing)
Самый распространенный путь в квантовой карьере - высшее образование по информатике. Профессионализм количественного разработчика основан на навыках программирования и реализации числовых алгоритмов. Этим опытом обладают не только программисты, но и традиционные математики, физики и даже инженеры, окончившие современные ВУЗы.
Имея актуальную базовую инженерно-техническую и, тем более, физико-математическую подготовку, разобраться с конкретными количественными продуктами и алгоритмами будет не очень сложно. Конечно, если вы не пренебрегали курсами информатики и/или прикладной математики.
Когда ваши знания далеки от компьютерных дисциплин, задача стать квантовым разработчиком несколько усложняется, но не становится безнадежной. Одна из целей данной статьи - показать выход и в таких ситуациях.
В первую очередь, количественный разработчик - это разработчик программного обеспечения (Software Developer).
Опыт в написании, тестировании и отладки софта - ключевой момент.
По языкам программирования имеем приблизительно следующую диспозицию.
Для инвестбанка главные используемые языки - C++, Java или C# в среде Microsoft/Windows.
Для хедж-фондов обычно требуется перевод MatLab или R на C++ и/или Python. Фонды меньше задействуют Java и C#, поскольку часто работают в среде UNIX, где C++ и Python более приемлемы.
Для ощутимого продвижения нет нужды одинаково хорошо разбираться во всех перечисленных направлениях. Вы сильны в чем-то одном - сделайте это своим конкурентным преимуществом. Так, обладая достойной квалификацией в Java, разумно ориентироваться на инвестиционный банк.
На чем же остановить выбор, если все упомянутые программные языки и среды знакомы одинаково неглубоко, но вы обладаете базовыми навыками писателя скриптов?
Я бы предложил углубиться в C++ и Python. Овладев ими, вы станете максимально полезными для индустрии количественных финансов. Ниже предложены по три книги, которые окажут существенную помощь в изучении или совершенствовании знаний по этим языкам.
<Вставка переводчика>
Для поддержания формата текста приведем краткие определения C++ и Python из Википедии, но без толкования используемых в них терминов. Все подробности читатель может найти, пройдя по ссылкам профильных статей Википедии из списка источников в конце материала.
“C++ - компилируемый, статически типизированный язык программирования общего назначения”.
Возник C++ еще в начале 1980-х. Создателем принято считать Бьёрна Страуструпа (Bjarne Stroustrup, д.р. 30.12.1950).
Бьёрн Страуструп в 2010 г.
(Википедия)
1. Эндрю Кениг (Andrew Koenig) и Барбара Му (Barbara Moo) “Ускоренный C++” (Accelerated C++)
Здесь и далее, дизайн обложек книг из Amazon.com, если не оговорено иное
Книга Э. Кенига <и Б. Му> знакомит с синтаксисом C++ и подробно расскажет об указателях и управлении памятью. То, с чем многие программисты (в том числе, из Java и C #) не очень хорошо знакомы. Большим подспорьем для практики в синтаксисе C++ станут примеры реализации с помощью Microsoft Visual Studio или компилятора GCC в Linux/UNIX.
2. Скотт Мейерс (Scott Meyers) “Эффективный C++” (Effective C++)
Советую прочитать С. Мейерса несколько раз. Он поднимет вас от уровня новичка в C++ до специалиста, готового к собеседованию. Пособие содержит достаточно сложные образцы задач, которые нелегко отрабатывать перед терминалом. Оптимальный способ усвоить “Эффективный C++” - понять, где именно она будет полезна в ваших собственных проектах и последовательно применять ее содержание.
3. Скотт Мейерс (Scott Meyers) “Более эффективный C++” (More effective C++) и “Эффективный STL” (Effective STL)
Для тех, кто хочет выйти за рамки первых двух книжек рекомендую еще пару монографий Скотта Мейерса: <уже> "Более эффективный C++” и “Эффективный STL”[5]. Далее - изучение библиотеки Boost, многопоточного (multithreaded) программирования и основ операционной системы Linux.
Как только все останется позади - считайте себя не просто хорошим программистом. Вы - настоящий эксперт!
<Вставка переводчика>
Из Википедии:
“Python - высокоуровневый язык программирования общего назначения с динамической строгой типизацией и автоматическим управлением памятью”.
Создание Python относят к тем же 1980-ым, первую реализацию к 1989 году. С C++ Python роднит не только период появления, но и географическая принадлежность его изобретателя Гвидо ван Россума (Guido van Rossum, д.р. 31.01.1956). Он выходец из другой страны Северной Европы, из Нидерландов.
Гвидо ван Россум в 2006 г.
(Википедия)
1. Марк Лутц (Mark Lutz) “Изучая Python” (Learning Python)
Книга будет полезна тем, кто уже продвинулся в C++/Java/C #. Особый интерес представляют главы 4-9, где обсуждаются встроенные типы Python (Python's built in types). В главах 10-13 читатель найдет синтаксис Python для ветвлений и циклов. Главы 14-20 отнимут несколько больше времени для понимания. В них даются специфические возможности Python - итерации и расширенные функции. Разделы V и VI посвящены пространствам имен (namespacing), объектно-ориентированному программированию и отличиям Python от C ++/Java.
Для того, чтобы хорошо разбираться в Python, следует прочитать <и проработать> все издание. Однако помните, что в нем свыше 1000 страниц!
2. Марк Лутц (Mark Lutz) “Программирование на Python” (Programming Python)
Вторая книга Марка Лутца освещает применение синтаксиса Python при написании приложений. Освоив пособие, вы существенно поднимете уровень квалификации на Python.
3. Уэс МакКини (Wes McKinney) “Python для анализа данных” (Python for Data Analysis)
Алгоритмический трейдинг построен, во многом, на анализе данных (Data Analysis). Python неплохо справляется с такими задачами. Монография У. МакКини охватывает ряд новых доступных библиотек, в том числе SciPy и pandas.
Штудирование приведенных пособий даст достойные шансы на интервью по C++ или Python. Практические навыки закрепляются, в основном, в “боевых условиях”.
Программная инженерия (Software Engineering)
Хороший кандидат на должность количественного разработчика должен сочетать мастерство программиста (Programmer) и опыт разработчика программного обеспечения (Software Developer). <Автор проводит различие между этими двумя профессиями, смотрите ниже>.
Программистом можно стать самостоятельно по учебникам, дополненным написанием скриптов. Но Software Developer предполагает работу над солидными проектами и (что важно) - в команде других разработчиков.
Это вовсе не значит, что самообучение в области разработки программного обеспечения совершенно невозможно. На помощь приходит удаленное сотрудничество.
Сейчас легко вносить свой вклад в программное обеспечение с открытым исходным кодом через Интернет. Одно из ярких публичных явлений в количественном финансировании - QuantLib project. Чтение (части) его исходного кода дает неплохое представление о том, как пишутся крупномасштабные вещи на C ++.
Специалист в разработке программного обеспечения обязан знать как создаются объемные программные модули. Подобные процессы требуют контроля версий, непрерывной интеграции и иных гибких методов.
Дальше приводится список книг, которые будут полезны для понимания и усвоения этих понятий.
1. Стив МакКоннелл (Steve McConnell) “Полный код” (Code Complete) и Роберт Мартин (Robert C. Martin) “Чистый код” (Clean Code)
Прочтите “Полный код” Стива МакКоннелла и “Чистый код” Роберта Мартина. Оба источника заставят серьезно переосмыслить ваши подходы к разработке программного обеспечения, начиная с самого фундамента. Например, сколько времени уходит на предварительный этап подготовки ПО, прежде, чем вы прикоснетесь к клавиатуре.
Оба пособия сэкономят часы, впустую потраченные на написание кода. Я бы рекомендовал применять как можно больше советов от С. МакКоннелла Р. Мартина на практике, чтобы избавиться от “вредных привычек”. Их материал пригодится и на собеседовании, где всегда просят воспроизвести код.
2. Эрик Гамма (Erich Gamma) и др. (еще три автора) “Шаблоны проектирования” (Design Patterns)
Процедура создания качественного программного обеспечения была бы неполной без упоминания о “Шаблонах проектирования”, известных также как книга «Банды четырех», <коллектива из четырех авторов>. В большей степени она актуальна для C++, в меньшей - для Python.
Скорее всего, вы заметите, что используете в своем коде типовые конструкции. “Шаблоны проектирования” подскажут наиболее эффективный путь их применения. Искусство шаблонирования поднимет ваш престиж.
Пособие довольно трудное для самостоятельного изучения, попробуйте вначале выбрать и отточить мастерство на двух-трех популярных дизайнах, допустим, Factory, Decorator или Singleton. Далее - постепенно расширяйте круг задач.
3. Скотт Чакон (Scott Chacon) и Бен Штрауб (Ben Straub) “Pro Git”
(Git-scm.com)[4]
При работе в команде над крупномасштабными программными проектами критично необходимо ПО для контроля версий (Version Control Software). Автоматическое редактирование, откат, ветвление/слияние и улучшенные возможности тестирования - все для тотального контроля версий.
<Вставка переводчика>
Согласно “Pro Git”:
“Контроль версий - система, которая записывает изменения файла или набора файлов с течением времени, чтобы вы могли позже вспомнить <их> определенные версии”.
Два признанных инструмента в контроле версий - Git и Subversion (SVN).
Я бы посоветовал познакомиться с Git, так как SVN похож, но при этом немного сложнее в использовании, Многие заменяют свои SVN-репозитории на эквиваленты от Git.
4. Поль Дюваль (Paul M. Duvall) и др. “Непрерывная интеграция” (Continuous Integration)
Непрерывная интеграция (Continuous Integration, CI) - постоянное тестирование и развертывание кода с помощью полностью автоматизированной системы проверки и развертки.
Ядро механизма CI-системы можно освоить только на полноценном рабочем месте в офисе, но изучив книжку П. Дюваля, вы сможете произвести достойное впечатление на интервьюера познаниями в этой области.
Взаимодействие с базами данных (Database Interaction)
Помимо навыков программиста и разработчика ПО, будущий количественный разработчик должен уверенно ориентироваться в вопросах, связанных с хранением и анализом данных.
Если вы никогда не сталкивались с СУБД, лучший вариант - начать с системы управления реляционными базами данных (Relational Database Management Systems, RDBMS) и их языка структурированных запросов (Structured Query Language, SQL).
Общие RDBMS включают Microsoft SQL Server, Oracle и MySQL. К другим типам систем хранения данных относятся хранилища данных NoSQL, в том числе 10Gen's MongoDB and Cassandra.
Отличный способ изучать RDBMS - установить версию с бесплатным открытым исходным кодом и воспользоваться приведенной ниже литературой. Вы можете попробовать MySQL, активно применяемую в хедж-фондах. В банковском секторе будут преобладать SQL Server и Oracle.
Допустим, вы загрузили MySQL. Разобраться в предмете вам помогут следующие руководства.
1. Алан Бьюли (Alan Beaulieu) “Изучение SQL” (Learning SQL) и Энтони Молинаро (Anthony Molinaro) “Поваренная книга” SQL” (SQL Cookbook)
Если вы мало знакомы с SQL, “Изучение SQL” Алана Бьюли - именно то, что нужно. Пособие охватывает базовый и средний уровень SQL, необходимый для хранения, доступа и предоставления отчетов по данным. Затрагивается тема оптимизации базы данных. Том надо осилить до конца - весь материал актуален для количественного разработчика при повседневном общении с базами данных.
Для большей конкретики, рекомендую SQL Cookbook. Я нашел эту книгу невероятно полезной, когда работал в количественном анализе, и постоянно брал ее с полки для ответа на тот или иной вопрос. Не следует читать монографию от корки до корки, скорее, она подойдет, как справочник по SQL.
2. Барон Шварц (Baron Schwartz) и др. “Высокопроизводительный MySQL” (High Performance MySQL) и Чарльз Белл (Charles Bell) и др. “Высокая доступность[6] MySQL” (MySQL High Availability)
Количественные разработчики редко являются администраторами баз данных, однако если вы хотите узнать побольше о расширенной оптимизации MySQL, то указанные пособия станут хорошим подспорьем для расширения кругозора. Кроме того, они пригодятся при разрешении целого ряда проблем по базам данных.
<Приятно, что соавторами Б. Шварца в его “Высокопроизводительном MySQL” выступают наши соотечественники Петр Зайцев и Вадим Ткаченко>.
Финансы и числовые алгоритмы (Finance and Numerical Algorithms)
Поле применения усилий количественного разработчика - финансовые рынки. От базовых знаний их функционирования вам не уйти. Даже технарям надо иметь представление (и неплохое) о продуктах и инструментах инвестбанков и хедж-фондов: акции (включая ETF), облигации, деривативы (включая товарные), форексные пары.
На рынки количественный разработчик смотрит под своим углом. Его интересуют широкие массивы исторические рыночных данных - котировки, паттерны, значения технических индикаторов, профильные новости и пр. Как они выглядят и хранятся, насколько они доступны <смотрите, например, здесь>.
На старте, вы, скорее всего, будете специализироваться на каком-либо одном, узком финансовом секторе или инструменте, но ориентироваться в финансах в целом, отнюдь не помешает. <Кто знает, где вы окажетесь через год-два>.
Торговые алгоритмы, которые должен выдавать количественный разработчик опираются на совсем нетривиальные разделы математики. Метод Монте Карло, конечные разности, теория вероятности и матстатистика, математический анализ, уравнения в частных производных и многое другие.
Хедж-фонд потребует построение низко/высокочастотной инфраструктуры. Используются алгоритмы, написанные в MatLab, R или Python (или даже C++), с последующей оптимизацией на более быстром языке, например, C++, и API-подключением на брокера.
Необходимы навыки по сбору данных из всевозможных источников и размещению их в правильном контексте. Создание отчетов в PDF или ином формате (web-страница или через API) и т.д.
К сожалению, подобное мастерство трудно наработать дома по книгам. Нужны несколько лет опыта разработки программного обеспечения в технологической отрасли.
Подача заявки на вакансию количественного разработчика
Приведенный список изданий выглядит весьма и весьма внушительным. Но надо понимать, что это попытка очертить полный свод литературы для новичка в программировании, и (может быть) вообще - в точных науках. Маловероятно, что такой человек будет искать себя в профессии количественного разработчика.
Материал предназначен, преимущественно, для того, кто уже имеет математические знания и минимальный базис в IT.
Читайте те разделы, которые считаете актуальными для вашего уровня, иначе вы рискуете потратить несколько лет драгоценного времени на изучение упомянутых книжек!
Как только вы решите, что готовы к собеседованию - выходите на связь с профильными рекрутерами. Есть специализированные фирмы, подбирающие персонал для инвестиционных банков и хедж-фондов.
Любой хороший рекрутер исследует ваш опыт с разумной степенью детализации - ведь он рискует репутацией, выводя вас на собеседование в банк или фонд. Рекрутеры, как правило, не знакомы с техническими тонкостями количественных технологий. Они больше полагаются на соответствие резюме <ключевым> словам/меткам.
Если вы сильны в C++, укажите - “навыки C++ - сильные” и сошлитесь, например, на STL[5], Boost и иные проекты C++, где вы “в теме”. Не скромничайте в своей квалификации, но и не преувеличивайте ее. В резюме будьте честны и искренни.
Поскольку рынок труда <речь идет о ситуации на 2013 год> сейчас не самый лучший (особенно для новичков, <для них он всегда и везде “не самый лучший”>), потребуется время, чтобы получить место, которое вы ищете.
Не отчаивайтесь, когда вас “отфутболят” раз и еще раз. Продолжайте попытки. С каждым следующим собеседованием вы будете точнее понимать, чего от вас ждут рекрутеры и интервьюеры и сможете адаптироваться под будущие встречи.
перевод, обработка, комментарии и примечания
В основе изложения статья “Self-Study Plan for Becoming a Quantitative Developer”, опубликованная на сайте Quantstart.
При подготовке материала использовалась информация Amazon.com
Источник изображения на заставке - сайт городских курсов профессиональной подготовки (Санкт-Петербург)
Первоисточниками определений, терминов, понятий, явлений, вводимых по тексту, являются профильные статьи Википедии/Wikipedia, указанные в Списке источников к публикации (для переводов - возможны трактовки автора исходного материала), если не оговорено иное.
- “Количественные” и “квантовые” финансы - суть синонимы, переводы англоязычного термина “Quantitative Finance”, подробнее смотрите здесь.
- Под адаптированным переводом понимается достаточно точное следование исходному материалу, с возможными отступлениями и пояснениями. Конкретные вещи - формулы, скрипты, графики и пр. (а также авторские комментарии к ним) изложены максимально близко к оригиналу (часто скопированы). Ответственность за их корректность и ясность интерпретации несет автор исходника.
- Записью <курсив> обозначены вставки и комментарии переводчика.
- По ссылке можно скачать PDF-формат и другие электронные версии книги.
- Библиотека стандартных шаблонов (STL, Standard Template Library) - набор согласованных обобщенных алгоритмов, контейнеров, средств доступа к их содержимому и различных вспомогательных функций в C++. Смотрите источник 7.
- Высокая доступность (High Availability) - характеристика технической системы, разработанной для избежания невыполненного обслуживания путем уменьшения или управления сбоями и минимизацией времени плановых простоев. Смотрите источник 9.
Список источников (Википедия/Wikipedia, если не оговорено иное)
- “Самообразование”.
- “Зельдович, Яков Борисович”.
- “Гейтс, Билл”.
- “C++”.
- “Python”.
- “Pro Git”, С. Чакон и Б. Штрауб, Git-scm.com
- “Стандартная библиотека шаблонов”.
- “Цукерберг, Марк”.
- “Высокая доступность”.
API - Application Programming Interface, программный интерфейс подключения приложений
CI - Continuous Integration, непрерывная интеграция
ETF - Exchange Traded Fund, биржевой инвестиционный фонд
RDBMS - Relational DataBase Management Systems, системы управления реляционными базами данных
SQL - Structured Query Language, язык структурированных запросов
STL - Standard Template Library, библиотека стандартных шаблонов (для C++)
ПО - программное обеспечение
СУБД - система управления базами данных