从新浪财经、每经网、金融界、中国证券网、证券时报网上,爬取上市公司(个股)的历史新闻文本数据进行文本分析、提取特征集,然后利用SVM、随机森林等分类器进行训练,最后对实施抓取的新闻数据进行分类预测
上市公司新闻文本分析与分类预测的基本步骤如下:
开发环境Python-v3(3.6)
:
由于之前的项目代码是在初学Python的时候写的,很多写法都是入门级别,因此为了提高整体项目的质量,除了优化代码细节和已有的功能模块之外,还加入了多个功能模块,来支撑未来更加智能化和个性化的金融分析与交易。
数据获取模块
,数据清洗与预处理模块
,大数据可视化模块
,基于机器学习的文本挖掘模块
,金融知识图谱构建模块
,任务导向多轮对话模块
,金融交易模块
,通用服务模块
(备注:项目在完善之后会重新更名为Finnews Hunter
,命名的来源是出于对《全职猎人》
的喜爱,与项目本质的结合,其中Finnews
是Financial News
的简写。上面提到的8个模块,分别由《全职猎人》
中的本人最喜爱的8位角色命名,分别是数据获取模块
-> Gon -> 网页爬虫、各种数据源API调用等
数据清洗与预处理模块
-> Killua -> 数据清洗、数据转换(数据采样、类型转换、归一化等)、数据描述(数据可视化)、特征选择与组合(熵增益和分支定界等)、特征抽取(主成分分析、线性判别分析等)
大数据可视化模块
-> Kurapika -> 基于多个可视化模块进行封装,包括提供Web可视化界面
自然语言处理模块
-> Leorio -> 中文分词、词性标注、实体识别
基于机器学习的文本挖掘模块
-> Hisoka -> ``金融知识图谱构建模块
-> Chrollo -> ``任务导向多轮对话模块
-> Illumi -> ``金融交易模块
-> Feitan -> ``基础与Web服务模块
-> Kite -> 基础服务集,包括基本参数配置文件(.py)、数据库的构建与连接、日志打印与收集、多线程服务、Web服务框架搭建以及其他函数
)注意:
更新crawler_tushare.py代码为stockinfospyder.py,直接运行即可获取股票历史价格数据,并在每天15:30分后更新数据(目前只采集天数据)
from Kite import config
from Gon.stockinfospyder import StockInfoSpyder
stock_info_spyder = StockInfoSpyder(config.STOCK_DATABASE_NAME, config.COLLECTION_NAME_STOCK_BASIC_INFO)
# 指定时间段,获取历史数据,如:stock_info_spyder.get_historical_news(start_date="20150101", end_date="20201204")
# 如果没有指定时间段,且数据库已存在部分数据,则从最新的数据时间开始获取直到现在,比如数据库里已有sh600000价格数据到
# 2020-12-03号,如不设定具体时间,则从自动获取sh600000自2020-12-04至当前的价格数据
stock_info_spyder.get_historical_news()
from Kite import config
from Gon.stockinfospyder import StockInfoSpyder
stock_info_spyder = StockInfoSpyder(config.STOCK_DATABASE_NAME, config.COLLECTION_NAME_STOCK_BASIC_INFO)
stock_info_spyder.get_realtime_news()
更新crawler_cnstock.py代码为cnstockspyder.py,直接运行即可获取中国证券网历史新闻数据,并可以实时更新采集
import time
import logging
from Kite import config
from Killua.denull import DeNull
from Killua.deduplication import Deduplication
from Gon.cnstockspyder import CnStockSpyder
cnstock_spyder = CnStockSpyder(config.DATABASE_NAME, config.COLLECTION_NAME_CNSTOCK)
for url_to_be_crawled, type_chn in config.WEBSITES_LIST_TO_BE_CRAWLED_CNSTOCK.items():
logging.info("start crawling {} ...".format(url_to_be_crawled))
cnstock_spyder.get_historical_news(url_to_be_crawled, category_chn=type_chn)
logging.info("finished ...")
time.sleep(30)
Deduplication(config.DATABASE_NAME, config.COLLECTION_NAME_CNSTOCK).run()
DeNull(config.DATABASE_NAME, config.COLLECTION_NAME_CNSTOCK).run()
import time, logging, threading
from Kite import config
from Kite.database import Database
from Killua.denull import DeNull
from Killua.deduplication import Deduplication
from Gon.cnstockspyder import CnStockSpyder
obj = Database()
df = obj.get_data(config.DATABASE_NAME, config.COLLECTION_NAME_CNSTOCK, keys=["Date", "Category"])
cnstock_spyder = CnStockSpyder(config.DATABASE_NAME, config.COLLECTION_NAME_CNSTOCK)
# 先补充历史数据,比如已爬取数据到2020-12-01,但是启动实时爬取程序在2020-12-23,则先
# 自动补充爬取2020-12-02至2020-12-23的新闻数据
for url_to_be_crawled, type_chn in config.WEBSITES_LIST_TO_BE_CRAWLED_CNSTOCK.items():
# 查询type_chn的最近一条数据的时间
latets_date_in_db = max(df[df.Category == type_chn]["Date"].to_list())
cnstock_spyder.get_historical_news(url_to_be_crawled, category_chn=type_chn, start_date=latets_date_in_db)
Deduplication(config.DATABASE_NAME, config.COLLECTION_NAME_CNSTOCK).run()
DeNull(config.DATABASE_NAME, config.COLLECTION_NAME_CNSTOCK).run()
# 开启多线程并行实时爬取
thread_list = []
for url, type_chn in config.WEBSITES_LIST_TO_BE_CRAWLED_CNSTOCK.items():
thread = threading.Thread(target=cnstock_spyder.get_realtime_news, args=(url, type_chn, 60))
thread_list.append(thread)
for thread in thread_list:
thread.start()
for thread in thread_list:
thread.join()
更新crawler_jrj.py代码为jrjspyder.py,直接运行即可获取金融界历史新闻数据,并可以实时更新采集
from Kite import config
from Killua.denull import DeNull
from Killua.deduplication import Deduplication
from Gon.jrjspyder import JrjSpyder
jrj_spyder = JrjSpyder(config.DATABASE_NAME, config.COLLECTION_NAME_JRJ)
jrj_spyder.get_historical_news(config.WEBSITES_LIST_TO_BE_CRAWLED_JRJ, start_date="2015-01-01")
Deduplication(config.DATABASE_NAME, config.COLLECTION_NAME_JRJ).run()
DeNull(config.DATABASE_NAME, config.COLLECTION_NAME_JRJ).run()
from Kite import config
from Gon.jrjspyder import JrjSpyder
jrj_spyder = JrjSpyder(config.DATABASE_NAME, config.COLLECTION_NAME_JRJ)
jrj_spyder.get_historical_news(config.WEBSITES_LIST_TO_BE_CRAWLED_JRJ) # 补充爬虫数据到最新日期
jrj_spyder.get_realtime_news()
更新crawler_nbd.py代码为nbdspyder.py,直接运行即可获取每经网历史新闻数据,并可以实时更新采集
from Kite import config
from Killua.denull import DeNull
from Killua.deduplication import Deduplication
from Gon.nbdspyder import NbdSpyder
nbd_spyder = NbdSpyder(config.DATABASE_NAME, config.COLLECTION_NAME_NBD)
nbd_spyder.get_historical_news(start_page=684)
Deduplication(config.DATABASE_NAME, config.COLLECTION_NAME_NBD).run()
DeNull(config.DATABASE_NAME, config.COLLECTION_NAME_NBD).run()
from Kite import config
from Killua.denull import DeNull
from Killua.deduplication import Deduplication
from Gon.nbdspyder import NbdSpyder
# 如果没有历史数据从头爬取,如果已爬取历史数据,则从最新的时间开始爬取
# 如历史数据中最近的新闻时间是"2020-12-09 20:37:10",则从该时间开始爬取
nbd_spyder = NbdSpyder(config.DATABASE_NAME, config.COLLECTION_NAME_NBD)
nbd_spyder.get_historical_news()
Deduplication(config.DATABASE_NAME, config.COLLECTION_NAME_NBD).run()
DeNull(config.DATABASE_NAME, config.COLLECTION_NAME_NBD).run()
nbd_spyder.get_realtime_news()
更新crawler_sina.py代码为sinaspyder.py,直接运行即可获取新浪财经历史新闻数据(未更新)
停止证券时报网
爬虫代码的更新(旧代码已不可用),新增网易财经
和凤凰财经
的爬虫代码(未更新)
新增buildstocknewsdb.py如果已经在每经网、中国证券网和金融界爬取了一定量新闻文本,接下来就是针对每支股票构建对应的新闻数据库,并根据股价贴上3/5/10/15/30/60天标签,具体判断条件查看buildstocknewsdb.py第111-116行注释
from Kite import config
from Killua.buildstocknewsdb import GenStockNewsDB
gen_stock_news_db = GenStockNewsDB()
gen_stock_news_db.get_all_news_about_specific_stock(config.DATABASE_NAME, config.COLLECTION_NAME_CNSTOCK)
gen_stock_news_db.get_all_news_about_specific_stock(config.DATABASE_NAME, config.COLLECTION_NAME_NBD)
gen_stock_news_db.get_all_news_about_specific_stock(config.DATABASE_NAME, config.COLLECTION_NAME_JRJ)
from Kite import config
from Killua.buildstocknewsdb import GenStockNewsDB
gen_stock_news_db = GenStockNewsDB()
gen_stock_news_db.listen_redis_queue()
新增realtime_spyder_startup.bat同时以下程序
新增realtime_spyder_stopall.bat批量终止爬虫程序
更新前使用jieba分词系统,在实体识别上需要不断维护新词表来提高识别精度;更新后,使用基于BERT预训练的FinBERT对金融领域实体进行识别