股市情感分析:基于新闻标题的股票价格预测

大家好,今天将分享一个与美丽的引言相似的主题。一直在寻找新的想法来分享知识,因为相信“分享的知识是知识平方”。许多人可能已经对股票市场有所了解。在这篇文章中,将探索一些新的和有趣的东西。让深入探讨今天的主题。

这篇文章实际上是基于自然语言处理(NLP)的,将创建一个模型,该模型将分析新闻标题以预测股票价格。各种新闻文章会影响股票价格的波动。将使用NLP进行情感分析,然后预测股票价格是上涨还是下跌。这全部是关于股市情感分析的。

数据集描述

在这里,使用了Kaggle数据集。可以直接从这里下载。这个数据集是世界新闻和股票价格的组合,可在Kaggle上找到。数据框架中有25列是每天的顶级新闻标题,日期和标签(依赖特征)。数据范围从2008年到2016年,而2000年到2008年的数据框架是从雅虎财经抓取的。标签是基于道琼斯工业平均股票指数的。

类别1 - 股票价格上涨。类别0 - 股票价格保持不变或下跌。

让开始吧!

首先,需要导入所需的库。

import pandas as pd from sklearn.feature_extraction.text import CountVectorizer from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report,confusion_matrix,accuracy_score

让读取数据集。

df = pd.read_csv('F:Stock-Sentiment-Analysis-master/Stock News Dataset.csv', encoding = "ISO-8859-1")

让看看数据集,标签是依赖特征(目标值),其余的26个特征是独立的。每当标签是1时,股价就会上涨,当得到这25条新闻标题时。这是拥有的数据集类型,将在这个问题陈述中使用NLP进行情感分析,然后将预测股价是上涨还是下跌。

让将数据集分成训练和测试部分。

train = df[df['Date'] < '20150101'] test = df[df['Date'] > '20141231']

根据日期划分数据集。数据集的日期小于20150101,将其作为训练数据集,数据集的日期大于20141231,将其作为测试数据集。

让对数据集进行一些特征工程。

现在让从文本数据集中删除所有这些列,句号或感叹号,因为这些都不是进行情感分析所必需的。取了所有25个新闻列,然后刚刚应用了正则表达式,说除了a-z和A-Z之外,将所有内容替换为空白。如果有任何特殊字符出现,它将自动删除它们并将它们替换为空白空间。

# 移除特殊字符 data=train.iloc[:,2:27] data.replace("[^a-zA-Z]"," ",regex=True, inplace=True)

重命名列名以更好地理解和访问。

list1= [i for i in range(25)] new_Index=[str(i) for i in list1] data.columns= new_Index

更新后的数据集如下所示:

data.head(5)

让将所有这些字符转换为小写。

for index in new_Index: data[index] = data[index].str.lower() data.head(1)

这是一个非常重要的步骤,因为每当尝试创建一个词袋模型或TFIDF模型时,总是记住这些模型如果那个词以大写字母开头,而另一个句子中以小写字母出现相同的词,那么这个模型将考虑两个不同的词。这意味着相同的词,但由于只有大写和小写,它被认为是不同的词。

为了解决这些问题,正在执行这一步。因此,总是确保已经将所有字符转换为小写字符,也可以将它们转换为大写字符,但请记住,如果决定将所有字符转换为大写字符,那么每个字符都应该以大写字符出现,类似于小写字符。

让根据索引合并所有新闻标题:

如果将特定日期的所有新闻标题视为一个段落,那么那时只能应用CountVectorizer,这是词袋模型或TFIDF。所以会去每个索引,会将它们合并成一个段落。

headlines = [] for row in range(0,len(data.index)): headlines.append(' '.join(str(x) for x in data.iloc[row,0:25]))

现在标题看起来像这样:

headlines

让应用CountVectorizer和RandomForestClassifier。

这里计数向量化器基本上会将这些句子转换为向量。这就是词袋的意思。

# 实施词袋模型 countvector=CountVectorizer(ngram_range=(2,2)) traindataset=countvector.fit_transform(headlines) # 实施随机森林分类器 randomclassifier=RandomForestClassifier(n_estimators=200,criterion='entropy') randomclassifier.fit(traindataset,train['Label'])

让为测试数据集进行预测。

现在对于测试数据集,将执行与训练数据集相同的特征转换。

# 为测试数据集进行预测 test_transform= [] for row in range(0,len(test.index)): test_transform.append(' '.join(str(x) for x in test.iloc[row,2:27])) test_dataset = countvector.transform(test_transform) predictions = randomclassifier.predict(test_dataset)

最后,让检查准确性。

正在应用分类报告、混淆矩阵和准确度分数来检查模型的准确性。

matrix = confusion_matrix(test['Label'],predictions) print(matrix) score = accuracy_score(test['Label'],predictions) print(score) report = classification_report(test['Label'],predictions) print(report)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485