Вы находитесь на странице: 1из 1

www.machinelearningmastery.

ru
Машинное обучение, нейронные сети,
искусственный интеллект

Home / Прогноз акций в Python

Home ₽
Появилась помесячная оплата Узнать больше
Доступна помесячная оплата за обучение.11000р.в месяц.Успей записаться до 14
августа. praktikum.yandex.ru
18+

Прогноз акций в Python


 Дата публикации Jan 19, 2018

Сделать (и потерять) фальшивые состояния, изучая настоящий Python

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

Занимательная
история,
выдающиеся люди,
малоизвестные
факты, находки,
открытия,
фальсификации.
Присоединяйся!

Revival of His…

Где те валькирии, что


унесут меня в
Вальхаллу?

42 932 подписчика

Однажды против 30 лет: на что бы вы предпочли положить деньги?


Подписаться
Когда мы не достигаем немедленного успеха - в любой задаче, а не только в науке о данных - у нас есть три варианта:

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

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

В этом посте описаны возможности прогнозирования Stocker, инструмента «биржевого анализа акций», который я
разработал в Python.В предыдущей статьеЯ показал, как использовать Stocker для анализа, иполный код доступен на
GitHubдля тех, кто хочет использовать его самостоятельно или внести свой вклад в проект.

Stocker для прогноза


Stocker - это инструмент Python для исследования запасов. Как только у нас будут установлены необходимые
библиотеки (ознакомьтесь с документацией), мы можем запустить Блокнот Jupyter в той же папке, что и скрипт, и
импортировать класс Stocker:

from stocker import Stocker

Класс теперь доступен в нашей сессии. Мы создаем объект класса Stocker, передавая ему любой допустимый тикер
(смелыйвыводится):

amazon = Stocker('AMZN')AMZN Stocker Initialized. Data covers 1997-05-16 to 2018-01-18.

Точно так же у нас есть 20 лет ежедневных данных об акциях Amazon для изучения! Stocker построен на основе
финансовой библиотеки Quandl и содержит более 3000 акций. Мы можем сделать простой график истории акций,
используяplot_stockметод:

amazon.plot_stock()Maximum Adj. Close = 1305.20 on 2018-01-12.


Minimum Adj. Close = 1.40 on 1997-05-22.
Current Adj. Close = 1293.32.

Аналитические возможности Stocker можно использовать для нахождения общих тенденций и моделей в данных, но
мы сосредоточимся на прогнозировании будущей цены. Предсказания в Стокерсделано с использованием
аддитивной моделикоторый рассматривает временные ряды как комбинацию общей тенденции вместе с
сезонностями в различных временных масштабах, таких как ежедневный, еженедельный и ежемесячный. Stocker
использует пакет пророка, разработанный Facebook для аддитивного моделирования. Создание модели и
прогнозирование можно выполнить с помощью Stocker в одну строку:

# predict days into the future


model, model_data = amazon.create_prophet_model(days=90)Predicted Price on 2018-04-18 = $1336.98

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

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

Оценка прогнозов
Чтобы рассчитать точность, нам нужен тестовый набор и тренировочный набор. Нам нужно знать ответы -
фактическую цену акций - для тестового набора, поэтому мы будем использовать данные за прошлый год (в нашем
случае 2017). Во время обучения мы не позволяем нашей модели видеть ответы на тестовом наборе, поэтому мы
используем данные за три года до периода тестирования (2014–2016 гг.). Основная идея контролируемого обучения
заключается в том, что модель изучает шаблоны и взаимосвязи в данных из обучающего набора, а затем может
правильно воспроизводить их для тестовых данных.

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

amazon.evaluate_prediction()Prediction Range: 2017-01-18 to 2018-01-18.

Predicted price on 2018-01-17 = $814.77.


Actual price on 2018-01-17 = $1295.00.

Average Absolute Error on Training Data = $18.21.


Average Absolute Error on Testing Data = $183.86.

When the model predicted an increase, the price increased 57.66% of the time.
When the model predicted a decrease, the price decreased 44.64% of the time.

The actual value was within the 80% confidence interval 20.00% of the time.

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

Предварительный выбор точки изменения


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

Более высокий приоритет создает модель с большим весом в точках изменения и более гибкой подгонкой. Это
может привести к переоснащению, потому что модель будет тесно привязана к данным обучения и не сможет
обобщать новые данные испытаний. Понижение предшествующего уровня уменьшает гибкость модели, что может
вызвать противоположную проблему: недостаточное оснащение. Это происходит, когда наша модель недостаточно
внимательно следит за данными обучения и не может изучить базовые шаблоны. Определение правильных настроек
для достижения правильного баланса - это скорее вопрос техники, чем теории, и здесь мы должны полагаться на
эмпирические результаты. Класс Stocker содержит два разных способа выбора подходящего априора: визуально и
количественно. Мы можем начать с графического метода:

# changepoint priors is the list of changepoints to evaluate


