Представляем мою книгу: Поваренная книга Python для финансов

Моя короткая история перехода от статей Medium к книжному контракту

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

Как это началось

Где-то в феврале 2019 года со мной связался редактор Acquisitions Editor с вопросом, не хочу ли я написать книгу. Я уже написал несколько статей на Medium, и меня немного поразил масштаб проекта. Однако это звучало как захватывающая идея и возможность расширить мое маленькое писательское хобби. Вскоре я согласился принять вызов.

Предложение

Первым шагом всего процесса было предложение. Издатель уже имел представление об общей теме книги (основная тема, а не сам контент), о том, какой это будет тип книги и на кого она должна быть нацелена.

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

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

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

Процесс

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

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

Чтобы мне было проще, я старался делать как можно больше работы во время поездки на работу. Поскольку мне нужно ехать на поезде по 40 минут дважды в день, имеет смысл использовать это время как можно эффективнее. Раньше я в то время читал книги или работал над статьями, поэтому уже привык работать в таких условиях.

Даже когда мне удавалось работать над книгой дважды в день в дороге, я редко производил достаточно контента, чтобы заполнить квоту на 1-2 страницы. Большую часть времени я также работал по вечерам. Часто случалось, что я просто слишком устал после рабочего дня и долгих поездок на работу, чтобы вечером заняться чем-нибудь конструктивным. В результате у меня было несколько задержек по отношению к первоначальному расписанию. К счастью, редакторы поддержали и воодушевили этот процесс.

Я писал книгу с марта 2019 года по начало января 2020 года. Для каждой главы я следовал аналогичному рабочему процессу. Сначала я собрал ресурсы для главы, над которой сейчас работал. Затем я начал с описания проблемы и написания кода, который ее решает. После того, как кодирование было завершено, я напишу введение в рецепт и подробно опишу, как работает код (шаг за шагом). В большинстве рецептов я также написал раздел Есть еще, который содержал несколько более сложных тем, касающихся этого рецепта, или сосредоточивался на другом возможном подходе к задаче.

Большую часть времени я писал содержание рецептов в тех же блокнотах Jupyter, что и код. Это казалось наиболее удобным, так как я бы перенес все (текст + код) в текстовый редактор издателя на основе Markdown все сразу. Однако с этим были и проблемы. Подробнее об этом в разделе ниже.

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

Что я выучил…

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

  • Дать реалистичное количество страниц при написании предложения оказалось намного сложнее, чем ожидалось. Я сильно недооценил количество страниц, необходимых для каждой главы. Во-первых, я не учел размер изображений, так как не имел четкого представления о том, сколько изображений будет в каждой главе. Во-вторых, я недооценил место, занимаемое кодом. Учитывая, что код был разбит на пронумерованные шаги и каждый шаг имел свое краткое описание, это значительно повлияло на количество страниц.
  • Более частые проверки реальности у редактора издателя. Как я уже упоминал ранее, я в основном писал содержание глав в Jupyter Notebook, где также представлял решение данной задачи. Я переместил главу в редакцию издателя только тогда, когда подумал, что закончил с ней. Проблема с этим подходом в том, что у меня не было реального индикатора количества страниц в Jupyter. Поэтому часто случалось, что я был намного выше цели, когда перемещал весь контент в редактор. Кроме того, при переносе кода в редактор он часто не соответствовал ширине страницы и требовал дальнейшего рефакторинга - перехода между Блокнотом и редактором.
  • 9 месяцев в data science - это действительно много, так как индустрия постоянно развивается. Я испытал это несколькими способами. Во-первых, к тому времени, когда я закончил книгу, некоторые библиотеки Python были переименованы, что потребовало исправления кода в нескольких главах. Во-вторых, некоторые функции (связанные с загрузкой данных) устарели, и в результате я удалил 2 полных рецепта. В-третьих, при написании последующих глав я наткнулся на некоторые новые интересные вещи, которые хотел бы использовать в предыдущих главах, однако обычно не было времени (и страниц), чтобы включить это в уже написанные части. В результате появилось несколько идей для статей, которые я надеюсь вскоре опубликовать :)
  • Код потребовал много раундов рефакторинга. Причины этого включают исправление форматирования (чтобы оно соответствовало ширине страницы), учет изменений в библиотеках и т. Д. Кроме того, в процессе разработки я часто возвращался к предыдущим главам, чтобы реорганизовать код, чтобы он соответствовал стандартам более поздних. Следует помнить, что изменение кода происходило не только в Jupyter Notebook, но и в редакторе издателя, в котором хранилась книга, поэтому было крайне важно правильно обновить оба источника.
  • Одна вещь, с которой мне пришлось научиться работать, - это отсроченное вознаграждение. В случае со статьями Medium, как только статья будет закончена, ее можно будет опубликовать в течение нескольких секунд, и я могу видеть ее прием. Я знаю, это тщеславие. Но для написания книги потребовалось около года, и потребовалась определенная решимость. В конце концов, удовлетворение доставкой окончательной версии книги и ее подготовкой к печати было большим и стоило ожидания. Кроме того, во время написания книги мне удалось найти свободное время для подготовки нескольких статей. Как я упоминал ранее, у меня было довольно много идей. Например, я исследовал библиотеки, используемые для тестирования торговых стратегий на Python. В то время как я использовал одну библиотеку в книге (и придерживался ее для единообразия), я провел довольно много исследований по другой, и было бы стыдно не поделиться ею как серией статей (начатой ​​этой одной).

