股市新闻重要性学习与检测
本项目基于东方财富网新闻数据,通过历史新闻重要性学习,自动推荐重要新闻。
以下是本项目的设计过程。
数据量化
获取东方财富网新闻数据,与六六说财经重要新闻推荐数据,并在此基础上处理清洗数据。共 30000 个普通新闻与 1500 个重要新闻被筛选而出。
具体地,笔者将重要新闻的数据与普通新闻进行对应,考虑到可能有某些时段六六说并未选取新闻,只将重要新闻时间点前后 100 个普通新闻保留。
另外,笔者将一部分不影响重要性但出现频率很高的词语加入了黑名单。
数据可视化
将数据统计与新闻展示用一个网页呈现。
该网站基于 python flask。
计算算法
TF-IDF
TF-IDF = 词频 (TF) × 逆文档频率 (IDF)
其中,TF 用于衡量该词在该文段中的频率,计算方法为:
$$ \text{TF}(\text{词},\text{文本}) = \frac{\text{该词在当前文本出现的次数}*\text{该词长度}}{\text{文本长度}} $$
IDF 用于衡量该词在所有新闻中的普遍程度,计算方法为:
$$ \text{IDF}(\text{词}) = \ln(\frac{\text{总新闻数}}{\text{包含该词的新闻数}+1}) $$
逻辑回归
线性加权
对所有特征进行线性加权求和,对于某一个新闻,具体公式如下:
$$ z = w_1 x_1+w_2 x_2+\dots +w_n x_n+b $$
参数解释: 1. $x_1,x_2,\dots,x_n$:一条新闻对应的 TF-IDF 特征。 2. $w_1,w_2,\dots,w_n$:学习权重,表示该词的重要性: - $w_i>0$:这个词出现,新闻更重要; - $w_i<0$:这个词出现,新闻更不重要。 3. $b$:偏置项,常数项,用来微调整体基准值。 4. $z$:线性加权后的总分。
Sigmoid 激活函数
使用 Sigmoid 激活函数,将线性加权后的结果压缩到 $[0,1]$ 之间,对于一个新闻,公式如下:
$$ \hat{y}=\sigma(z) = \frac{1}{1+e^{-z}} $$
损失函数
量化预测值与真实标签的误差,整体损失:
$$ L(\textbf{w},b) = -\frac{1}{N}\sum_{i=1}^{N}{[y_i \ln{\hat{y_i}}+(1-y_i)\ln(1-\hat{y_i})]} $$
其中,$N$ 为样本新闻数量,$y_i$ 为第 $i$ 个新闻是否重要($y_i\in{0,1}$)。
偏导数的推导
使用导数中的链式法则计算出损失函数的梯度 $\nabla L$,用于梯度下降的计算。
其中 $l_i = y_i \ln{\hat{y_i}}+(1-y_i)\ln(1-\hat{y_i})$;$f_{i,j}=\text{TF-IDF}$
$$ \begin{align} \frac{\partial l_i}{\partial \hat{y_i}} &=\frac{\partial}{\partial \hat{y_i}}\left[y_i \ln{\hat{y_i}}+(1-y_i)\ln(1-\hat{y_i})\right]\ &=y_i\frac{\partial}{\partial \hat{y_i}}\ln{\hat{y_i}}-(1-y_i)\frac{\partial}{\partial \hat{y_i}}\ln(1-\hat{y_i})\ &=\frac{y_i}{\hat{y_i}}-\frac{1-y_i}{1-\hat{y_i}}\ \end{align} $$
$$ \begin{align} \frac{\partial \hat{y_i}}{\partial z_i} &=\frac{\partial}{\partial z_i} \frac{1}{1+e^{-z_i}}\ &=\hat{y_i}(1-\hat{y_i})\ \end{align} $$
$$ \begin{align} \frac{\partial l_i}{\partial z_i} &=\frac{\partial l_i}{\partial \hat{y_i}} \cdot \frac{\partial \hat{y_i}}{\partial z_i}\ &=\left(\frac{y_i}{\hat{y_i}}-\frac{1-y_i}{1-\hat{y_i}}\right)\cdot \hat{y_i}(1-\hat{y_i})\ &=y_i-\hat{y_i}\ \end{align} $$
$$ \frac{\partial z_i}{\partial w_j} = f_{i,j} $$
最终导数结果:
$$ \frac{\partial L}{\partial w_j} = \frac{1}{N}\sum_{i=1}^N \big(\hat{y}i - y_i\big) \cdot f $$
$$ \frac{\partial L}{\partial b} = \frac{1}{N}\sum_{i=1}^N \big(\hat{y}_i - y_i\big) $$
梯度下降
设学习率为 $\eta$,梯度下降规则:
$$ \text{新参数}=\text{旧参数}−\eta\cdot\text{偏导数} $$
权重 $w_j$ 更新公式:
$$ w_j \leftarrow w_j - \eta \cdot \frac{1}{N}\sum_{i=1}^N \big(\hat{y}i - y_i\big) f $$
权重 $b$ 更新公式:
$$ b \leftarrow b - \eta \cdot \frac{1}{N}\sum_{i=1}^N \big(\hat{y}_i - y_i\big) $$
上线
目前已上线服务器,进入内测阶段,地址:http://106.53.100.188:8100/。