上市公司新闻文本分析与分类预测的基本步骤如下:
开发环境Python-v3(3.6)
:
由于之前的项目代码是在初学Python的时候写的,很多写法都是入门级别,因此为了提高整体项目的质量,除了优化代码细节和已有的功能模块之外,还加入了多个功能模块,来支撑未来更加智能化和个性化的金融分析与交易。
完成初步构想,重构该项目,将项目分成8大模块,分别是数据获取模块
,数据清洗与预处理模块
,大数据可视化模块
,基于机器学习的文本挖掘模块
,金融知识图谱构建模块
,任务导向多轮对话模块
,金融交易模块
,通用服务模块
(备注:项目在完善之后会重新更名为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()
- example-2 开启自动化更新所有股票价格数据(目前只支持在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_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()
- example-2 实时更新新闻数据库,并且将新数据推进redis消息队列等待处理
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)
for url_to_be_crawled, type_chn in config.WEBSITES_LIST_TO_BE_CRAWLED_CNSTOCK.items():
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()
- example-2 已爬取一定量的历史数据下,开启实时更新新闻数据库,并且将新数据推进redis消息队列等待处理
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()
- example-2 已爬取一定量的历史数据下,开启实时更新新闻数据库,并且将新数据推进redis消息队列等待处理
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()
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)
- example-2 监听redis消息队列,将新的数据分别存入与该新闻相关的所有股票新闻数据库中
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同时以下程序
更新前使用jieba分词系统,在实体识别上需要不断维护新词表来提高识别精度;更新后,使用基于BERT预训练的FinBERT对金融领域实体进行识别