Введение

Представьте, что у вас есть два чистых листа бумаги формата А4, положенные прямо друг на друга, согнутые пополам по горизонтали. Если бы вы хотели описать это преобразование, это было бы просто «развернуть по высоте/2». Представьте, что вы затем согнули по горизонтальной оси. В результате непреобразование будет

unfold over width/2
unfold over height/2

Если вы дадите эти инструкции компьютеру, он сможет разделить любые два листа бумаги, сложенные таким образом.

Теперь представьте, что вы скомкаете два листа бумаги в шар.

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

Это изложение является продолжением аналогии с бумажным шариком в Глубоком обучении с помощью Python Франсуа Шолле, настоятельно рекомендуемом, интуитивно понятном введении в машинное обучение и глубокое обучение.

Биткойн

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

Предыдущее исследование

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

План

Если мы сможем устранить ошибку f(t + 1) = f(t), наши результаты будут лучше, чем у большинства моделей. Я думаю, что лучший способ сделать это — разница в цене данных, потому что на самом деле мы торгуем не ценой биткойна, а движением цены. . Вы принимаете решение о покупке не на основании текущей цены, а на основе того, как, по вашему мнению, она будет двигаться в будущем.

Особенности:
- Ежедневные данные об открытии, максимуме, минимуме, закрытии
- Объем в процентах от рыночной капитализации
- Доминирование биткойнов и альткойнов
- Подписчики субреддита r/bitcoin
> - Все эти функции будут различаться для расчета разницы между днями.

Реальные данные:

Данные о разнице в цене:

def delta_time_series(data):
 return data[1:] — data[:-1]
columns = [“close”, “open”, “high”, “low”, “vol_market”, “dom_btc”, “dom_eth”, “dom_alt”, “r_btc_subs”]
new_df = pd.DataFrame(columns=columns)
for index, row in data.iterrows():
 # close price, our label
 close = row[“close”]
 
 # difference between close and OHL
 open_ = row[“open”] — row[“close”]
 high = row[“high”] — row[“close”]
 low = row[“low”] — row[“close”]
 
 # volume as a percentage of market cap
 size_volume = row[“volume”]/row[“marketcap”]
 
 # dominance of bitcoin compared to eth and alts
 dominance_row = dom_data.loc[dom_data[“Date”]==row[“date”], :].squeeze()
 dom_btc = dominance_row[“Bitcoin”]/100
 dom_eth = dominance_row[“Ethereum”]/100
 dom_alt = dominance_row[“Others”]/100
 
 # subscribers to the bitcoin subreddit.
 r_btc_subs = r_bitcoin.loc[r_bitcoin[“Date”]==row[“date”], :].squeeze()[“Subs”]
 new_df.loc[index] = [close, open_, high, low, size_volume, dom_btc, dom_eth, dom_alt, r_btc_subs]
new_df = delta_time_series(new_df)

Затем данные были масштабированы до значений от -1 до 1 с использованием MinMaxScaler, и значения были сохранены для инвертирования масштабирования. Это важный шаг, чтобы убедиться, что наша модель имеет наименьший возможный вес.

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

[10, 20, 30, 40, 50, 60]

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

[10, 20, 30] -> [40]
[20, 30, 40] -> [50]
[30, 40, 50] -> [60]

Самый простой способ преобразовать таблицу данных в этот формат — использовать TimeseriesGenerator от Keras, который сделает всю работу за вас! Мы разделим данные на 70% поезд и 30% тест.

train_size = int(len(dataset_y) * 0.7)
train_x, train_y = dataset_x[:train_size], dataset_y[:train_size]
test_x, test_y = dataset_x[train_size:], dataset_y[train_size:]
# look at a weeks worth of data and predict the next day
generator = TimeseriesGenerator(train_x, train_y, length=7, shuffle=False, batch_size=1)
validation_gen = TimeseriesGenerator(test_x, test_y, length=7, shuffle=False, batch_size=1)

Модели глубокого обучения

Мне понравилась идея использования 1D CNN для прогнозирования временных рядов — это очень элегантный и интуитивно понятный метод. Нильс Акерманн сделал потрясающее введение в 1D CNN, которое я очень рекомендую. Вместо обычной 2D CNN с 2 измерениями ширины и 3 (для RGB) каналами глубины мы будем использовать 1D CNN с 1 измерением ширины (времени) и 9 каналами глубины, по одному для каждой функции.

model = Sequential()
model.add(Conv1D(filters=8, kernel_size=3, activation=”relu”, padding=”same”, input_shape=(7, 9)))
model.add(Flatten())
model.add(Dense(8, activation=”relu”))
model.add(Dense(1, activation=”tanh”))
model.compile(loss=”mse”, optimizer=optimizers.Adam())
model.fit_generator(generator, epochs=25, validation_data=validation_gen, verbose=1)

Результаты

Прогноз выделен красным, фактический – зеленым

Это довольно хороший результат! Он предсказал большие движения цен во время бычьего рынка в конце 2017 года, используя только биржевые данные и количество подписчиков r/bitcoin. Хотя он, похоже, не страдает смертельной ошибкой f(t+1) = f(t), он, вероятно, переоснащается и не принесет реальной прибыли. торговля жизнью (пока).

Выводы

  • Сверточные нейронные сети не ограничиваются классификацией изображений, и было показано, что они эффективны при прогнозировании многомерных временных рядов.
  • Я считаю, что улучшения в этой модели будут происходить за счет большего анализа настроений, такого как объем твитов, тенденции Google и обработка новостных статей (возможно, с помощью НЛП для определения бычьего/медвежьего отношения).
  • Помимо шумихи, глубокое обучение — это невероятно полезный **инструмент**, который может помочь найти порядок в ошеломляющем хаосе.