Python版股市情感分析源代码,提取投资者情绪,为决策提供参考

情绪与股市关系的研究由来已久,情绪是市场的一个重要影响因素已成为共识。
15年股灾时,亲历了一次交易灾难,眼见朋友的数千万在一周不到的时间内灰飞烟灭。那段时间市场的疯狂,让人深刻地明白:某些时候,股票市场这个抽象、复杂的系统,反映的不再是价值与供需,而仅仅是人的贪婪与恐惧。

说明
这份代码是股市情感分析项目的一部分,这个项目的本意是利用互联网提取投资者情绪,为投资决策的制定提供参考。
在国内这样一个非有效的市场中,分析投资者的情绪似乎更有意义。
这里我们利用标注语料分析股评情感,利用分析结果构建指标,之后研究指标与股市关系。
可以按以下顺序运行代码:

python model_ml.py
python compute_sent_idx.py
python plot_sent_idx.py
数据
数据位于data目录下,包括三部分:

标注的股评文本:这些数据比较偏门,不是很好找,这里搜集整理了正负语料各4607条,已分词。
从东财股吧抓取的上证指数股评文本:约50万条,时间跨度为17年4月到18年5月。东财上证指数吧十分活跃,约7秒就有人发布一条股评。
上证指数数据:直接从新浪抓取下来的。
模型
情感分类模型也是文本分类模型,常用的包括机器学习模型与深度学习模型。

model_ml.py:机器学习模型,对比测试了8个模型。
model_dl.py:深度学习模型,对比测试了3个模型。
结果
在经过情感分析、指标构建这两个流程之后,我们可以得到一些有趣的结果,例如看涨情绪与股市走势的关系。
我们使用的看涨指标公式为:
在这里插入图片描述

经过处理之后,“看涨”情绪与股市走势的关系可以描画出来:
在这里插入图片描述

这里只展示诸多关系中的一个。

总结
这份代码仅为了演示如何从互联网中提取投资者情绪,并研究情绪与股市的关系。
model_ml.py

