- Оригинальный адрес:Time Series Analysis in Python: An Introduction
- Оригинальный автор:Will Koehrsen
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:ppp-man
Аддитивные модели для моделирования временных рядов
Временные ряды — один из самых распространенных типов данных в повседневной жизни. Цены на финансовых рынках, погода, потребление энергии домохозяйствами и даже вес — вот примеры данных, которые можно собирать на регулярной основе. Почти каждый специалист по данным сталкивается с временными рядами в своей повседневной работе, и изучение того, как моделировать временные ряды, является важным навыком в науке о данных. для анализа и прогнозированияДанные периодаПростая, но мощная модель — это модель суммирования. Интуитивная концепция, лежащая в основе этого, состоит в том, чтобы разделить временной ряд на комбинацию различных временных интервалов и общих тенденций, интервалы могут быть дневными, еженедельными, ежеквартальными, ежегодными. Ваш дом может потреблять больше энергии летом, чем зимой, но в целом наблюдается тенденция к снижению из-за более эффективного использования энергии. Аддитивные модели могут отображать закономерности/тенденции и делать прогнозы на основе этих наблюдений.
На рисунке ниже показан временной ряд, разделенный на общий тренд, годовой тренд и недельный тренд.
Пример декомпозиции модели суммирования
В этой статье подробно описывается программное обеспечение, разработанное с использованием Python и Facebook.Пакет расширения «Прогноз пророка»Вот вводный пример моделирования данных временных рядов в финансах. Мы также поговорим о том, как обрабатывать данные с помощью панд, используяБиблиотека Quandl для доступа к финансовым данным,иГрафика с помощью matplotlib. Я включил вводный код и призываю всех взглянуть на него на GitHub.Jupyter NotebookПолный анализ. Это вводное введение покажет вам все шаги, которые необходимо предпринять для моделирования временного ряда.
Отказ от ответственности: Должен сказать, что вас поразили финансовые данныеПрошлые результаты не являются индикатором будущих результатовИ этот метод не сделает вас богатым. Я выбираю акции, потому что эти ежедневные данные легче найти и ими легко пользоваться.
Извлечение финансовых данных
Как правило, почти 80% времени проекта по науке о данных уходит на сбор и организацию данных. Благодаря финансовой базе данных quandl время сбора и сопоставления, необходимое для этого проекта, сократилось примерно до 5%. Quandl можно установить с помощью pip из командной строки, что позволит вам получить доступ к тысячам финансовых индикаторов с помощью всего одной строки кода Python и сделать не более 50 запросов без регистрации. После регистрации бесплатной учетной записи вы можете получить ключ API и делать неограниченные запросы.
Сначала мы импортируем необходимые библиотеки и получаем некоторые данные. Quandl автоматически интегрирует наши данные во фреймы данных pandas, которые представляют собой структуру данных для науки о данных (заменив «TSLA» или «GM» на другие биржевые символы, можно получить данные от других компаний, также можно указать определенный временной интервал).
# 用 quandl 取金融数据
import quandl
# 用 panda 作数据处理
import pandas as pd
quandl.ApiConfig.api_key = 'getyourownkey!'
# 从 Quandl 提取 TSLA 数据
tesla = quandl.get('WIKI/TSLA')
# 从 Quandl 提取 GM 数据
gm = quandl.get('WIKI/GM')
gm.head(5)
Скриншот данных GM из quandl
Количество данных о quandl практически не ограничено, но я хочу сосредоточиться на двух компаниях из одной отрасли, Tesla и GM. Прелесть Теслы не только в том, что онаПервый успешный автомобильный стартап в Америке за 111 лет, он также становится время от времениСамые дорогие автомобильные компании Америки 2017 г..
Хотя он продает только четыре модели. Конкурирующая компания General Motors, также претендующая на звание самой ценной автомобильной компании, в последние годы продемонстрировала признаки поддержки автомобилей будущего, выпустив несколько новых (но не очень красивых) полностью электрических транспортных средств.
Ответ очевиден
Мы могли бы потратить много времени на поиск этих данных и загрузку их в виде файла csv, но благодаря quandl мы можем получить то, что нам нужно, за считанные секунды.
сбор данных
Лучше всего сделать несколько картинок, прежде чем мы будем моделировать, чтобы получить некоторое представление о ее структуре. Это также позволяет нам проверять выбросы и условия отсутствия данных.
matplotlib может легко рисовать фреймы данных Pandas. Если эти графические коды вас пугают, не волнуйтесь, я также думаю, что код matplotlib не интуитивно понятен, поэтому я часто копирую и вставляю примеры quandl в Stack Overflow или в другую документацию. Правило программирования — не переписывать уже существующий ответ.
# 股票分割调整收市价,这是我们应该画的数据
plt.plot(gm.index, gm['Adj. Close'])
plt.title('GM Stock Price')
plt.ylabel('Price ($)');
plt.show()
plt.plot(tesla.index, tesla['Adj. Close'], 'r')
plt.title('Tesla Stock Price')
plt.ylabel('Price ($)');
plt.show();
первоначальная цена акции
Сравнение цен акций двух компаний само по себе не скажет вам, кто более ценен, потому что стоимость компании (рыночная капитализация) также зависит от количества акций (рыночная капитализация = цена акции * количество акций). У Quandl нет данных о количестве акций, но я смог найти среднегодовое количество акций обеих компаний с помощью простого поиска в Google. Хотя и не точно, но для нашего анализа достаточно, а иногда и необходимо!
Мы используем некоторые приемы pandas для создания двух столбцов данных во фрейме данных, например, одновременное индексирование одного столбца (reset_index).ixДанные для интервала во фрейме данных индекса.
# 特斯拉和通用汽车年平均股票数量
tesla_shares = {2018: 168e6, 2017: 162e6, 2016: 144e6, 2015: 128e6, 2014: 125e6, 2013: 119e6, 2012: 107e6, 2011: 100e6, 2010: 51e6}
gm_shares = {2018: 1.42e9, 2017: 1.50e9, 2016: 1.54e9, 2015: 1.59e9, 2014: 1.61e9, 2013: 1.39e9, 2012: 1.57e9, 2011: 1.54e9, 2010:1.50e9}
# 创建一个年的列
tesla['Year'] = tesla.index.year
# 把索引的日期转移到日期列
tesla.reset_index(level=0, inplace = True)
tesla['cap'] = 0
# 计算所有年份的市值
for i, year in enumerate(tesla['Year']):
# 提取那一年的股票数量
shares = tesla_shares.get(year)
# 市值列等于数量乘以价格
tesla.ix[i, 'cap'] = shares * tesla.ix[i, 'Adj. Close']
Вот как создается столбец рыночной капитализации Tesla. Таким же образом мы генерируем данные GM и объединяем два набора данных.сливатьсяявляется необходимым элементом в науке о данных, поскольку позволяет нам объединять данные, которые имеют общий столбец. В этом примере мы хотим объединить данные из двух разных компаний по дате, используя «внутреннее» слияние, чтобы сохранить даты, которые появляются в фреймах данных обеих компаний. Затем мы переименовываем объединенные столбцы, чтобы узнать, какой набор данных принадлежит какой автомобильной компании.
# 合并两组数据并重命名列
cars = gm.merge(tesla, how='inner', on='Date')
cars.rename(columns={'cap_x': 'gm_cap', 'cap_y': 'tesla_cap'}, inplace=True)
# 只选择相关的列
cars = cars.ix[:, ['Date', 'gm_cap', 'tesla_cap']]
# 做除法得到 10 亿美元为单位的市值
cars['gm_cap'] = cars['gm_cap'] / 1e9
cars['tesla_cap'] = cars['tesla_cap'] / 1e9
cars.head()
Комбинированный кадр данных рыночной капитализации
Рыночная капитализация составляет миллиарды долларов. Мы видели, что рыночная капитализация GM в первые дни была в 30 раз больше, чем у Tesla! Изменилось ли оно со временем?
plt.figure(figsize=(10, 8))
plt.plot(cars['Date'], cars['gm_cap'], 'b-', label = 'GM')
plt.plot(cars['Date'], cars['tesla_cap'], 'r-', label = 'TESLA')
plt.xlabel('Date'); plt.ylabel('Market Cap (Billions $)'); plt.title('Market Cap of GM and Tesla')
plt.legend();
Исторические данные о рыночной капитализации
Мы наблюдали быстрый рост Tesla и слабый рост GM в течение периода, связанного с данными. Tesla обогнала GM в 2017 году!
import numpy as np
# 找到特斯拉市值高于通用的第一次和最后一次
first_date = cars.ix[np.min(list(np.where(cars['tesla_cap'] > cars['gm_cap'])[0])), 'Date']
last_date = cars.ix[np.max(list(np.where(cars['tesla_cap'] > cars['gm_cap'])[0])), 'Date']
print("Tesla was valued higher than GM from {} to {}.".format(first_date.date(), last_date.date()))
Tesla was valued higher than GM from 2017-04-10 to 2017-09-21.
За этот период Tesla продала около48 000 автомобилейиGM продал 1 500 000. GM ниже, чем Тесла, когда продает в 30 раз больше, чем Тесла! Это определенно демонстрирует силу убедительного президента и сверхвысокого качества (так мало количества) продукта. Хотя рыночная капитализация Tesla сейчас ниже, чем у GM, можем ли мы ожидать, что Tesla снова превзойдет ее? Когда это произойдет? Чтобы ответить на этот вопрос, обратимся к аддитивным моделям предсказания будущего.
Моделирование пророков
Пакет расширения пророка FacebookВпервые выпущенный для Python и R в 2017 году, он вдохновил ученых по всему миру. Оракул изначально был разработан для анализа ежедневных наблюдений за временными рядами, и эти наблюдения будут показывать разные закономерности в разные временные интервалы. Он также имеет мощные функции для анализа влияния праздников на временные ряды и применения пользовательских узлов, поэтому давайте просто рассмотрим основные функции, благодаря которым модель работает. Oracle, как и quandl, можно установить с помощью pip из командной строки.
Сначала мы импортируем оракул и переименовываем столбцы данных в правильный формат. Столбец даты должен быть переименован в «ds», а числовой столбец, который вы хотите предсказать, называется «y». Затем мы создаем модель оракула для обработки данных, как в Scikit-Learn:
import fbprophet
# 预言家要求列 ds 和 y
gm = gm.rename(columns={'Date': 'ds', 'cap': 'y'})
# 化单位为 10 亿美元
gm['y'] = gm['y'] / 1e9
# 创建预言家模型用于数据
gm_prophet = fbprophet.Prophet(changepoint_prior_scale=0.15)
gm_prophet.fit(gm)
При создании модели оракула я установил точку изменения до 0,15, что выше значения по умолчанию 0,05. Этот гиперпараметр используется для управленияЧувствительность к изменениям тренда, чем выше значение, тем он более чувствителен, а чем ниже, тем менее чувствителен. Значение этого значения заключается в борьбе с наиболее важными компромиссами машинного обучения:Предвзятость против предвзятости.
Если наша модель слишком близка к обучающим данным, так называемыйпереоснащение, наше смещение будет слишком большим, и модели будет трудно обобщить другие новые данные. С другой стороны, если модель не может уловить тенденции в обучающих данных, слишком большая предвзятость делает ее неприемлемой. Если модель имеет низкую степень соответствия, увеличьте априорное значение точки изменения, чтобы приблизить модель к данным; и наоборот, если модель переобучается, уменьшите априорное значение, чтобы ограничить чувствительность модели. Эффект предыдущей точки изменения можно визуализировать, построив прогнозный график для диапазона значений:
Чем выше предшествующая точка изменения, тем более гибкая модель и тем лучше она может соответствовать обучающим данным. Кажется, это именно то, что нам нужно, но слишком близкое приближение к обучающим данным может привести к переоснащению, что снизит способность модели делать прогнозы с новыми данными. Поэтому нам нужно найти баланс, который соответствует данным обучения и обобщается на другие данные. Используя нашу модель для отслеживания ежедневно меняющихся цен на акции, я увеличил гибкость модели, попробовав некоторые данные.
Решив использовать модель оракула, мы можем указать точки изменения (расположенные вГде временной ряд меняется быстрее всего). Точки изменения могут соответствовать крупным событиям, таким как запуск нового продукта или макроэкономические потрясения. При отсутствии спецификации видящий вычислит ее для нас.
Создание прогнозов требует использования будущего фрейма данных. Мы указываем количество временных интервалов для прогнозирования (два года) и частоту прогнозирования (ежедневно), а затем используем модель оракула и будущие данные для составления прогнозов.
# 生成一个 2 年的数据框
gm_forecast = gm_prophet.make_future_dataframe(periods=365 * 2, freq='D')
# 做预测
gm_forecast = gm_prophet.predict(gm_forecast)
Наш фрейм данных будущего содержит предполагаемую рыночную капитализацию Tesla и GM в течение следующих двух лет, визуализированную с помощью функции рисования оракула.
gm_prophet.plot(gm_forecast, xlabel = 'Date', ylabel = 'Market Cap (billions $)')
plt.title('Market Cap of GM');
Черные точки представляют собой фактические данные (обратите внимание, что они относятся только к началу 2018 г.), синяя линия — прогнозное значение, а светло-синяя область — неопределенность (обычноВажная часть прогнозирования). Область неопределенности увеличивается со временем по мере увеличения исходной неопределенности, т.к.Прогноз погоды будет менее точным из-за более длительного времени прогноза..
Мы также можем проверить точки изменения, обнаруженные моделью. Повторим еще раз: точки изменения представляют собой значительное изменение скорости роста временного ряда (например, с увеличения на уменьшение).
tesla_prophet.changepoints[:10]
61 2010-09-24
122 2010-12-21
182 2011-03-18
243 2011-06-15
304 2011-09-12
365 2011-12-07
425 2012-03-06
486 2012-06-01
547 2012-08-28
608 2012-11-27
Мы можем сравнить этот период времени сТенденции Tesla от GoogleПосмотрите, совпадают ли результаты. Точки изменения (вертикальные линии) и результаты поиска размещаются на одном графике:
# 加载数据
tesla_search = pd.read_csv('data/tesla_search_terms.csv')
# 把月份转换为 datetime
tesla_search['Month'] = pd.to_datetime(tesla_search['Month'])
tesla_changepoints = [str(date) for date in tesla_prophet.changepoints]
# 画出搜索频率
plt.plot(tesla_search['Month'], tesla_search['Search'], label = 'Searches')
# 画 changepoints
plt.vlines(tesla_changepoints, ymin = 0, ymax= 100, colors = 'r', linewidth=0.6, linestyles = 'dashed', label = 'Changepoints')
# 整理绘图
plt.grid('off'); plt.ylabel('Relative Search Freq'); plt.legend()
plt.title('Tesla Search Terms and Changepoints');
Частота поиска Tesla и точки обмена акций
Некоторые точки изменения рыночной капитализации Tesla совпадают с изменениями частоты поиска Tesla, но не все. Я не думаю, что частота поиска в Google является хорошим индикатором движения акций.
Нам еще нужно знать, когда Tesla превзойдет GM по рыночной стоимости. Теперь, когда у нас есть прогнозы на следующие два года, мы можем объединить два фрейма данных и отобразить рыночную капитализацию обеих компаний на одном графике. Перед объединением столбцы необходимо переименовать, чтобы облегчить отслеживание.
gm_names = ['gm_%s' % column for column in gm_forecast.columns]
tesla_names = ['tesla_%s' % column for column in tesla_forecast.columns]
# 合并的数据框
merge_gm_forecast = gm_forecast.copy()
merge_tesla_forecast = tesla_forecast.copy()
# 更名列
merge_gm_forecast.columns = gm_names
merge_tesla_forecast.columns = tesla_names
# 合并两组数据
forecast = pd.merge(merge_gm_forecast, merge_tesla_forecast, how = 'inner', left_on = 'gm_ds', right_on = 'tesla_ds')
# 日期列更名
forecast = forecast.rename(columns={'gm_ds': 'Date'}).drop('tesla_ds', axis=1)
Сначала мы просто нарисуем оценки. Оценки («yhat» из пакета oracle) устраняют часть шума в данных и, таким образом, отличаются от графика исходных данных. Степень удаления примесей зависит от размера априорной точки изменения — более высокое априорное значение означает большую гибкость модели и большее количество неровностей.
Прогнозируемая рыночная капитализация GM и Tesla
Наша модель рассматривает Тесла, обгоняющую GM в 2017 году, как шум, и знает, что в 2018 году Тесла действительно превзойдет GM в прогнозе. Точная дата — 27 января 2018 года, и если это действительно произойдет, я хотел бы взять на себя ответственность за предсказание будущего!
При создании приведенного выше изображения мы упустили самый важный момент в прогнозе: неопределенность! Мы можем использовать matplotlib (ссылкаnotebook), чтобы увидеть области с неопределенностью:
Это лучше представляет прогнозируемый результат. График показывает, что обе компании, как ожидается, будут расти, причем Tesla будет расти быстрее, чем GM. Опять же, неопределенность со временем будет увеличиваться, и то, что нижний предел Tesla выше верхнего предела GM в 2020 году, означает, что GM, вероятно, останется впереди.
тренды и модели
Последним шагом в анализе рыночной капитализации является рассмотрение общих тенденций и закономерностей. Пророки облегчают нам это.
# 描绘趋势和规律
gm_prophet.plot_components(gm_forecast)
Разложение временных рядов General Motors
Тенденция ясна: цена акций GM растет и продолжает расти. Но самое интересное в этом году то, что цена акций медленно падала с конца года и до лета. Мы можем проверить, существует ли корреляция между годовой рыночной капитализацией и среднемесячными продажами. Сначала я собираю ежемесячные данные о продажах в Google, а затем использую groupby для усреднения этих месяцев, что является важным шагом, поскольку нам часто нужно сравнить данные по двум категориям, например, по пользователям одной возрастной группы или по разным автомобилям одного производителя. В нашем примере, чтобы рассчитать среднемесячные продажи, нам нужно сложить среднемесячные продажи.
gm_sales_grouped = gm_sales.groupby('Month').mean()
Ежемесячные продажи, кажется, имеют мало общего с рыночной стоимостью. В августе самые высокие продажи, но самая низкая рыночная стоимость!
Из недельного тренда нельзя найти никакого полезного сигнала (нет информации о цене акций в выходные дни, поэтому мы можем смотреть только в будние дни), чего и следовало ожидать, потому чтоСлучайные блуждания в экономикеГоворя о простом взгляде на дневную цену акций, мы не можем сказать нам о каких-либо закономерностях. Наш анализ также доказывает, что акции растут в долгосрочной перспективе, но если мы будем смотреть на это каждый день, даже с лучшими моделями мы вряд ли воспользуемся преимуществами каких-либо закономерностей.
простой видПромышленный индекс Доу-Джонса(индекс акций 30 крупнейших компаний) это хорошо иллюстрирует:
Промышленный индекс Доу-Джонса (источник)
Очевидно, сообщение, которое это собирается сказать вам, состоит в том, чтобы инвестировать еще в 1900 году! Или в реальной жизни не выходите из фондового рынка, когда он падает, потому что история говорит нам, что он снова вырастет. В целом ежедневные изменения слишком малы, чтобы их можно было заметить, если вы хотите смотреть на акцию каждый день, лучше инвестировать во весь рынок и держать его в течение длительного времени.
Оракул также можно использовать для крупномасштабных показателей данных, таких как валовой внутренний продукт (ВВП), показатель размера экономики страны. Я сделал следующие прогнозы, используя модель оракула, основанную на исторических данных о ВВП США и Китая.
Точная дата, когда Китай превзойдет ВВП США, — 2036 год! Слабость этой модели в том, что наблюдений слишком мало (ВВП измеряется ежеквартально, но сила прогнозистов — в ежедневных данных), но она может делать базовые прогнозы при отсутствии макроэкономических знаний.
Существует множество способов моделирования временных рядов, начиная отПростая линейная регрессияприбытьРекуррентная нейронная сеть с LSTM. Полезность модели суммирования заключается в том, что ее легко генерировать и обучать, и она дает прогнозы с неопределенностью с читаемыми закономерностями. Видящий силен, и мы видим только поверхность. Я призываю вас использовать эту статью и ваши записные книжки для изученияНекоторые данные предоставлены Quandlили собственный временной ряд. Обратите внимание на мое применение в повседневной жизни и используйте эти навыки дляАнализ статей, предсказывающих изменение веса. Аддитивные модели — отличный способ начать изучение временных рядов!
мой почтовый адресwjk68@case.edu, поправки и конструктивная критика приветствуются.
Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.