В 8 классе меня посадили на 2 недели и у меня отобрали телефон. Поэтому мне пришлось прибегнуть к альтернативному времяпрепровождению.

Прибираясь в шкафу в поисках занятия, я наткнулась на одну из папиных книг по инвестированию.

Пассивный доход, реинвестирование дивидендов, NASDAQ, недорогие ETF, йада, йада, йада.

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

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

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

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

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

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

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

Используемый нами набор данных содержит более 41 000 минут данных, записанных с апреля по август 2017 года по всем ценам на акции S&P 500, в дополнение к цене его индекса.

Тренировочные и тестовые данные

Набор данных был разделен на обучающие и тестовые данные.

Данные обучения содержат 80% даты.

Обратите внимание, что данные не перемешивались, а нарезались последовательно.

# Training and test data
train_start = 0
train_end = int ( np.floor ( 0.8*n ) )
test_start = train_end
test_end = n
data_train = data [ np.arange ( train_start, train_end ), :]
data_test = data[ np.arange( test_start, test_end ), :]

Заполнители

X содержит входные данные (цена всех акций S&P 500 в момент времени T = t), а Y содержит выходные данные сети (индексная цена S&P 500 в момент времени T = t + 1).

# Placeholder
X = tf.placeholder(dtype=tf.float32, shape=[None, n_stocks])
Y = tf.placeholder(dtype=tf.float32, shape=[None])

Переменные

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

Модель состоит из четырех скрытых слоев. Первый слой содержит 1024 нейрона.

Последующие скрытые слои всегда вдвое меньше предыдущего слоя, что означает 512, 256 и 128 нейронов.

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

n_stocks = 500
n_neurons_1 = 1024
n_neurons_2 = 512
n_neurons_3 = 256
n_neurons_4 = 128
n_target = 1
# Layer 1
W_hidden_1 = tf.Variable(weight_initializer([n_stocks, n_neurons_1]))
bias_hidden_1 = tf.Variable(bias_initializer([n_neurons_1]))
# Layer 2
W_hidden_2 = tf.Variable(weight_initializer([n_neurons_1, n_neurons_2]))
bias_hidden_2 = tf.Variable(bias_initializer([n_neurons_2]))
# Layer 3
W_hidden_3 = tf.Variable(weight_initializer([n_neurons_2, n_neurons_3]))
bias_hidden_3 = tf.Variable(bias_initializer([n_neurons_3]))
# Layer 4
W_hidden_4 = tf.Variable(weight_initializer([n_neurons_3, n_neurons_4]))
bias_hidden_4 = tf.Variable(bias_initializer([n_neurons_4]))
# Output layer
W_out = tf.Variable(weight_initializer([n_neurons_4, n_target]))
bias_out = tf.Variable(bias_initializer([n_target]))

Сетевая архитектура

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

Скрытые слои сети преобразуются функциями активации.

Функции активации являются важными элементами сетевой архитектуры, поскольку они вносят в модель определенный уровень нелинейности.

# Hidden layer
hidden_1 = tf.nn.relu(tf.add(tf.matmul(X, W_hidden_1), bias_hidden_1))
hidden_2 = tf.nn.relu(tf.add(tf.matmul(hidden_1, W_hidden_2), bias_hidden_2))
hidden_3 = tf.nn.relu(tf.add(tf.matmul(hidden_2, W_hidden_3), bias_hidden_3))
hidden_4 = tf.nn.relu(tf.add(tf.matmul(hidden_3, W_hidden_4), bias_hidden_4))
# Output layer 
out = tf.transpose(tf.add(tf.matmul(hidden_4, W_out), bias_out))

Модель состоит из трех основных строительных блоков.

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

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

Функция стоимости

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

# Cost function
mse = tf.reduce_mean(tf.squared_difference(out, Y))

Нейронная сеть

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

Набор обучающих данных делится на n / batch_size пакеты, которые последовательно передаются в сеть. В этот момент в игру вступают заполнители X и Y. Они хранят входные и целевые данные и представляют их сети в качестве входных и целевых данных.

Пакет выборочных данных из X проходит через сеть, пока не достигнет выходного слоя.

Затем TensorFlow сравнивает прогнозы модели с фактически наблюдаемыми целями Y в пакете.

Средняя абсолютная процентная ошибка прогноза на тестовом наборе равна 4,89%, что не так уж и плохо.

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

Отдельное спасибо Sebastian за вдохновение!

Понравилась эта статья? КЛАССНО! Покажите свою признательность внизу 👏👏

  1. Следите за мной на Средних
  2. Свяжитесь со мной в LinkedIn
  3. Пишите по адресу [email protected], чтобы сказать привет!

Я бы хотел поговорить о финтехе или любой другой крутой экспоненциальной технологии!