import os
from time import time
import pandas as pd
import numpy as np
import pickle
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.utils.extmath import density
from sklearn import svm
from sklearn import naive_bayes
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression, SGDClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics
from sklearn.utils import shufflenp.random.seed(42)comment_file = './data/stock_comments_seg.csv'
data_path = './data'
pos_corpus = 'positive.txt'
neg_corpus = 'negative.txt'
K_Best_Features = 3000def load_dataset():pos_file = os.path.join(data_path, pos_corpus)neg_file = os.path.join(data_path, neg_corpus)pos_sents = []with open(pos_file, 'r', encoding='utf-8') as f:for sent in f:pos_sents.append(sent.replace('\n', ''))neg_sents = []with open(neg_file, 'r', encoding='utf-8') as f:for sent in f:neg_sents.append(sent.replace('\n', ''))balance_len = min(len(pos_sents), len(neg_sents))pos_df = pd.DataFrame(pos_sents, columns=['text'])pos_df['polarity'] = 1pos_df = pos_df[:balance_len]neg_df = pd.DataFrame(neg_sents, columns=['text'])neg_df['polarity'] = 0neg_df = neg_df[:balance_len]return pd.concat([pos_df, neg_df]).reset_index(drop=True)
#    return pd.concat([pos_df, neg_df]).sample(frac=1).reset_index(drop=True)def load_dataset_tokenized():pos_file = os.path.join(data_path, pos_corpus)neg_file = os.path.join(data_path, neg_corpus)pos_sents = []with open(pos_file, 'r', encoding='utf-8') as f:for line in f:tokens = line.split(' ')sent = []for t in tokens:if t.strip():sent.append(t.strip())pos_sents.append(sent)neg_sents = []with open(neg_file, 'r', encoding='utf-8') as f:for line in f:tokens = line.split(' ')sent = []for t in tokens:if t.strip():sent.append(t.strip())neg_sents.append(sent)balance_len = min(len(pos_sents), len(neg_sents))texts = pos_sents + neg_sentslabels = [1] * balance_len + [0] * balance_lenreturn texts, labelsdef KFold_validation(clf, X, y):acc = []pos_precision, pos_recall, pos_f1_score = [], [], []neg_precision, neg_recall, neg_f1_score = [], [], []kf = KFold(n_splits=5, shuffle=True, random_state=42)for train, test in kf.split(X):X_train = [X[i] for i in train]X_test = [X[i] for i in test]y_train = [y[i] for i in train]y_test = [y[i] for i in test]# vectorizer = TfidfVectorizer(analyzer='word', tokenizer=lambda x : (w for w in x.split(' ') if w.strip()))def dummy_fun(doc):return docvectorizer = TfidfVectorizer(analyzer='word',tokenizer=dummy_fun,preprocessor=dummy_fun,token_pattern=None)vectorizer.fit(X_train)X_train = vectorizer.transform(X_train)X_test = vectorizer.transform(X_test)clf.fit(X_train, y_train)preds = clf.predict(X_test)acc.append(metrics.accuracy_score(y_test, preds))pos_precision.append(metrics.precision_score(y_test, preds, pos_label=1))pos_recall.append(metrics.recall_score(y_test, preds, pos_label=1))pos_f1_score.append(metrics.f1_score(y_test, preds, pos_label=1))neg_precision.append(metrics.precision_score(y_test, preds, pos_label=0))neg_recall.append(metrics.recall_score(y_test, preds, pos_label=0))neg_f1_score.append(metrics.f1_score(y_test, preds, pos_label=0))return (np.mean(acc), np.mean(pos_precision), np.mean(pos_recall), np.mean(pos_f1_score),np.mean(neg_precision), np.mean(neg_recall), np.mean(neg_f1_score))def benchmark_clfs():print('Loading dataset...')X, y = load_dataset_tokenized()classifiers = [('LinearSVC', svm.LinearSVC()),('LogisticReg', LogisticRegression()),('SGD', SGDClassifier()),('MultinomialNB', naive_bayes.MultinomialNB()),('KNN', KNeighborsClassifier()),('DecisionTree', DecisionTreeClassifier()),('RandomForest', RandomForestClassifier()),('AdaBoost', AdaBoostClassifier(base_estimator=LogisticRegression()))]cols = ['metrics', 'accuracy',  'pos_precision', 'pos_recall', 'pos_f1_score', 'neg_precision', 'neg_recall', 'neg_f1_score']scores = []for name, clf in classifiers:score = KFold_validation(clf, X, y)row = [name]row.extend(score)scores.append(row)df = pd.DataFrame(scores, columns=cols).Tdf.columns = df.iloc[0]df.drop(df.index[[0]], inplace=True)df = df.apply(pd.to_numeric, errors='ignore')return dfdef dummy_fun(doc):return docdef eval_model():print('Loading dataset...')X, y = load_dataset_tokenized()clf = svm.LinearSVC()vectorizer = TfidfVectorizer(analyzer='word',tokenizer=dummy_fun,preprocessor=dummy_fun,token_pattern=None)X = vectorizer.fit_transform(X)print('Train model...')clf.fit(X, y)print('Loading comments...')df = pd.read_csv(comment_file)df.dropna(inplace=True)df.reset_index(drop=True, inplace=True)df['created_time'] = pd.to_datetime(df['created_time'], format='%Y-%m-%d %H:%M:%S')df['polarity'] = 0df['title'].apply(lambda x: [w.strip() for w in x.split()])texts = df['title']texts = vectorizer.transform(texts)preds = clf.predict(texts)df['polarity'] = predsdf.to_csv('stock_comments_analyzed.csv', index=False)if __name__ == '__main__':scores = benchmark_clfs()print(scores)scores.to_csv('model_ml_scores.csv', float_format='%.4f')eval_model()

