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

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

Полный исходный код можно получить в общедоступной учетной записи WeChat: «01 Binary», фоновый ответ: «Анализ фондового рынка».

Перед прочтением этой статьи рекомендуется прочитать«В процессе поиска объектов я действительно понял, что такое машинное обучение! 》

предисловие

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

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

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

Готов к работе

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

лабораторная среда

Как обычно, во избежание проблем, вызванных средой, сначала перечислите экспериментальную среду:

  • MacOS 10.14.3
  • Python 3.6.8 (Анаконда)
  • Jupyter Notebook
  • Используемые пакеты:
    • TensorFlow
    • Keras
    • matplotlib
    • pandas

данные

В этом эксперименте мы использовалиSTATWORXизS&P 500Данные о ценах на акции, этот набор данных сканируется из Google Finance API и обрабатывается на предмет отсутствующих значений. Их официальный сайт:Woohoo Это он для меня следующим образом.com/.

Набор данных можно получить в общедоступной учетной записи WeChat: фоновый ответ «01 Binary»: «Набор данных фондового рынка».

Предварительный просмотр данных

Здесь мы по-прежнему используем панды, в основном для очистки и сортировки данных.

import pandas as pd
data=pd.read_csv('data/data_stocks.csv')
data.info()

воплощать в жизньdata.info()Сводку характеристик можно посмотреть:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 41266 entries, 0 to 41265
Columns: 502 entries, DATE to NYSE.ZTS
dtypes: float64(501), int64(1)
memory usage: 158.0 MB

Из приведенных выше результатов видно, что в наборе данных всего 502 столбца, 41266 строк и 502 столбца:

  • DATE: Временная метка строки данных
  • SP500: можно понимать как рыночный индекс
  • Другие: можно понимать как цену акций 500 отдельных акций.

Просмотр первых пяти строк данных

data.head()

Нарисуйте линейный график тенденции рынка

plt.plot(data['SP500'])

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

Советы. Средой отладки для этого эксперимента является Jupyter Notebook, лучше импортировать ее в начале.matplotlibПри переносе добавить строку%matplotlib inline, чтобы можно было встроить график в Jupyter Notebook и пропустить шаг plt.show().

Курирование данных

Здесь нам нужно разделить набор данных на обучающие и тестовые данные. Коэффициент распределения составляет 8:2, т.е. обучающие данные содержат 80% всего набора данных. Конечно, перед этим нужноDATEЭта нерелевантная переменная отбрасывается.

data.drop('DATE', axis=1, inplace=True)
data_train = data.iloc[:int(data.shape[0] * 0.8), :]
data_test = data.iloc[int(data.shape[0] * 0.8):, :]

Давайте посмотрим на обучающий набор и тестовый наборshape:

нормализация данных

Масштабирует свойство между указанным максимальным и минимальным значением (обычно (-1, 1)), что может быть достигнуто с помощьюsklearn.preprocessing.MinMaxScalerреализация класса.

Целями использования этого метода являются:

  1. Это может повысить его стабильность для свойств с очень небольшой дисперсией.

  2. Сохраняйте 0 записей в разреженной матрице.

scaler = MinMaxScaler(feature_range=(-1, 1))
scaler.fit(data_train)
data_train = scaler.transform(data_train)
data_test = scaler.transform(data_test)

предсказывать

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

Проблема, которую нам нужно решить здесь:Используйте цены акций 500 акций в текущий момент, чтобы предсказать рыночный индекс в текущий момент. то есть проблема регрессии,Введите в общей сложности 500-мерные функции, выведите одномерные,Сейчас[None, 500] => [None, 1]

установить X и Y

X_train = data_train[:, 1:]
y_train = data_train[:, 0]
X_test = data_test[:, 1:]
y_test = data_test[:, 0]

X и y здесь уже являются классифицированными наборами данных, которые представлены только двумя переменными, X и Y, которые можно понимать как X и Y в функции.

Установить гиперпараметры

input_dim = X_train.shape[1]
output_dim = 1
hidden_1 = 1024
hidden_2 = 512
hidden_3 = 256
hidden_4 = 128
batch_size = 256
epochs = 10

Здесь мы устанавливаем несколько гиперпараметров,input_dimУказывает размерность входных данных, т.е. 500.output_dimПредставляет размерность выходных данных, т.е. 1. В этой модели настроены 4 скрытых слоя, первый слой содержит 1024 нейрона, что чуть более чем в два раза превышает размер входных данных. Последующие скрытые слои всегда вдвое меньше предыдущего слоя, т.е. 512, 256 и 128 нейронов соответственно. Уменьшение количества нейронов в каждом последующем слое сжимает информацию, идентифицированную сетью в предыдущих слоях. Конечно, возможны и другие сетевые архитектуры и конфигурации нейронов, но, поскольку эта статья является лишь вводным проектом, она не углубляется.

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

Установить заполнитель (заполнитель)

X = tf.placeholder(shape=[None, input_dim], dtype=tf.float32)
Y = tf.placeholder(shape=[None], dtype=tf.float32)

Чтобы соответствовать нашей модели, нам нужны два заполнителя: X (вход нейронной сети) и Y (выход нейронной сети).

Настроить нейронную сеть

Настроить нейросеть по ранее заданным гиперпараметрам, гдеwэто вес,bзначение смещения

