Предсказание будущего — это не магия, это искусственный интеллект — Дэйв Уотерс

Что такое ARIMA?

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

Компоненты модели ARIMA следующие:

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

2. Интегрированный (I) компонент: этот компонент используется для того, чтобы сделать временной ряд стационарным, что означает удаление любых тенденций или сезонности, присутствующих в данных. Он включает в себя дифференцирование ряда путем вычитания предыдущего наблюдения из текущего наблюдения.

3. Компонент скользящего среднего (MA): этот компонент моделирует зависимость между наблюдением и остаточной ошибкой из модели скользящего среднего, применяемой к запаздывающим наблюдениям. Он фиксирует краткосрочные зависимости во временном ряду.

Модель ARIMA обозначается как ARIMA (p, d, q), где:

  • p представляет порядок авторегрессионного компонента,
  • d представляет собой порядок дифференцирования, необходимый для того, чтобы сделать временной ряд стационарным.
  • q представляет порядок компонента скользящего среднего.

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

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

Мы стремимся сделать это:

  1. Покажите, как построить нашу модель ARIMA
  2. Разделите годы акций на два набора (первые 10 лет, последние 15 лет).
  3. Используйте модель ARIMA для каждого набора времени и сравните производительность модели с каждым набором времени.

Мы бы сделали это методом «вдоль кода», шаг за шагом.

Шаг 1:

StatsModel — это библиотека Python, которая предоставляет классы и функции для оценки статистических моделей, статистических тестов и

« — user» указывает, что команда должна быть установлена ​​в локальной среде.

pip install ——userstatsmodels

Шаг 2:

Установите необходимые библиотеки, необходимые для сопоставления, анализа и очистки наших данных и выполнения нашей модели на них.

  • Pandas: Pandas — популярная библиотека Python, используемая для обработки и анализа данных. Он предоставляет мощные инструменты для работы со структурированными данными, такими как таблицы и временные ряды. «import pandas as pd» — это оператор, который импортирует библиотеку Pandas в программу Python и назначает ей псевдоним «pd» для удобства ссылки на ее функции и объекты.
  • Matplotlib: Matplotlib — это библиотека Python, используемая для создания визуализаций данных, таких как графики, диаграммы и графики. интерфейс для создания графиков и визуализаций. Псевдоним «plt» обычно используется для ссылки на модуль pyplot в коде.
  • Numpy: NumPy — это библиотека Python, которая обеспечивает поддержку больших многомерных массивов и матриц, а также набор математических функций для эффективной работы с ними. «import numpy as np» — это оператор, используемый в Python для импорта библиотеки NumPy. и сделать его доступным в коде, используя сокращенный псевдоним «np». Это позволяет программисту получать доступ к функциям и классам, предоставляемым NumPy, добавляя к ним префикс «np».
  • Datetime: `datetime` — это библиотека Python, которая предоставляет классы для управления датами, временем и временными интервалами. Это позволяет более удобно и эффективно работать с датами и временем. Когда вы пишете `import datetime` в Python, вы импортируете модуль `datetime` из стандартной библиотеки Python. Этот модуль содержит различные классы и функции для работы с датами, временем и временными интервалами. Он предоставляет ряд функций, таких как создание, форматирование, сравнение и выполнение арифметических операций с датами и временем.
import pandas as pd
import matplotlib.plyplot as plt
import numpy as np
import datetime

Шаг 3:

Я получил набор данных об акциях Amazon 2022 от Kaggle.com. Он был в формате CSV, и таким образом его нельзя было использовать.

Библиотека Python, Pandas, дает нам возможность читать этот формат CSV в табличном формате для анализа.

  • df = pd.read_csv("AMZN.csv"): читает CSV-файл с именем "AMZN.csv" и сохраняет его содержимое в переменной с именем "df" с помощью библиотеки Pandas.
  • df.head(): функция df.head() используется для отображения первых нескольких строк DataFrame в Python.
df = pd.read_csv(“AMZN.csv”)

df.head()

Для этого проекта вы сделаете прогноз акций Amazon на первые десять лет, а затем на следующие 15 лет.

Затем мы шли сравнивать выступления.

