Простота - ключ к успеху
« Простота - основа истинной элегантности. »
-Абрахам Маслоу-
* Отказ от ответственности: я предполагаю, что тот, кто имеет возможность понять и выполнить содержание этой статьи, достаточно сообразителен, чтобы провести надежное бэк-тестирование на всех этапах своего торгового конвейера, прежде чем запускать его в производство. Однако есть некоторые соображения, которые эта статья не принимает во внимание (среди прочего, спред, проскальзывание и транзакционные издержки), и в этом отношении эту статью не следует рассматривать как финансовый совет. Это следует рассматривать как образовательный шаг к лучшим результатам.
вступление
Цель этой статьи - предсказать, будет ли цена акций 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 случая "без приращения".
Итак, учитывая, что на цены акций влияет так много факторов, получение этих результатов с помощью только заголовков новостей и информации, содержащейся в свечах, является весьма выдающимся.
Помните, свободных денег не бывает. Любое вложение связано с риском. Всегда важно понимать не только математику и модели, но и то, что они представляют.
Вы можете скачать блокнот, чтобы воспроизвести все это здесь.