Я действительно разочарован онлайн-статьями, они ставили заголовок вроде прогноз бла-бла с использованием 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].
Спасибо за чтение!