Я действительно разочарован онлайн-статьями, они ставили заголовок вроде прогноз бла-бла с использованием LSTM, но в их статьях не было реального прогнозирования будущего, просто продолжайте сравнивать реальные тенденции с прогнозируемыми. Эй, даже ARIMA может сделать лучше да, если так! (Я малазиец, большую часть нашего разговора мы используем лах, чтобы показать снобизма, https://www.urbandictionary.com/define.php?term=lah)

TL; DR, вы можете скачать набор данных и записную книжку отсюда, https://github.com/huseinzol05/Stock-Prediction-Models/tree/master/misc

Набор данных уже упрощен и обработан, нам просто нужно немного проанализировать и закодировать модель.

У нас есть отметка времени, полярность между 0–1, чувствительность 0–1, объем твита, связанный с биткойнами, цена биткойнов OHLC.

Давайте проведем базовое исследование показателей для атрибутов

Для полярности

df['Polarity'].describe()
count    294.000000
mean       0.099534
std        0.012114
min        0.051695
25%        0.091489
50%        0.099198
75%        0.106649
max        0.135088
Name: Polarity, dtype: float64

Мы видели, что самая высокая полярность будет 0,14, а не даже половина между 0 и 1. Среднее значение полярности очень близко к 0, это очень отрицательная полярность, о которой писали люди.

Для чувствительности

df['Sensitivity'].describe()
count    294.000000
mean       0.214141
std        0.014940
min        0.174330
25%        0.203450
50%        0.214756
75%        0.223910
max        0.271796
Name: Sensitivity, dtype: float64

Чувствительность - это значения чувствительности этой модели классификации полярности, наивысшая означает, что модель очень уверена в найденных текстах, самая низкая означает, что модель очень не уверена в найденных текстах. Среднее значение чувствительности составляет 0,2, я могу сказать, что эта модель полярности не обучена на основе полярности биткойнов, но используется для ее классификации. Мы не будем касаться этого, мы предположили, что верим в нашу модель!

Для объема твитов

count      294.000000
mean      4691.119048
std       1048.922706
min       2998.000000
25%       3878.750000
50%       4452.000000
75%       5429.750000
max      10452.000000
Name: Tweet_vol, dtype: float64

По закрытой цене,

count     294.000000
mean     6920.150000
std       565.424866
min      6149.110000
25%      6283.497500
50%      7281.975000
75%      7424.560000
max      7750.090000
Name: Close_Price, dtype: float64

Изменения от минимального до максимального составляет около ((7750.090000 - 6149.110000) / 6149.110000) 26% менее чем за 2 недели. Тенденции, которые меняются в криптовалютах, безумны, чертовски безумны.

Обнаружение выбросов / внезапных всплесков цен закрытия

Теперь я нормализовал цены закрытия на расстояние стандартного отклонения,

signal = np.copy(df['Close_Price'].values)
std_signal = (signal - np.mean(signal)) / np.std(signal)
s = pd.Series(std_signal)
s.describe(percentiles=[0.25,0.5,0.75,0.95])
count    2.940000e+02
mean     2.223467e-15
std      1.001705e+00
min     -1.365972e+00
25%     -1.127892e+00
50%      6.410081e-01
75%      8.936113e-01
95%      1.375160e+00
max      1.470319e+00
dtype: float64

Я выберу 95% в качестве базовой линии для выброса, левой и правой стороны,

Левая часть нашего распределения, я могу сказать, ниже 6,2k, правая часть нашего распределения выше 7,6k.

Но что случилось с нашими тенденциями полярности и чувствительности, следуют ли за ними закрытые выбросы? Я масштабирую наши функции в диапазоне от 0 до 1,

Приносим извинения за метку ошибки, "o" красный должен быть "чувствительностью к выбросам на основе закрытия".

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

Что сказал Пирсон?

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

Проверьте закрытые цены по сравнению с Polarity_7, Polarity_14, Polarity_21, Polarity_28, Polarity_35, Polarity_42, значения корреляции увеличиваются!

Хорошо, хорошо, просто займись глубоким обучением.

Это наша модель, на самом деле очень простая,

Во-первых, мне нужно масштабировать наш набор данных между 0–1, прежде чем вводить в нашу модель,

minmax = MinMaxScaler().fit(
    df[['Polarity', 
        'Sensitivity', 
        'Tweet_vol', 
        'Close_Price']].astype(
        'float32'
    )
)
df_scaled = minmax.transform(
    df[['Polarity', 
        'Sensitivity', 
        'Tweet_vol', 
        'Close_Price']].astype(
        'float32'
    )
)
df_scaled = pd.DataFrame(df_scaled)

Нам нужно масштабировать наши данные между 0–1 или любым другим масштабом, который вы хотите, но не менее -1 и не более 1, поскольку LSTM использует функцию tanh, сжатие высоких значений может привести к исчезновению градиента позже.

И это мои определения модели,

num_layers = 1
learning_rate = 0.005
size_layer = 128
timestamp = 5
epoch = 500
dropout_rate = 0.6
tf.reset_default_graph()
modelnn = Model(
    learning_rate, 
    num_layers, 
    4, 
    size_layer, 
    dropout_rate
)
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())

Обученный за 500 эпох,

epoch: 100 avg loss: 0.009472558752569402
epoch: 200 avg loss: 0.007681161466311535
epoch: 300 avg loss: 0.006072720400346765
epoch: 400 avg loss: 0.005432833451777697
epoch: 500 avg loss: 0.0048205173004354385

После тренировки я хочу предсказать 30 часов в будущем,

Perfecto! наша модель обучена достаточно хорошо! Реальный сигнал и прогнозируемый сигнал довольно хорошо перекрываются в течение контролируемого периода. Но как насчет 30 часов достаточно? Достаточно ли вы доверяете этому образцу?

Что произойдет, если полярность будет вдвое больше максимальной?

Я повторил попытку 3 раза, просто чтобы изучить, насколько подходит наша модель, если каждая повторная попытка приводит к значительным изменениям тренда, поэтому нам нужно заново обучаться.

Что будет, если полярность в четыре раза больше максимальной?

Резких негативных тенденций в четыре раза больше, чем в два раза!

Что произойдет, если полярность будет в четыре раза выше минимальной?

Второй график перекошен, но у нас 2 графика отражают положительные тенденции.

Как видите, модель поняла, что полярность дает модели отрицательную корреляцию. Если полярность увеличивается, тренд уменьшается, и наоборот.

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

Не стесняйтесь обращаться ко мне по адресу Husein Zolkepli или по электронной почте [email protected].

Спасибо за чтение!