Как можно оценить линии поддержки и сопротивления акции с помощью линейной регрессии

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

Шаг 1. Установка необходимых модулей

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

pip install -r requirements.txt

Шаг 1.1. Импортируйте необходимые модули

Шаг 2. Получение цен закрытия акции.

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

Результатом будет pd.DataFrame объект с 6 столбцами. High, low, open, close, volume и adj close. Поскольку мы хотим смотреть только на цены закрытия, мы можем это сделать.

В этих строках кода мы создаем объект pd.Series и сохраняем цены закрытия акций AAPL внутри этой переменной. Затем мы устанавливаем индекс ряда как массив последовательных чисел от 0 до количества имеющихся у нас цен закрытия. Если распечатать серию, получится вот это.

0     39.480000
1     35.547501
2     37.064999
3     36.982498
4     37.687500
        ...    
57    46.697498
58    47.117500
59    47.180000
60    47.487499
61    47.810001
Name: Close, Length: 62, dtype: float64

Вы можете построить серию и получить ее визуальное представление с помощью matplotlib.

Пока наш код выглядит так.

Шаг 3. Сглаживаем наш график.

Сейчас наши данные на графике выглядят довольно неровно и не подходят для компьютерного анализа. На этом этапе мы попытаемся сгладить наш график, используя функцию savgol_filter из модуля scipy.signal. Функция savgol_filter принимает 3 параметра. Ваш массив, длина окна и полиупорядоченность. Я не буду вдаваться в подробности, однако, не стесняйтесь проверить их документацию по этой функции здесь. Наш массив, очевидно, будет нашей серией. Вы можете думать о длине окна как о желаемом уровне гладкости ваших данных. Чем больше длина окна, тем более гладким будет ваш график, а чем меньше длина окна, тем менее гладким будет ваш график. Чтобы определить, какую длину окна мы хотим использовать, я создал небольшой алгоритм, который я покажу вам через минуту. В этом проекте мы сохраним polyorder равным постоянному числу 3.

Шаг 3.1. Определите гладкость

Чтобы определить желаемую гладкость, нам нужно найти данные за месяцы, которые у нас есть. Так как в каждом месяце примерно 30 дней, мы будем делить полученное количество цен на 30. Мы сохраним это в переменной с именем month_diff. Если month_diff равно 0, то мы изменим значение на 1. Теперь, чтобы определить гладкость графика, мы умножаем наш month_diff на 2 и складываем его с 3.

Мы можем визуализировать это еще раз, используя matplotlib.

Мы можем визуализировать их в сравнении вот так.

Шаг 4. Определение точек локального минимума и локального максимума.

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

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

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

Шаг 5. Линия наилучшего соответствия между локальным минимумом и максимумом.

Теперь мы собираемся найти две наиболее подходящие линии. Один для локальных минимумов и один для локальных максимумов. Для этого мы будем использовать модель Sklearn LinearRegression. Как вы, возможно, уже знаете, уравнение для линейной линии имеет вид y = mx + b, где m - наклон, а b - точка пересечения с y. Мы создадим функцию, которая будет возвращать наклон и точку пересечения по оси Y набора точек.

Сначала нам нужно получить точки x и y из pts, поэтому для этого мы будем использовать понимание списка. Помните, что pts - это список кортежей точек.

[(x1, y1), (x2, y2), (x3, y3), (x4, y4), (x5, y5)]

Для этого нам просто нужно создать модель LinearRegression и подогнать наши X и y данные.

Шаг 6. Построение линий поддержки и сопротивления.

Создать линии поддержки и сопротивления будет довольно просто. Мы будем использовать уравнение y = mx + b.

Пришло время построить линии поддержки и сопротивления и посмотреть, насколько они точны. Вот так они выглядят на гладком графике.

Вот так они выглядят на реальном графике.

Мне это кажется довольно точным. Вы можете получить код и Jupyter Notebook для этого проекта в моем репозитории GitHub здесь.