Шаг 4:

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

1. df[‘Date’] = pd.to_datetime(df[Date]):Мы смотрим на наклейки на игрушках и преобразовываем их во что-то, понятное компьютеру. Это как перевод дат с наклеек на язык, понятный компьютеру. Этот шаг важен, поскольку компьютеру необходимо, чтобы даты были в специальном формате для правильной работы с ними.

2. max_date = df[‘Date’]:max() помогает нам узнать, на какой игрушке указана самая последняя дата на наклейке. Это как смотреть на все игрушки и находить ту, у которой самая последняя дата. Эта информация может быть полезна, потому что иногда мы хотим знать самую последнюю дату для принятия решений.

3. min_date= df[‘Date’]:min() делает обратное. Это помогает нам найти игрушку с самой ранней датой на наклейке. Это как посмотреть на все игрушки и найти ту, у которой самая старая дата. Эта информация также может быть важна, потому что иногда мы хотим знать самую раннюю дату, чтобы понять начало чего-либо.

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

df['Date'] = pd.to_datetime(df['Date'])
max_date = df['Date'].max()
min_date = df['Date'].min()

Шаг 5:

Теперь мы хотим разделить набор данных, который имел временной диапазон 1997–2022 гг.

Мы разделились на два набора: первый набор охватывает первые 15 лет, а следующий набор — последние 10 лет.

Зачем мы это делаем?

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

Для этого нам нужно указать даты начала и окончания периода времени, который мы хотим проанализировать. В представленном коде «start_date_first_set» представляет дату, когда мы хотим начать наш анализ, то есть 15 мая 1997 года. «end_date_first_set» представляет дату, когда мы хотим закончить наш анализ, то есть 15 мая 2012 года.

Затем мы создаем новый фрейм данных с именем «amazon_first_15_years_1997», выбирая только строки из исходного фрейма данных, даты которых находятся между «start_date_first_set» и «end_date_first_set». Это как выбирать только свои любимые игрушки, которые у вас были с пяти до 20 лет.

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

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

start_date_first_set = pd.to_datetime('1997-05-15')
end_date_first_set = pd.to_datetime('2012-05-15')


amazon_first_15_years_1997 = df[(df['Date'] >= start_date_first_set) & (df['Date'] <= end_date_first_set)]
amazon_first_15_years_1997
amazon_first_15_years_1997.set_index('Date', inplace=True)

Шаг 7:

Разберем каждую строку этого кода

1. amazon_first_15_years_1997 = amazon_first_15_years_1997.resample(‘w’).mean()

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

2. amazon_first_15_years_1997 = amazon_first_15_years_1997[[‘Корректировка закрыта’]]

Теперь, когда у нас есть систематизированные конфеты (средненедельные цены акций), предположим, что нас интересуют только конфеты определенного цвета, скажем, красные конфеты. Мы можем использовать двойные скобки «[[]]», чтобы выбрать только красные конфеты из нашей организованной группы. Точно так же мы выбираем только один тип данных из наших цен на акции, который представляет собой «скорректированную цену закрытия» акций Amazon.

3. amazon_first_15_years_1997.head()

Теперь, когда у нас есть выбранные красные конфеты («Скорректированные цены закрытия» для акций Amazon), мы хотим быстро взглянуть на первые несколько конфет. «Head()» — это то же самое, что выбрать несколько первых конфет из кучи, чтобы посмотреть, как они выглядят. Здесь мы показываем первые несколько строк «скорректированных цен закрытия» акций Amazon.

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

amazon_first_15_years_1997 = amazon_first_15_years_1997.resample(‘w’).mean()
amazon_first_15_years_1997 = amazon_first_15_years_1997[[‘Adj Close’]]
amazon_first_15_years_1997.head()

Выход

 Adj Close
Date 
1997-05-18 1.843750
1997-05-25 1.533333
1997-06-01 1.529948
1997-06-08 1.520834
1997-06-15 1.600000

Шаг 8

Разберем каждую строку этого кода:

amazon_first_15_years_1997[‘weekly_returns’]:эта часть похожа на специальное место для записи скорости нашей игрушечной машинки. Мы создаем новый столбец с именем «weekly_returns» в таблице с именем amazon_first_15_years_1997 для хранения рассчитанных доходов.