完整源代码包下载:市情感分析源代码

Python代码大全,海量代码任你下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/62377.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

干货全拿走-用Excel获取上证指数等50+股指行情及历史数据

一、 前言 二、 实现思路 三、 核心代码 四、 注意事项 一、前言 大数据时代,数据分析的价值愈发凸显,数据对于金融市场亦如是。现在越来越多的金融机构和个人借助专业的软件去做数据分析和获取数据,但是显然对于普通人来说,…

程序员能用大数据分析,用脚本测算股市的状况吗?

星期一的基金收益更新,没想到竟然… 8月2日的支付宝基金收益收益为2443元,今日收益为负值,上个星期暴跌4天,大盘很大大浮动。细看一下我的仓位,从上星期到现在都一直是这几个,没变过,医疗板块&a…

【Android】最新主流新闻app功能实现。仿网易,搜狐等新闻客户端实现展示

最新主流新闻app功能实现。仿网易,搜狐等新闻客户端 作者:程序员小冰 欢迎点击关注微博 (原创作品,转载请说明出处)先给大家看一下效果图: 这个项目总体来说虽然不是特别难,但是确实非常常用的功能。是业余时间自己写的一个小…

Safari 安装 Tampermonkey(油猴)插件

Safari 安装 Tampermonkey(油猴)插件 一、软件介绍 今天给大家推荐的一款”神器插件”叫 油猴,英文为Tampermonkey,是一款适用于Safari用户的脚本管理器,能够方便管理不同的脚本。虽然有些受支持的浏览器拥有原生的用…

使用Tampermonkey(油猴) 插件,重新实现了,百度搜索热点过滤功能

