Простота - ключ к успеху

« Простота - основа истинной элегантности. »

-Абрахам Маслоу-

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

вступление

Цель этой статьи - предсказать, будет ли цена акций Alphabet (GOOGL) выше или ниже в конце любого дня, используя новости из времени закрытия торговая сессия предыдущего дня (16:00 EST для NYSE) до часов до начала торгов этого дня (9:30 EST).

Применяя Анализ настроений к новостным отчетам, мы создаем числовые характеристики и присоединяем их к нашим данным об акциях с помощью Алгоритма Proximity Blend.

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

Цель

Это набор данных курса акций дневных свечей для алфавита (GOOGL). Будем использовать последние 2 года.

Мы хотим спрогнозировать процент «изменения» между ценой закрытия данного дня по отношению к открытию.

df_alphabet['change'] = np.log(df_alphabet['close']) - np.log(df_alphabet['open'])

Давайте посмотрим на цены открытия и закрытия в зависимости от изменения.

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

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

Вот как выглядит распределение изменений:

743 times change is positive (53%)
639 times change is negative (47%)

Итак, монета уже «наклонена» в нашу пользу.

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

df_alphabet['target'] = [1 if ch > 0.003 else 0 for ch in df_alphabet['change']]

Теперь у нас есть гораздо более «неудобная» монета.

551 times target is 1 (39%)
832 times target is 0 (61%)

Наша цель - определить успех в той пропорции, которая приносит доход. Мы хотим отфильтровать и найти больше дней с положительной прибылью, в которые можно инвестировать (точность ›0,5).

Анализ настроений

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

В нашем случае (и во многих случаях) эта зависимая переменная «ŝ» используется для подпитки второй «зависимой» модели с конкретным вариантом использования для настроения (например, прогноз акций).

Где x - наша целевая переменная.

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

Анализ настроений - это искусство количественной оценки субъективной информации.

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

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

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

Теперь давайте посмотрим на некоторые - сгруппированные по дням - новости, в которых упоминается Google.

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

Я вручную пометил более 500 заголовков новостей из более чем 1300 дней новостей Google (это верно, я получил свой голос), добавив тональность -1, 0 или 1.

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

Для этого нам нужно преобразовать текст в числовой формат, чтобы мы могли применить ML. Для этого нам нужно разметить и векторизовать текст.

Токенизация

Токенизация - это разделение строк на слова или группы слов (называемых n-граммами). Например, давайте создадим n-граммы для «1 и 2 слов» для одного текста:

Векторизация

Векторизация - это создание разреженной матрицы из массива текстов, где столбцы - это n-граммы, а строки - это упоминания в каждом тексте.

Давайте токенизируем тексты и добавим их как числовые функции:

Мы добавили 1550 столбцов к нашему фреймворку настроений. Теперь давайте посмотрим на верхние коррелированные (отрицательные и положительные) токены с «настроением».

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

Во-первых, простая модель для обнаружения "положительных" новостей. Обучение с 365 и тестирование с 157.

Он правильно обнаружил 7 положительных новостей, неправильно получил метку 1 и пропустил 28. Он правильно отбросил 121 «не положительную» новость.

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

Он правильно определил 12, ошибочно пометил 7 как «отрицательный» и пропустил 28 «отрицательные» новости. Он правильно отфильтровал 110 «не отрицательных» новостей.

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

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

Прогноз цен с новостями

Давайте посмотрим на настроение вместе с ценой.

Зеленые линии - это «положительные» новости, а красные - «отрицательные».

Уберем ценовую кривую.

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

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

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

Опять же, пробуем простую модель, тренируемся с предыдущим (хронологически) набором тренировок из 1078 наблюдений и тестируем с апостериорным из 304.

Наша модель правильно спрогнозировала 85 приращений цены (изменение ›0,003), но ошибочно приняла 65‘ случаев без приращения . Он пропустил 50 приращений и правильно отфильтровал 104 случая "без приращения".

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

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

Вы можете скачать блокнот, чтобы воспроизвести все это здесь.