np.log(amazon_first_15_years_1997[‘Adj Close’]):Эта часть похожа на использование волшебной формулы для расчета скорости нашей игрушечной машинки. Здесь мы берем значения «Adj Close» цены акций Amazon (которые представляют собой цену в конце каждой недели) и применяем к ним математическую функцию, называемую «log».

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

Вторая строка кода, amazon_first_15_years_1997, просто показывает нам обновленную таблицу с недавно добавленным столбцом «weekly_returns».

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

При построении модели ARIMA для торговли акциями функции `.log()` и `.diff()` играют важную роль в предварительной обработке данных и обеспечении их пригодности для анализ. Позвольте мне объяснить их значение, используя простые аналогии.

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

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

Итак, почему эти функции важны при построении модели ARIMA?

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

2. `.diff()`: расчет разницы между последовательными логарифмическими преобразованиями цен на акции помогает фиксировать изменения в поведении акций с течением времени. Он дает представление о волатильности акций и помогает определить тенденции и закономерности.

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

Таким образом, функции `.log()` и `.diff()` необходимы для построения модели ARIMA, поскольку они помогают предварительно обрабатывать данные, стабилизировать их значения, фиксируйте изменения с течением времени и создавайте подходящие входные данные для точных прогнозов.

amazon_first_15_years_1997[‘weekly_returns’] = np.log(amazon_first_15_years_1997[‘Adj Close’]).diff()
amazon_first_15_years_1997


Adj Close weekly_returns
Date  
1997-05-18 1.843750 NaN
1997-05-25 1.533333 -0.184358
1997-06-01 1.529948 -0.002210
1997-06-08 1.520834 -0.005975
1997-06-15 1.600000 0.050745
... ... ...
2012-04-22 189.208002 0.000074
2012-04-29 199.166003 0.051292
2012-05-06 229.125998 0.140133
2012-05-13 225.281998 -0.016919
2012-05-20 223.659996 -0.007226
784 rows × 2 columns
amazon_first_15_years_1997.dropna(inplace=True)

Шаг 9:

Давайте посмотрим на график еженедельных возвратов.

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

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

amazon_first_15_years_1997.weekly_returns.plot(figsize=(12,6))

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

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

Модель ARIMA объединяет информацию из графика со статистическими расчетами, чтобы обеспечить более точные прогнозы. Он учитывает не только прошлые результаты, но и основные закономерности и тенденции в данных, чтобы делать прогнозы о будущих ценах на акции.

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

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

udiff = amazon_first_15_years_1997.drop([‘Adj Close’],axis=1)
udiff.head()

Начинается правильная работа.

На следующих шагах мы начнем фактически строить нашу модель ARIMA. Мы сделали много предварительной обработки данных; пришло время погрузиться!

Шаг 10:

Мы импортировали некоторые из необходимых библиотек

  1. `import statsmodels.api as sm`: эта строка похожа на вызов специального помощника по имени `sm`, который помогает нам с нашими расчетами и прогнозами. Точно так же, как вы просите помощи у взрослых, когда вам нужно решить головоломку или сообразить что-то хитрое.

2. `из statsmodels.tsa.stattools import adfuller`: этот инструмент помогает нам проверить, подходят ли наши данные для прогнозирования. Это похоже на использование увеличительного стекла для тщательного изучения объекта.

Теперь давайте поговорим о том, почему эти линии важны для построения торговой модели ARIMA.

Чтобы построить модель ARIMA, нам понадобится помощь библиотек, таких как `statsmodels`. Эти библиотеки содержат готовые инструменты и функции, облегчающие нашу работу. Вот почему мы импортируем их в первую строку.

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

import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller

Что такое «адфуллер»?

Аббревиатура ADF в «adfuller» расшифровывается как Augmented Dickey-Fuller. Расширенный тест Дики-Фуллера — это статистический тест, используемый для определения того, является ли набор данных временного ряда стационарным или нет.

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

