股价与股民情绪是否有相关性?基于大模型来快速验证
A) 背景
前几年摸索和学习深度学习时,曾尝试过使用 LSTM 来做时间序列预测,即给定以往的序列数据,预测未来的数据。当时就做了一套服务端用于专门获取股票数据,以及计算股票的 KDJ/MACD 指标,还做了前端的页面用 tensorflow.js 在浏览器内进行训练(真是为了一碟醋包了一桌的饺子),有人可能想问,最后成了吗?预测成功了吗?当然没有,否则我就不会继续在这里逼逼叨了。
倒也不是技术上的问题,就是股票市场变化因素太多,想进行预测本身就是十分困难的。但是那时我就在想,股民的情绪和股价是否有关联?有什么关联?如果有关联,那么我们是否可以通过情绪来预测未来走势呢?
可行的技术方案:抓取网络上股票相关网站的评论,并进行标准化的评估,将评估完成的数据存储起来,当评论数量达到一定量时,可以计算出一个综合的情绪指数,然后将这个指数和股价进行对比,看看是否有相关性。
然而当时评估手段有限,进过一番查找,并没有找到合适的模型去输出一个标准化的情绪结果,所以这个想法也就搁置了。
B) 枯木逢春
大语言模型已经火了快两年了,在这个时间节点,自建大模型也来到了成本可被接受的阶段,于是这个想法又被重新拾起来,去实现。
1.服务端
在本案例中,对于服务端,笔者采用 Express + MariaDB 来提供服务,使用 pm2 来管理服务。通过使用 crontab 来定时执行抓取评论的任务,每 12 小时执行一次。
2. 大模型的搭建
大模型相关的整体在阿里云部署,涉及 NAS 存储与 FC 函数计算,细节如下:
- NAS 存储:用于存储大模型代码与模型文件
- FC 函数计算:用于调用大模型进行推理
直接租用 GPU 云服务器进行推理,成本太高,所以选择了 FC 函数计算,主要是因为 FC 的计算资源是按量付费的,在不使用的时候,可以将资源释放,不会产生额外的费用。
3. 数据收集
在本案例中,我们爬取的主要是东方财富网的,关于上证指数的评论。每天平均可以抓取到 2000 条左右的评论,周末 200 条左右。顺便抓取了恒生指数和纳斯达克指数的评论,但是由于后两者评论数量太少,所以不具备统计意义。
股票数据的获取,笔者采用的是沧海数据的接口,可以获取到指数的当日数据。
4.推理
评估一条评论的情绪,在没有专门的模型来进行评估的情况下,可以使用大语言模型来进行评估,设置适当的Prompt,让模型输出 0 或 1,来表示这条评论的情绪是正面还是负面。在本案例中,笔者采用的是开源的 chatglm_6b 大模型。进过审慎测算,准确率达到85%以上,由于部分评论实时性较强(”破3000点”这个评论,在3050是为负面,在2950时则又转变为正面),或者带点阴阳怪气,所以会出现评估错误,不过这些错误可以通过后续写特定规则的 SQL 来修正。
5.统计
将评论内容与评估的情绪结果存储到数据库中,将评论的发布时间也一并存储,这是非常必要的,设计的表结构如下:
这样一来就非常直观了,如果要计算某一天的情绪指数,只需要统计这一天的评论情绪值的平均值即可。输出的结果在 0-1 之间,越接近 1 表示正面情绪越高,越接近 0 表示负面情绪越高。
C) 上证指数归一化
这是2024年3月8日以来的情绪走势
同期的上证指数走势如下所示
将这两个数据放在同一个图表中,由于情绪走势是 0-1 之间的,而上证指数介于 2900 - 3100 之间,对比会非常不直观,所以需要对上证指数进行归一化处理,将其也转换到 0-1 之间。
const indexStandardized = (close / (indexAverage * 2)).toFixed(4)
将每日的收盘价除以当期上证指数均值的两倍,可得到归一化后的数据。
但是经过实践后发现,将数值在3000左右的数据归一化到 0-1 之间,由于每日的波动在10-100内,导致归一化后的数据波动非常小,所以需要对数据进行进一步处理。
const indexStandardized = ((close + (close - indexAverage) * 20) / (indexAverage * 2)).toFixed(4)
在除以均值的两倍之前,先将当日的收盘价加上收盘价与均值的差值的 20 倍,相当于将每日的变化波动等比例放大 20 倍,这样再归一化之后,就可以看到更明显的波动了。
注意,这里并不是一定要取 20,会根据实际情况采取最好的比例。
D) 结论
当我们将情绪走势和上证指数归一化后的走势绘制在同一个图表中,就可以明显发现其相关性。
可以明显观察到,情绪指数总是在 0.4 - 0.6 之间波动,而设定波动放大 20 倍后的上证指数波动在 也均在 0.4 - 0.6 之间,两者的波动趋势存在明显的相关性。其实这个结果也是可以预料的,因为股民的情绪和股价确实是有关联的。
E) FAQ
Q:既然知道有关联,那做这个还有什么必要呢?
A: 假设需要被验证,否则就是空谈,在验证的过程中,我们可能会发现一些额外的规律;另外,通过此验证方法,我们可以将抽象的情绪量化,方便以后进行更深入的研究。另外,收集到的大量评论语料也是非常有价值的,后续可以利用起来。
Q:能赚到钱吗?
A:不能,或者说暂时不能,否则我就不会在这逼逼叨了。
Q:接下来有什么打算?
A:通过现有的评论数据及其情绪评估数据,使用 LSTM 来训练出自己的情绪分类模型;或者使用这些语料做文本生成。