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

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

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

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

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

К-средние - очень популярный алгоритм машинного обучения без учителя. По сути, он берет ваши данные, пытается создать K групп, которые вы определяете (мы вернемся к этому позже), и группирует данные на основе их близости к центру каждой из K групп / кластеров.

Если вы хотите узнать больше о том, как работают K-Means, я рекомендую прочитать https://towardsdatascience.com/understanding-k-means-clustering-in-machine-learning-6a6e67336aa1

Теперь, когда мы рассмотрели основы, перейдем к реализации. Кстати, весь код у меня на GitHub. Давайте сначала прочитаем данные с помощью пакета python mpl_finance, который использует Yahoo api. Меня интересует дневная торговля, поэтому я смотрю на однодневный период с 1-минутными барами, но вы можете смотреть на дневной бар и искать долгосрочные уровни поддержки / сопротивления, идея все та же.

Последняя строка - это функция, которую мы используем для построения данных об акциях, чтобы мы знали, с чем мы работаем. Он создает 2 подсюжета, один для цены и один для объема, с использованием EST, поскольку я работаю с ценными бумагами, котирующимися на Nasdaq / NYSE, и время торгов с 09:30 EST до 16:00 EST.

Если я построю первые 60 минут открытия CBIO 19.12.2019, мы получим следующий график. Я действительно торговал CBIO в тот день и смотрел его вживую, поэтому я знаю, что мы отрисовали график с точностью до минуты 🙂

Теперь, прежде чем мы перейдем к следующему разделу: Вверху мы кратко упомянули о выборе K в качестве количества кластеров в нашей классификации. Итак, взяв эти данные о запасах и желая создать кластеры, как нам выбрать, сколько кластеров запрашивать? К счастью, у этой проблемы есть простое решение.

Обычно рекомендуется, чтобы K было числом от 1 до 10. Это всего лишь диапазон чисел, для которого лучше всего подходят алгоритмы. Например, если у вас есть классификация из 1000 уникальных классов или более, вы можете посмотреть другие альтернативы (например, нейронные сети и т. Д.). Но поскольку мы смотрим на график с менее чем 100 точками данных (за первый торговый час или около того) или максимум с несколькими сотнями за весь торговый день, весьма вероятно, что количество необходимых нам групп будет меньше 10 или около того. И на самом деле есть научный метод определения этого числа.

Что мы можем сделать, так это создать K-кластеры с различными значениями K от 1 до 10, и для каждой модели мы вычисляем совокупную когерентность каждого кластера, которая называется инерцией кластера. Затем мы выбрали K, чтобы изменение инерции было минимальным, метод изгиба.

Инерция вычисляется внутренне следующим образом: допустим, у нас есть 3 в качестве нашего K, поэтому у нас есть 3 кластера. Для каждого кластера алгоритм вычисляет центр (среднее значение) его членов, затем вычисляет расстояние каждого члена до этого центра (среднее значение). Сумма этих добавленных расстояний называется инерцией. Таким образом, чем меньше инерция, тем лучше когерентность созданного нами кластера. Само собой разумеется, что инерция = 0 означает, что все точки находятся на нулевом расстоянии от центра кластера, что означает, что либо в ваших данных нет дисперсии, либо у вас есть K, равное количеству точек данных, и в этом случае вы больше - соответствие вашим данным. Если у вас такая большая инерция, возможно, вы недооцениваете свои данные и, возможно, захотите увеличить K.

Если мы построим график K-инерции, мы увидим, что после точки изгиба при K = 3 изменение инерции становится минимальным, так что она приближается к сходимости. Следовательно, в этом примере K выбран равным 3.

Чтобы выбрать это программно, есть несколько способов. Самым простым было бы установить порог дельты между инерциями на каждой остановке, чтобы, если прогрессирование K от i до i + 1 не дало нам хотя бы этой дельты улучшения инерции, мы остановились и вернули i в качестве значения К.

Теперь, когда мы получили оптимальный K и созданные им кластеры (optim_clusters), мы можем получить доступ к центрам кластеров, используя свойство cluster_centers_ в optim_clusters.

Я хотел создать 2 отдельных K-средних: одно для минимумов и одно для максимумов. Чтобы найти поддержку, мы используем минимумы свечей, чтобы найти сопротивления, мы используем максимумы свечей.

и если мы выведем отсортированные low_centers и high_centers, мы получим:

Минусы: [[5.80], [5.95], [6.10], [6.22] [6.44], [6.58]]
Максимумы: [[5.90], [6.12], [6.30], [6.56], [ 6.70]]

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

Похоже, он хорошо поработал. Как насчет разных временных рамок, 15 минут, 30 минут? Как насчет всего торгового дня?

15-минутный график

30-минутный график:

Полный дневной график:

Здесь я построил еще одну линию поддержки, поскольку есть больше точек данных, как вы можете видеть, наши ключевые уровни теперь 5,82, 6,22 и 6,44 и сопротивление на уровне 7,80.

Это оно. При небольшом количестве строк кода и небольшом предварительном обучении или написании жестко запрограммированных определений / алгоритмов мы позволяем моделям машинного обучения определять для нас уровни поддержки и сопротивления. Полный код можно найти на моем GitHub. Спасибо за прочтение.