Тест ADF помогает нам определить, является ли данный временной ряд стационарным или нестационарным. Он делает это, исследуя наличие единичного корня, который является индикатором нестационарности. Если тест ADF указывает на наличие единичного корня, это предполагает, что данные нестационарны. С другой стороны, если тест ADF не находит единичный корень, это предполагает, что данные стационарны.

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

Шаг 11:

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

Позвольте мне объяснить каждую строку этого кода

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

  1. `rolmean = udiff.rolling(20).mean()`:

Представьте, что у вас есть длинный список чисел, представляющих температуру каждый день в прошлом году. Эта строка похожа на маленькое окно и перемещение его по списку чисел. Каждый раз, когда вы перемещаете окно на один день, вы вычисляете среднее (среднее) чисел внутри окна. Так, например, если размер окна равен 20, вы должны взять первые 20 чисел, вычислить их среднее значение, затем переместить окно на один день и вычислить среднее значение следующих 20 чисел и так далее. Строка `rolmean = udiff.rolling(20).mean()` сохраняет эти средние значения в новом списке, называемом `rolmean`.

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

2. `olstd = udiff.rolling(20).std()`:

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

Почему это важно? Стандартное отклонение помогает нам понять, насколько сильно колеблется температура изо дня в день. Если стандартное отклонение высокое, это означает, что погода сильно меняется, в то время как низкое стандартное отклонение указывает на более стабильные погодные условия. Эта информация может быть полезна для прогнозирования того, будет ли погода в будущем постоянной или непредсказуемой.

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

rolmean = udiff.rolling(20).mean()
rolstd = udiff.rolling(20).std()

Шаг 12:

Давайте построим график скользящего среднего значения и стандартного отклонения по еженедельной доходности Amazon.