# 第一层
W1 = tf.get_variable('W1', [input_dim, hidden_1], initializer=tf.contrib.layers.xavier_initializer(seed=1))
b1 = tf.get_variable('b1', [hidden_1], initializer=tf.zeros_initializer())
# 第二层
W2 = tf.get_variable('W2', [hidden_1, hidden_2], initializer=tf.contrib.layers.xavier_initializer(seed=1))
b2 = tf.get_variable('b2', [hidden_2], initializer=tf.zeros_initializer())
# 第三层
W3 = tf.get_variable('W3', [hidden_2, hidden_3], initializer=tf.contrib.layers.xavier_initializer(seed=1))
b3 = tf.get_variable('b3', [hidden_3], initializer=tf.zeros_initializer())
# 第四层
W4 = tf.get_variable('W4', [hidden_3, hidden_4], initializer=tf.contrib.layers.xavier_initializer(seed=1))
b4 = tf.get_variable('b4', [hidden_4], initializer=tf.zeros_initializer())
# 输出层
W5 = tf.get_variable('W5', [hidden_4, output_dim], initializer=tf.contrib.layers.xavier_initializer(seed=1))
b5 = tf.get_variable('b5', [output_dim], initializer=tf.zeros_initializer())

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

Настроить сетевую архитектуру

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

h1 = tf.nn.relu(tf.add(tf.matmul(X, W1), b1))
h2 = tf.nn.relu(tf.add(tf.matmul(h1, W2), b2))
h3 = tf.nn.relu(tf.add(tf.matmul(h2, W3), b3))
h4 = tf.nn.relu(tf.add(tf.matmul(h3, W4), b4))
out = tf.transpose(tf.add(tf.matmul(h4, W5), b5))

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

Следующая диаграмма иллюстрирует архитектуру сети. Модель состоит из трех основных строительных блоков. Входной слой, скрытый слой и выходной слой. Эта архитектура называется сетью прямой связи. Feedforward означает, что пакет данных проходит только слева направо. Другие сетевые архитектуры, такие как рекуррентные нейронные сети, также позволяют передавать данные «назад» по сети.

Настройте функцию потерь и оптимизатор

loss = tf.reduce_mean(tf.squared_difference(out, Y))
optimizer = tf.train.AdamOptimizer().minimize(loss)

Об этой части особо нечего сказать, просто не забудьте написать так. Если вы хотите узнать больше, вы можете перейти намой TensorFlowУзнайте в.

Осуществлять тренировочный процесс

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

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

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

with tf.Session() as sess:
    # 初始化所有变量
    sess.run(tf.global_variables_initializer())

    for e in range(epochs):
        # 将数据打乱
        shuffle_indices = np.random.permutation(np.arange(y_train.shape[0]))
        X_train = X_train[shuffle_indices]
        y_train = y_train[shuffle_indices]

        for i in range(y_train.shape[0] // batch_size):
            start = i * batch_size
            batch_x = X_train[start : start + batch_size]
            batch_y = y_train[start : start + batch_size]
            sess.run(optimizer, feed_dict={X: batch_x, Y: batch_y})

            if i % 50 == 0:
                print('MSE Train:', sess.run(loss, feed_dict={X: X_train, Y: y_train}))
                print('MSE Test:', sess.run(loss, feed_dict={X: X_test, Y: y_test}))
                y_pred = sess.run(out, feed_dict={X: X_test})
                y_pred = np.squeeze(y_pred)
                plt.plot(y_test, label='test')
                plt.plot(y_pred, label='pred')
                plt.title('Epoch ' + str(e) + ', Batch ' + str(i))
                plt.legend()
                plt.show()

Текущий результат:

MSE Train: 9.56518e-05
MSE Test: 0.0025863606
MSE Train: 6.0618047e-05
MSE Test: 0.0025002975
MSE Train: 0.00014856807
MSE Test: 0.0017371146
MSE Train: 0.00016200903
MSE Test: 0.0025396077
MSE Train: 0.00010259051
MSE Test: 0.0030134947
MSE Train: 7.979905e-05
MSE Test: 0.0023832247
MSE Train: 5.92488e-05
MSE Test: 0.0032762515
MSE Train: 8.747634e-05
MSE Test: 0.004848172
MSE Train: 8.5051965e-05
MSE Test: 0.0032768336

Потери окончательного тестового набора составляют около 0,003, что можно назвать относительно точным.

Визуализируйте результаты тренировки:

20190226203532

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

в заключении

Как упоминалось в начале, на цену акций будет влиять множество сложных факторов, таких как экономическая среда, государственная политика и человеческое манипулирование. описано в этой статье. Целью этой статьи является объединение текущих горячих точек. Дайте техническую рекомендацию по TensorFlow.

Выпуск TensorFlow — важное событие в исследованиях глубокого обучения. Будучи студентом, автор тоже активно учится, и друзья, заинтересованные в обучении, могут ответить на фоне официального аккаунта (то есть официального аккаунта в конце статьи)"Видео о TensorFlow«Получите высококачественное видео TensorFlow, и вы также можете добавить мой WeChat, чтобы общаться и развиваться вместе.

Полный исходный код можно получить в общедоступной учетной записи WeChat: «01 Binary», фоновый ответ: «Анализ фондового рынка».

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


"Тысячи гор и рек - это любовь, можешь уделить мне немного внимания?"