情绪与股市关系的研究由来已久,情绪是市场的一个重要影响因素已成为共识。
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代码大全,海量代码任你下载

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

  1. Python实现A股股市情感分析,含数据集可直接运行

    Python实现A股股市情感分析,含数据集可直接运行 Stock Market Sentiment Analysis: 股市情感分析 完整代码下载地址:Python实现A股股市情感分析 情绪与股市 情 ...

  2. 基于Python的股市市场情绪分析

    源码下载地址:https://download.csdn.net/download/sheziqiong/85629795 情绪与股市 情绪与股市关系的研究由来已久,情绪是市场的一个重要影响因素已成为 ...

  3. python中文文本情感分析

    目录 python中文文本情感分析 导语 训练模型保存并测试正确率 使用保存的模型 python中文文本情感分析 导语 要做一个项目要用到中文文本情感分析,查找了多种资料,在网上看了很多博客后,终于完 ...

  4. Python版儿童识字游戏源代码,结合植物大战僵尸和儿童识字的小游戏,含学习模式和娱乐模式

    Python版儿童识字游戏源代码,结合植物大战僵尸和儿童识字的小游戏,含学习模式和娱乐模式. 娱乐模式下,僵尸会头顶不同的汉字,此时屏幕会提示要消灭的汉字,移动豌豆消灭对应汉字的僵尸,如果攻击非提示汉 ...

  5. python微博评论情感分析_基于Python的微博情感分析系统设计

    2019 年第 6 期 信息与电脑 China Computer & Communication 软件开发与应用 基于 Python 的微博情感分析系统设计 王 欣 周文龙 (武汉工程大学邮电 ...

  6. Python版简易银行管理系统源代码,银行管理系统python代码、银行自助提款系统

    Python版简易银行管理系统源代码,银行管理系统python代码,实现开户.账户查询.存取款.转账.改密.锁定.解锁.补卡.销户等银行管理操作.账户信息存在allusers.txt中,通过该文件的读 ...

  7. python微博文本分析_基于Python的微博情感分析系统设计

    基于 Python 的微博情感分析系统设计 王欣 ; 周文龙 [期刊名称] < <信息与电脑> > [年 ( 卷 ), 期] 2019(000)006 [摘要] 微博是当今公众 ...

  8. Python版见缝插针小游戏源代码,球球旋转大作战源程序

    见缝插针游戏是一款非常考验玩家手眼协调能力的休闲益智虐心虐脑小游戏,玩法很简单,但要过关却很有挑战性哟! 主要是将一系列的小球,插入到旋转的摩天轮转盘当中,插入过程中不能碰到旋转的摩天轮上的其他小球, ...

  9. python实现情感分析_利用python实现简单情感分析

    最近选修的大数据挖掘课上需要做关于情感分析的pre,自己也做了一些准备工作,就像把准备的内容稍微整理一下写出来,下次再做类似项目的时候也有个参考. 情感分析是什么? 文本情感分析是指用自然语言处理(N ...

最新文章

  1. 装饰模式(Decorator)
  2. oracle中lang能不能查找,oracle中的查询语句
  3. java random构造方法_Java中的Random()函数及两种构造方法
  4. linux python qt 安装目录,Linux 下QT调用Python库文件 以及Linux 安装Python3.8开发环境 问题...
  5. cath数据库fasta备注_数据库(同源)搜索软件 FASTA 和 BLAST
  6. 数据库 'SqlPersistenceService' 的版本为 655,无法打开。此服务器支持 611 版及更低版...
  7. 饲料企业精细化生产管理方案
  8. 弯下腰,拾起你无价的尊严
  9. mac 修改conda镜像 condarc_win10 修改anaconda源
  10. c#编程指南(四) 组元(Tuple)
  11. 惠而浦扫地机器人充不进电_【新品上市】格卡诺新款智能扫地机器人(GKNSDJ2带刷款)...
  12. 引导页设计没有灵感,看这里!
  13. azure vnc控制台_使用扩展和标签控制Azure成本
  14. python 实现注册、登录功能
  15. js中如何优雅的写if判断
  16. python爬虫设计思路_python网络爬虫(9)构建基础爬虫思路
  17. 04 . Filebeat简介原理及配置文件和一些案例
  18. 有哪些方法能将纸质书籍转成PDF电子版
  19. UWP VS创建UWP应用项目
  20. Java-基础篇-03-【选择语句-循环语句-随机数】

热门文章

  1. ios上编译c语言,如何构建C编写的库并在iOS中使用
  2. 办公室计算机购置申请,关于办公室购置电脑的请示
  3. 工作中遇到的问题汇总
  4. 二维数组和多维数组的本质及寻址方式
  5. UmiJS基础+UmiUI安装使用+Mock使用示例+DvaJS案例
  6. 数据库三种概念模型——层次模型,网状模型,关系模型的优缺点总结
  7. wireshark使用及过滤器介绍
  8. ~5 ccf 2021-12-2 序列查询新解
  9. 多传感器分布式融合算法——多传感器网络协同目标跟踪和定位
  10. 第三次学车-侧位停车