plt.figure(figsize=(12,6))
plt.plot(udiff,color='blue',label='Original returns')
plt.plot(rolmean,color='red',label='Rolling Mean')
plt.plot(rolstd, color=black, label=Rolling Std Deviation ')
plt.legend(loc='best')
plt.show()

Вывод выглядит следующим образом:

Давайте сформулируем несколько гипотез, основанных на «наблюдении глазами» за графиками.

1. Основываясь на скользящем среднем, мы имеем рынок, ограниченный диапазоном (рынок кажется ограниченным значениями 0,05 и -0,05), без последовательного восходящего или нисходящего тренда.

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

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

Шаг 13:

Давайте реализуем наш тест Дикки Фуллера, чтобы проверить нашу гипотезу.

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

  1. dftest = sm.tsa.adfuller(udiff.weekly_returns, autolag='AIC')

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

2. dfoutput = pd.Series(dftest[0:4], index=[‘Статистика теста’, ‘значение p’, ‘Количество задержек’, ‘Количество наблюдений’])

Машина из предыдущего шага дает нам некоторые результаты, и мы хотим их записать. У нас есть блокнот с четырьмя строками для заполнения. Первая строка предназначена для «Тестовой статистики», которая похожа на оценку, которую машина дает, чтобы сказать нам, стоит машина или нет. Вторая строка предназначена для «p-значения», которое является мерой того, насколько машина уверена в своем решении. Третья строка предназначена для «Количество задержек», которая сообщает нам, на сколько шагов назад нам нужно посмотреть, чтобы понять схему движения автомобиля. Четвертая строка предназначена для «No of Observation», которая сообщает нам, сколько раз машина просматривала движения автомобиля, чтобы принять решение.

Строка «dfoutput» похожа на запись результатов машины в блокнот с использованием этих конкретных меток для каждой строки.

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

dftest = sm.tsa.adfuller(udiff.weekly_returns,autolag=’AIC’)
dfoutput = pd.Series(dftest[0:4],index=[‘Test Stats’,’p-value’,’No of Lags’,’No of Observation ‘])
dfoutput

Это результаты

Test Stats           -6.737048e+00
p-value               3.187946e-09
No of Lags            1.600000e+01
No of Observation: 7.660000e+02

Что означают эти параметры?

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

2. p-значение: p-значение является мерой того, насколько мы можем быть уверены в результатах теста. Он говорит нам о вероятности того, что наблюдаемая тестовая статистика возникла случайно. Проще говоря, это помогает нам определить надежность теста. Если p-значение низкое (обычно ниже определенного порога, например 0,05), это говорит о том, что результаты теста статистически значимы, и мы можем им доверять. И наоборот, высокое значение p указывает на то, что результаты теста могут быть ненадежными.

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

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

Давайте обсудим автозадержку и "AIC"

В контексте торговой модели ARIMA autolag — это параметр, определяющий метод, используемый для автоматического выбора количества лагов (No of Lags) в модели. AIC расшифровывается как Информационный критерий Акаике. Это статистическая мера, которая помогает нам выбрать лучшую модель, уравновешивая сложность модели и то, насколько хорошо она соответствует данным. Думайте об этом, как о примерке обуви разных размеров, чтобы найти ту, которая идеально вам подходит. Autolag = AIC означает, что машина будет автоматически выбирать количество задержек в модели ARIMA на основе критерия AIC. Это гарантирует, что мы выберем оптимальное количество лагов, не делая модель слишком сложной или слишком упрощенной.

Используя autolag = AIC, мы можем позволить машине выбрать задержку за нас, гарантируя, что модель ARIMA хорошо подходит для точных прогнозов на основе доступных данных.

Интерпретация результатов

Основываясь на предоставленных результатах, давайте интерпретируем каждый компонент:

  1. Test Stats (Тестовая статистика): Значение тестовой статистики равно -6,737048e+00. В этом случае отрицательное значение предполагает, что доходность акций, вероятно, будет стационарной. Думайте об этом как о получении отрицательного балла по тесту, который указывает на то, что доходность акций демонстрирует предсказуемую модель с течением времени.

2. p-значение: p-значение составляет 3,187946e-09, что является чрезвычайно малым значением. В данном контексте это означает, что вероятность случайного наблюдения тестовой статистики (-6,737048e+00) очень мала. Как правило, если значение p ниже определенного порога (например, 0,05), мы можем считать результаты статистически значимыми. Следовательно, в данном случае маленькое значение р предполагает, что доходность акций действительно стационарна, а не случайна.

3. Количество лагов (количество лагов): количество лагов равно 16 (1,600000e+01). Это указывает на то, что нам нужно оглянуться на 16 периодов времени, чтобы понять характер доходности акций. Представьте, что вы просматриваете заметки за последние 16 дней, чтобы выявить любые повторяющиеся закономерности или тенденции в поведении акций.

4. Количество наблюдений (Number of Observations): количество наблюдений равно 766 (7,660000e+02). Это означает, что мы зафиксировали движения запаса в течение 766 случаев или моментов времени. Дополнительные наблюдения обеспечивают более широкое представление о поведении акций и могут повысить точность прогнозов.

Подводя итог, можно сказать, что, основываясь на предоставленных результатах, статистика тестирования и чрезвычайно низкое значение p позволяют предположить, что доходность акций, вероятно, будет стационарной, что указывает на предсказуемую закономерность. Кроме того, относительно большое количество лагов (16) означает, что нам необходимо учитывать предыдущие 16 периодов, чтобы понять поведение акции. Кроме того, значительное количество наблюдений (766) указывает на то, что у нас есть значительный объем данных для анализа и прогнозирования.

Следовательно, мы видим, что наша гипотеза нулевая, и мы можем опровергнуть ее, используя тест Адфуллера.

Технически мы говорим: «Мы отвергаем нулевую гипотезу».

Шаг 14

Чтобы построить модель ARIMA (авторегрессионное интегрированное скользящее среднее), нам нужно определить соответствующие значения для трех ключевых параметров: p, d и q. Эти параметры представляют порядок авторегрессии (p), порядок разности (d) и порядок скользящего среднего (q) соответственно.

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

Что такое диаграммы ACF и PACF?

Диаграммы ACF (функция автокорреляции) и PACF (функция частичной автокорреляции): диаграммы ACF и PACF помогают нам определить значения p, d и q для модели ARIMA.

Диаграмма ACF: представьте, что у вас есть группа друзей, которые играют в игру, передавая сообщение шепотом от одного человека другому. Диаграмма ACF похожа на вопрос каждого человека, что он услышал от предыдущего человека. Это помогает нам понять, насколько сильно прошлые значения переменной влияют на текущее значение. Глядя на диаграмму ACF, мы можем найти значение параметра q, определив количество шепотов, которые оказывают значительное влияние на текущее значение.

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

Анализируя графики ACF и PACF, мы можем определить значения p и q, которые указывают на влияние прошлых значений и прошлых ошибок прогноза соответственно. Параметр d, представляющий разность, можно определить, наблюдая, сколько раз нам нужно удалить блоки из стека (или вычесть предыдущие значения), чтобы сделать переменную стационарной. Эти параметры важны, потому что они помогают нам построить модель ARIMA, которая фиксирует закономерности и взаимосвязи в данных, что позволяет нам делать точные прогнозы.

Давайте построим их

from statsmodels.graphics.tsaplots import plot_acf
fig,ax = plt.subplots(figsize=(12,5))
plot_acf(udiff.values,lags=10,ax=ax)
plt.show

Для диаграммы PACF

Из приведенных выше графиков мы можем выбрать параметры p и q равными 7 и 1 соответственно.

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

На графике ACF у нас есть точки 1, 6 и 7. На графике PACF у нас есть точки 1, 6 и 7.

Шаг 13:

Теперь мы подходим к нашей модели ARIMA.

from statsmodels.tsa.arima_model import ARMA
ar1 =ARMA(tuple(udiff.values),(7,1)).fit()
ar1.summary()

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

Теперь давайте разберем код:

  1. `from statsmodels.tsa.arima_model import ARMA`: это похоже на использование специального инструмента (библиотеки), который может помочь нам построить модель ARMA. Точно так же, как вы принесли бы набор для ремонта игрушечной машинки, чтобы починить свою игрушечную машинку.

2. `ar1 = ARMA(tuple(udiff.values), (7,1)).fit()`: мы создаем новый объект с именем `ar1` и используем инструмент модели ARMA для подбора это с нашими данными. «udiff.values» похожи на набор прошлых движений цены акций, и мы помещаем их в модель ARMA, чтобы понять, как цена акций менялась с течением времени. Это все равно, что изучать движения игрушечной машинки и выяснять, как она управлялась в прошлом.

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

Таким образом, построение торговой модели ARIMA похоже на использование специального инструмента (ARMA) для понимания и прогнозирования будущих движений цены акций, точно так же, как вы исследуете прошлые движения игрушечной машинки, чтобы предсказать, как она будет двигаться в будущем. Код помогает нам создать модель, сопоставить ее с данными и получить сводный отчет для оценки ее производительности.

Это результаты.

Dep. Variable:	y	No. Observations:	783
Model:	ARMA(7, 1)	Log Likelihood	898.956
Method:	css-mle	S.D. of innovations	0.077
Date:	Tue, 30 May 2023	AIC	-1777.911
Time:	21:05:10	BIC	-1731.280
Sample:	0	HQIC	-1759.979
coef	std err	z	P>|z|	[0.025	0.975]
const	0.0061	0.003	1.827	0.068	-0.000	0.013
ar.L1.y	-0.1067	0.250	-0.427	0.669	-0.596	0.383
ar.L2.y	0.0057	0.060	0.095	0.924	-0.111	0.122
ar.L3.y	-0.0058	0.038	-0.151	0.880	-0.081	0.069
ar.L4.y	-0.0210	0.036	-0.583	0.560	-0.091	0.050
ar.L5.y	0.0006	0.036	0.017	0.986	-0.071	0.072
ar.L6.y	0.1029	0.036	2.871	0.004	0.033	0.173
ar.L7.y	-0.0538	0.045	-1.197	0.231	-0.142	0.034
ma.L1.y	0.3088	0.248	1.244	0.213	-0.178	0.795
Roots
Real	Imaginary	Modulus	Frequency
AR.1	-1.3158	-0.0000j	1.3158	-0.5000
AR.2	-0.7778	-1.0890j	1.3383	-0.3487
AR.3	-0.7778	+1.0890j	1.3383	0.3487
AR.4	0.5554	-1.3624j	1.4713	-0.1884
AR.5	0.5554	+1.3624j	1.4713	0.1884
AR.6	1.8361	-0.5190j	1.9081	-0.0438
AR.7	1.8361	+0.5190j	1.9081	0.0438
MA.1	-3.2385	+0.0000j	3.2385	0.5000

Давайте интерпретируем эти результаты:

  • отд. Переменная: «y» представляет то, что мы пытаемся предсказать.
  • Нет. Наблюдения: мы просмотрели 783 фрагмента информации, чтобы понять закономерность.
  • Модель: ARMA (7, 1) — название инструмента, который мы использовали.
  • Логарифмическая вероятность: инструмент хорошо справился с пониманием данных и набрал 898,956 баллов из 1000 с точки зрения понимания.
  • С.Д. инноваций: прогнозы инструмента могут отличаться от фактических значений примерно на 0,077 единицы.
  • AIC: инструмент набрал -1777,911. Более низкие баллы означают лучшее понимание и предсказание.
  • BIC: инструмент набрал -1731,280. Более низкие баллы означают лучшее понимание и предсказание.
  • HQIC: инструмент набрал -1759,979. Более низкие баллы означают лучшее понимание и предсказание.

Коэффициенты от ar.L1.y до ar.L7.y представляют влияние прошлых значений на текущее значение, которое мы пытаемся предсказать. Каждый коэффициент соответствует определенному прошлому значению.

  • ar.L1.y (-0,1067): этот коэффициент говорит нам, как значение на один шаг назад (L1) влияет на текущее значение. В данном случае коэффициент отрицательный (-0,1067), а это означает, что при снижении предыдущего значения, скорее всего, уменьшится и текущее значение. Однако величина коэффициента (0,1067) свидетельствует о том, что влияние не очень сильное.
  • ar.L2.y (0,0057): Этот коэффициент представляет влияние значения два шага назад (L2) на текущее значение. В данном случае коэффициент положительный (0,0057), что указывает на то, что при увеличении значения двух шагов назад текущее значение имеет тенденцию к незначительному увеличению. Однако коэффициент мал, что свидетельствует о более слабом влиянии.
  • ar.L3.y (-0,0058): этот коэффициент представляет влияние значения, полученного тремя шагами назад (L3), на текущее значение. Коэффициент отрицательный (-0,0058), что указывает на то, что при уменьшении значения трех шагов назад ожидается небольшое уменьшение текущего значения. Однако, как и предыдущий коэффициент, влияние относительно невелико.
  • ar.L4.y (-0,0210): Этот коэффициент описывает влияние значения четыре шага назад (L4) на текущее значение. Отрицательный коэффициент (-0,0210) говорит о том, что уменьшение значения четыре шага назад соответствует незначительному уменьшению текущего значения. Опять же, величина коэффициента относительно мала.
  • ar.L5.y (0,0006): Этот коэффициент относится к влиянию значения пять шагов назад (L5) на текущее значение. Коэффициент близок к нулю (0,0006), что свидетельствует об очень слабом или незначительном влиянии.
  • ar.L6.y (0,1029): Этот коэффициент представляет влияние значения шесть шагов назад (L6) на текущее значение. Положительный коэффициент (0,1029) говорит о том, что увеличение значения шесть шагов назад соответствует умеренному увеличению текущего значения.
  • ar.L7.y (-0,0538): Этот коэффициент описывает влияние значения семь шагов назад (L7) на текущее значение. Отрицательный коэффициент (-0,0538) указывает на то, что уменьшение значения семь шагов назад приводит к незначительному уменьшению текущего значения.

P›|z| столбец содержит p-значения, связанные с каждым коэффициентом. Значение p говорит нам о вероятности того, что коэффициент на самом деле равен нулю или не влияет на прогноз. Вот как мы можем интерпретировать числа:

  • Для коэффициента с p-значением менее 0,05 (обычно используется пороговое значение) это означает, что существуют убедительные доказательства того, что коэффициент является статистически значимым. Другими словами, коэффициент оказывает существенное влияние на прогноз.
  • С другой стороны, если коэффициент имеет p-значение больше 0,05, это означает, что недостаточно доказательств, чтобы предположить, что коэффициент значительно отличается от нуля. В этом случае мы бы считали коэффициент статистически незначимым или не оказывающим существенного влияния на прогноз.

Теперь давайте посмотрим на конкретные числа в P›|z| столбец из ваших результатов:

  • const: значение p, связанное с постоянным членом, равно 0,068. Поскольку это значение больше 0,05, можно предположить, что константа может не оказывать статистически значимого влияния на прогноз. Однако он все еще близок к пороговому значению, поэтому рассматривать его следует с осторожностью.
  • от ar.L1.y до ar.L7.y: значения p, связанные с этими коэффициентами, находятся в диапазоне от 0,231 до 0,986. Все эти значения превышают 0,05, что указывает на отсутствие достаточных данных, позволяющих предположить значительное влияние этих коэффициентов на прогноз.
  • ma.L1.y: значение p для этого коэффициента составляет 0,213, что больше 0,05. Точно так же это предполагает, что этот коэффициент может не иметь статистически значимого влияния на прогноз.

Таким образом, на основе p-значений в P›|z| столбца, можно сказать, что коэффициенты в модели ARMA, за исключением постоянного члена, могут не оказывать статистически значимого влияния на прогноз. Однако важно отметить, что интерпретация статистической значимости зависит от выбранного порога (обычно 0,05) и контекста анализа.

Давайте сделаем прогноз с нашей моделью

plt.figure(figsize=(12,8))
plt.plot(udiff.values,color='blue')
preds=ar1.fittedvalues
plt.plot(preds,color='red')
plt.show()

Мы видим, что наша модель хорошо улавливает основной тренд в наших еженедельных доходах.

Давайте затем спрогнозируем акции Amazon на 12 недель вперед.

steps = 12
forecast = ar1.forecast(steps=steps)[0]




plt.figure(figsize=(12, 8))
plt.plot(udiff.values, color='blue')

preds = ar1.fittedvalues
plt.plot(preds, color='red')

plt.plot(pd.DataFrame(np.array([preds[-1],forecast[0]]).T,index=range(len(udiff.values)+1, len(udiff.values)+3)), color='green')
plt.plot(pd.DataFrame(forecast,index=range(len(udiff.values)+1, len(udiff.values)+1+steps)), color='green')
plt.title('Display the predictions with the ARIMA model')
plt.show()

Результаты

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

В течение следующих 10 лет я публиковал графики еженедельной доходности, результаты тестов adfuller, графики ACF и PACF, результаты модели ARIMA, графики подогнанных значений и прогноз на 2 недели вперед и 12 недели в будущее.

График еженедельной доходности за 2013–2022 гг.

Диаграмма скользящего среднего и стандартного значения, построенная по недельным доходам.

Результаты расширенного теста Дикки Фуллера

Test Stats           -1.489970e+01
p-value               1.513532e-27
No of Lags            1.000000e+00
No of Observation     4.600000e+02

Результаты для диаграмм ACF и PACF.

Результаты модели ARIMA.

ARMA Model Results
Dep. Variable: y No. Observations: 462
Model: ARMA(2, 1) Log Likelihood 927.241
Method: css-mle S.D. of innovations 0.033
Date: Sat, 03 Jun 2023 AIC -1844.481
Time: 20:34:31 BIC -1823.804
Sample: 0 HQIC -1836.340
coef std err z P>|z| [0.025 0.975]
const 0.0054 0.002 3.265 0.001 0.002 0.009
ar.L1.y 0.4657 0.537 0.868 0.386 -0.586 1.518
ar.L2.y -0.1548 0.105 -1.481 0.139 -0.360 0.050
ma.L1.y -0.2449 0.544 -0.451 0.652 -1.310 0.820
Roots
Real Imaginary Modulus Frequency
AR.1 1.5044 -2.0489j 2.5419 -0.1492
AR.2 1.5044 +2.0489j 2.5419 0.1492
MA.1 4.0825 +0.0000j 4.0825 0.0000

Мы видим, что наша модель работает лучше на этом наборе данных.

Мы строим график нашего прогноза Amazon на 2 недели вперед.

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

Ссылка на код здесь, на Github.com

Буду признателен за вопросы, комментарии и т.