Как можно оценить линии поддержки и сопротивления акции с помощью линейной регрессии
В этой статье я покажу вам, как можно оценить линии поддержки и сопротивления акции с помощью языка программирования 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 здесь.