昨天晚上,花了点时间学习了Chrome插件的制作方法,并书写了《Chrome 百度搜索热点过滤插件 - 开源软件》这一文章,简单地介绍自己实现的百度搜索热点过滤神器的原理和使用方式,并进行了开源(https://github.com/yaowenx…

Mac的Safari安装油猴插件(Tampermonkey)

Mac的Safari安装油猴插件(Tampermonkey) 官方的AppStore是没有油猴插件(Tampermonkey)的,官方插件不仅少,功能被阉割,相对弱小,还收费。嗯,这很苹果第三方拓展。 这是油…

油猴插件: AC-百度-重定向优化

在日常使用搜索引擎时, 会遇到有些问题 1.搜索结果 网址重定向问题, 导致的打开很慢(每次跳转浪费1-2秒钟) 2.搜索结果里面的 垃圾网站, 比如某些 爬虫采集网站 重复出现(频繁出现, 一次浪费5秒左右) 改了之后记得点保存 ps: 不仅仅是百度, google, bing也会出现 垃圾答案网…

uniApp 新闻详情页语音播报,百度语音合成app端、H5端语音播报实例

非常轻便的语音合成接口,可以用于新闻详情页语音播报,实例功能: 点击“播放”按钮播放新闻详情页面的内容,播放按钮文字也图标变为“暂停”,再点击重新播放。 实例用到uniApp插件:百度语音合成接口 - DCl…

编写一个油猴脚本,去除百度首页的广告卡片(亲测有效)

1、去除前 2、去除后 3、脚本实现 // UserScript // name 隐藏百度首页的卡片 // namespace http://tampermonkey.net/ // version 0.2 // description try to take over the world! // author You // match *://www.baidu.com/?tn* // grant …

哪些手机浏览器可以安装油猴插件(Tampermonkey)

哪些手机浏览器可以安装油猴 安装 Tampermonkey 一、可以安装油猴的手机浏览器 火狐浏览器(Firefox) Kiwi 浏览器 Yandex 浏览器 二、优点与缺点 火狐浏览器 UI 互动效果差一些,Kiwi 浏览器 UI 互动更爽一些Yandex 浏览器俄式风格&…

利用浏览器的油猴插件下载网页视频

1. 油猴介绍 油猴是一个浏览器的插件,该插件用于管理(安装和卸载)浏览器的功能脚本,实现浏览器附加功能的添加。 众所周知,浏览器可以添加扩展程序插件,以扩展浏览器的功能。但是,有些扩展程序…

【自动化】初见 - 最强浏览器插件 《油猴Tampermonkey》 开发和发布

▒ 目录 ▒ 🛫 导读需求开发环境 1️⃣ 油猴插件基本使用安装油猴插件安装用户脚本使用用户脚本 2️⃣ 脚本开发-自定义baidu搜索框新建脚本修改元数据编写脚本 3️⃣ 脚本发布注册账号发布脚本 🛬 文章小结📖 参考资料 🛫 导读 …

让iOS Safari浏览器支持油猴脚本

Userscripts 是一款免费 iOS Safari 浏览器插件,可以兼容油猴脚本,但如果油猴脚本代码没有对手机进行适配的话可能不会生效。 1、首先 打开设置 找到 Safari 浏览器 选择 扩展 然后 勾选 Userscripts 所有网站中 选择 允许 然后打开 Userscripts 后按照…

Tampermonkey[油猴插件]开发者的神级工具!

油猴插件在项目开发中的应用 油猴插件介绍和使用插件介绍输出Hello world 实战应用文档生成代码 油猴插件介绍和使用 插件介绍 Tampermonkey是一款免费的浏览器扩展和最为流行的用户脚本管理器,它适用于 Chrome, Microsoft Edge, Safari, Opera Next, 和 Firefox。…

利用油猴插件 Tampermonkey 编写脚本以屏蔽网页指定元素——以屏蔽百度搜索右边的百度热榜为例

一、起因 一直使用 Tampermonkey 中的 AC-baidu-重定向优化百度搜狗谷歌必应搜索_favicon_双列 这个插件屏蔽好好的,今天突然屏蔽不了,正好自己编写一个简单的插件试试完成这一效果,如下图 二、过程 Tampermonkey 版本 v4.11 直接进入油…

哪些安卓手机和IPhone手机浏览器可以安装油猴Tampermonkey插件

油猴官网:Greasy Fork - 安全、实用的用户脚本大全 Android手机浏览器: Firefox:Greasemonkey、Tampermonkey 或 Violentmonkey Maxthon:Violentmonkey Dolphin:Tampermonkey UC:Tampermonkey Kiwi&#…

保姆级教程!如何在安卓手机上安装使用油猴脚本

浏览器插件成千上万,但是大家都有一个共识,那就是油猴无插件能敌,原因就在于它一个插件就可以实现众多插件的功能。 首先需要明确一点的是,油猴插件本身是没有任何功能的,它需要依靠脚本来实现功能。至于脚本&#xf…

【关键词排名点击软件】网站关键词挖掘常用的五个工具

很多SEO站长朋友明明每天都在进行优化,为什么就是没有好的排名呢?这是因为一个主关键词的优化,需要看你网站多方面的优化配合,而一般能选择成为你网站主关键词一般竞争都比较大,其他方面的优化如果没做好的话&#xff…

关键词挖掘与筛选(流量+权重必备)

seo如果你做到一定程度的时候,你自然就会发现,seo永远是围绕两个话题 一个是收录话题,一个是词的话题 为什么这么说呢,收录可以帮你解决展现量与点击量 ,词可以帮你解决流量 ,这也是我们做seo的目的所在。…

关键词挖掘的9种方法

通过挖掘关键词所建立的关键词词库以应对企业网站流量及业务的拓展。 扩大网站的关键词词库,拓展和挖掘海量关键词,手动通过产品业务词、搜索引擎、竞争对手等方式挖掘无法满足需求。 这时我们就需要通过相关关键词挖掘方法来继续扩充关键词。 Google…