Инструменты, которые облегчили мне жизнь

  • Trello - позволяет создавать списки задач в стиле Канбан. Это отличный инструмент для организации проектов, как для личного пользования, так и для целых команд. Для книги я создал доску и разделил ее на разделы, такие как невыполнение, выполнение, пересмотр, готово, идеи. Таким образом, всякий раз, когда я придумывал новую идею или хотел отслеживать то, что мне еще нужно было рефакторировать, я мог легко использовать Trello для организации задач. Я также использую его для организации написания блога :)
  • GitHub - возможно, самая популярная платформа для контроля версий. Репозиторий книги на GitHub находится здесь.
  • Grammarly - отличный инструмент для проверки того, что ваше письмо относительно правильное. Это экономит много времени, показывая возможные ошибки. Однако тщательное чтение также важно, поскольку Grammarly может упустить некоторые сложные крайние случаи. Grammarly также может быть установлен как расширение Chrome и хорошо работает с несколькими веб-сайтами (включая Medium!).
  • Hemmingway App - это веб-приложение, которое отлично подходит для анализа текста и выявления его сложности. Он предлагает дополнительную помощь, указывая, какие предложения слишком длинные или сложные, и для них можно использовать некоторую настройку (например, разбив их на два отдельных предложения). В целом, предложения Hemmingway App упрощают чтение и понимание текста.
  • Draw.io - действительно удобный инструмент для создания диаграмм публикационного качества. Он работает как инструмент перетаскивания в браузере, предлагая множество значков и изображений. Кроме того, он позволяет сохранять ваши проекты, повторно загружать их для возможных исправлений и экспортировать в несколько форматов (включая PDF).
  • Jupyter Notebook / Visual Studio Code - большую часть времени я использовал Jupyter Notebooks (с такими расширениями, как оглавление, проверка орфографии и т. Д.) Как для написания, так и для написания кода. Всякий раз, когда мне нужно было подготовить отдельный .py скрипт, я использовал VS Code, который является моим основным текстовым редактором.

Сама книга

После получения всей информации о самом процессе пора наконец представить книгу. Как упоминалось ранее, название - Python for Finance Cookbook, и книга содержит более 50 практических рецептов.

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

Книга разделена на 10 глав:

В главе 1, Финансовые данные и предварительная обработка, исследуется, чем финансовые данные отличаются от других типов данных, обычно используемых в задачах машинного обучения. Я показываю, как загружать данные из разных источников и предварительно обрабатывать их для дальнейшего анализа.

Глава 2, Технический анализ в Python, демонстрирует некоторые фундаментальные основы технического анализа, а также способы быстрого создания элегантных панелей мониторинга на Python. Читатель сможет получить некоторое представление о закономерностях, возникающих на основе выбора наиболее часто используемых показателей (таких как MACD и RSI).

Глава 3, Моделирование временных рядов, знакомит с основами моделирования временных рядов (включая декомпозицию временных рядов и статистическую стационарность). Затем я рассмотрю два наиболее широко используемых подхода к моделированию временных рядов - методы экспоненциального сглаживания и модели классов ARIMA. Наконец, я представляю новый подход к моделированию временных рядов с использованием аддитивной модели из библиотеки Prophet в Facebook.

Глава 4, Многофакторные модели, показывает, как оценивать различные факторные модели в Python. Я начинаю с простейшей однофакторной модели, а затем объясняю, как оценивать более сложные трех-, четырех- и пятифакторные модели.

Глава 5, Моделирование волатильности с помощью моделей классов GARCH, знакомит читателя с концепцией прогнозирования волатильности с использованием моделей класса (G) ARCH, как выбрать наиболее подходящую модель и как интерпретировать результаты.

Глава 6, Моделирование методом Монте-Карло в финансах, знакомит читателя с концепцией моделирования методом Монте-Карло и знакомит с тем, как использовать его для моделирования цен на акции, оценки европейских / американских опционов и расчета VaR.

Глава 7, Распределение активов в Python, знакомит с концепцией современной теории портфеля и показывает, как получить эффективный рубеж в Python. Затем я смотрю, как определить конкретные портфели, такие как минимальная дисперсия или максимальный коэффициент Шарпа. Я также показываю, как оценивать эффективность таких портфелей.

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

В главе 9, Расширенные модели машинного обучения в финансах, представлен набор расширенных классификаторов (включая объединение нескольких моделей в стек). Кроме того, я смотрю, как бороться с дисбалансом классов, использовать байесовскую оптимизацию для настройки гиперпараметров и извлекать важность функций из модели.

Глава 10, Глубокое обучение в финансах, демонстрирует, как использовать методы глубокого обучения для работы с временными рядами и табличными данными. Сети обучаются с помощью PyTorch (с возможным ускорением на GPU).

Выводы

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

Надеюсь, что книга будет полезна людям, желающим научиться использовать Python для решения практических задач в финансовой сфере. Если вы заинтересованы в покупке книги, вы можете приобрести ее на Amazon или сайте Packt’s.

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

До скорого!