首页 > 解决方案 > 使用 Embedding 和 Keras 根据前 K 天的所有新闻预测股票趋势

问题描述

我有一个新闻标题数据集,我应该通过词嵌入来预测股票趋势,特别是考虑到前 K 天的所有新闻标题。我清理了字符串,并选择使用 Keras 的 Tokenizer 来创建我的词汇表并将每个新闻标题转换为单词索引列表。

tokenizer.fit_on_texts(titlesDF["title"])
titlesDF["title"] = tokenizer.texts_to_sequences(titlesDF["title"])
max_len = titlesDF["title"].map(lambda x: len(x)).max()
padded = pad_sequences(titlesDF["title"], maxlen = max_len, dtype="int32", padding="post")
titlesDF["Title"] = padded.tolist()
titlesDF = titlesDF.reindex(columns=["Title", "date"])

我使用 yfinance 从指数中获取股票数据,以根据当天指数是上涨还是下跌来标记我的训练数据。

我的想法是将特定日期的所有新闻汇总到一个列表或二维数组中,其中每一行都是一个特定的标题。完成此操作后,我将股票数据框(按日期和标签列索引)与新闻数据框结合起来。由于我的目标是预测前几天的新闻,因此我通过移动日期(而不是行)在数据帧上创建了 K 个附加列。最后,他的 I 从未标记的行(由于股市关闭)和所有新闻值为 na 的行(当天和前 K 天没有新闻数据)中清除了数据框。

for i in range(1,K+1):
  s = "Titles_n-" + str(i)
  join[s]=join["Titles"].shift(i, freq="D")  
join = join.reindex(columns=["Titles", "Titles_n-1", ..., "Titles_n-K","Label"])
join = join.dropna(subset=["Titles", "Titles_n-1", ..., "Titles_n-K"], thresh=1)
join = join.dropna(subset=["Label"])

我将任何 Titles* 列上的任何 na 值设置为 ndarray/零列表,其大小与包含新闻标题的 ndarray/列表一样。

我尝试建立这个模型:

input* = Input(shape=(max_len), dtype=np.int32)
embed* = Embedding(input_dim=nwords, output_dim=32, input_length=max_wid)(input3)
gru* = GRU(16)(embed0)
merge = Concatenate(axis=1)([grus])
dropout = Dropout(0.5)(merge)
dense2 = Dense(32, activation="softmax")(dropout)
output = Dense(2, activation="relu", use_bias=True)(dense2)
model = Model(inputs=[inputs], outputs=output)

但是任何训练它的尝试都会使我的记忆超负荷并使执行崩溃。

任何人都可以给我任何关于更好模型的提示吗?我应该输入时间序列吗?或者我可以训练一个嵌入(因为所有嵌入层都在相同的数据上学习),然后将它用于所有输入?

标签: pythonkerastext-miningword-embedding

解决方案


推荐阅读