amazon.changepoint_prior_analysis(changepoint_priors=[0.001, 0.05, 0.1, 0.2])

Здесь мы обучаемся данным за три года, а затем показываем прогнозы на шесть месяцев. Мы не определяем
количество прогнозов здесь, потому что мы просто пытаемся понять роль точки изменения ранее. Этот график
отлично иллюстрирует переоснащение! Нижний априор, синяя линия, не очень внимательно следит за
тренировочными данными, за черными наблюдениями. Он как бы делает свое дело и выбирает маршрут через
общую окрестность данных. Напротив, высший априор, желтая линия, как можно ближе придерживается
тренировочных наблюдений. Значение по умолчанию для точки изменения - 0,05, которое находится где-то
посередине между двумя крайностями.

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

Теперь, когда у нас есть представление о влиянии предыдущего, мы можем численно оценить различные значения,
используя набор для обучения и проверки:

amazon.changepoint_prior_validation(start_date='2016-01-04', end_date='2017-01-03', changepoint_priors=[

cps train_err train_range test_err test_range


0.001 44.507495 152.673436 149.443609 153.341861
0.050 11.207666 35.840138 151.735924 141.033870
0.100 10.717128 34.537544 153.260198 166.390896
0.200 9.653979 31.735506 129.227310 342.205583

Здесь мы должны быть осторожны, чтобы наши данные проверки не совпадали с нашими данными тестирования.
Если бы это было так, мы бы создали лучшую модель для тестовых данных, но тогда мы просто переоснастили бы
тестовые данные, и наша модель не смогла бы преобразоваться в данные реального мира. В целом, как это обычно
делается в науке о данных, мы используем три различных набора данных: обучающий набор (2013–2015 годы), набор
для проверки (2016 год) и набор для тестирования (2017 год).

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

Предварительная проверка Stocker также отображает два графика, иллюстрирующие эти моменты:

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

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

# test more changepoint priors on same validation range


amazon.changepoint_prior_validation(start_date='2016-01-04', end_date='2017-01-03', changepoint_priors=[

Уточненные кривые обучения и тестирования

Ошибка набора тестов сводится к минимуму до 0,5. Мы установим предшествующий атрибут changepoint объекта
Stocker соответствующим образом.

amazon.changepoint_prior_scale = 0.5

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

Оценка уточненной модели


Теперь, когда наша модель оптимизирована, мы можем снова оценить ее:

amazon.evaluate_prediction()Prediction Range: 2017-01-18 to 2018-01-18.

Predicted price on 2018-01-17 = $1164.10.


Actual price on 2018-01-17 = $1295.00.

Average Absolute Error on Training Data = $10.22.


Average Absolute Error on Testing Data = $101.19.

When the model predicted an increase, the price increased 57.99% of the time.
When the model predicted a decrease, the price decreased 46.25% of the time.

The actual value was within the 80% confidence interval 95.20% of the time.

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

Игра на фондовом рынке


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

Правила нашей стратегии просты:

1. Каждый день модель прогнозирует увеличение акций, мы покупаем акции в начале дня и продаем в конце дня.
Когда модель прогнозирует снижение цены, мы не покупаем акции.
2. Если мы покупаем акции и цена увеличивается в течение дня, мы увеличиваем количество купленных нами
акций.
3. Если мы покупаем акции и цена снижается, мы теряем количество раз, которое уменьшается.

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

# Going big
amazon.evaluate_prediction(nshares=1000)You played the stock market in AMZN from 2017-01-18 to 2018-01-1

When the model predicted an increase, the price increased 57.99% of the time.
When the model predicted a decrease, the price decreased 46.25% of the time.

The total profit using the Prophet model = $299580.00.


The Buy and Hold strategy profit = $487520.00.

Thanks for playing the stock market!

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

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

Всегда играйте с фальшивыми деньгами!

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

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

amazon.predict_future(days=10)
amazon.predict_future(days=100)

Прогнозы на ближайшие 10 и 100 дней

Модель на Амазоне в целом бычья, как ибольшинство «профессионалов».Кроме того, неопределенность


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

Хотя мы не можем разбогатеть на инструменте Stocker, выгода заключается в разработке, а не в конечных


результатах! Мы не можем знать, можем ли мы решить проблему, пока не попробуем, ноЛучше попробовать и
потерпеть неудачу, чем никогда не пытаться вообще!Для тех, кто заинтересован в проверке кода или использовании
Stocker самостоятельно, этодоступно на GitHub,

Как всегда, мне нравятся отзывы и конструктивная критика. Со мной можно связаться в твиттере@koehrsen_will,

 Оригинальная статья

Онлайн-курс Python-разработчик Узнать


с 0 до PRO бесплатно
16+

Фреймворки и библиотеки (большая подборка Список блогов и информационных бюллетеней по


ссылок для разных языков программирования) науке о данных и машинному обучению
Список бесплатных книг по машинному обучению, Список (в основном) бесплатных курсов машинного
доступных для скачивания обучения, доступных в Интернете

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map