Popular blog tags

Elasticsearch股票分析

Published

1.制作股票代号-股票名称同义词词典,并添加入路径(同时需要将股票名称添加进拓展词典)

首先,通过Python,我们将收集股票名称和股票代码来制作同义词词典。

股票数据来源来自于东方财富网

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import requests
from bs4 import BeautifulSoup
#用两个列表分别存储上证和深证各支股票的信息
sh = []
sz = []
with requests.Session() as s:
html = s.get(r'http://quote.eastmoney.com/stocklist.html')
soup = BeautifulSoup(html.content, 'lxml')
sh_stocks =soup.find_all('ul')[7]
for i in sh_stocks.find_all('li'):
sh.append(i.a.text)
sz_stocks =soup.find_all('ul')[8]
for i in sz_stocks.find_all('li'):
sz.append(i.a.text)

输出的本文结果为如下格式

1
2
3
4
5
6
7
8
9
10
11
...
501001,财通精选
501002,能源互联
501003,上海改革
501005,精准医疗
...
510190,龙头etf
510210,综指etf
510220,中小etf
510230,金融etf
...

首先,由于分词ik不能识别股票名称(不能正确分词),即使添加了同义词词典也无法检索到,所以需要在拓展词库中添加全部股票名称。

其中,由于用户输入一般是忽略大小写的,为了方便用户能够输入大小写都能匹配到股票信息,我们将拓展词典、同义词词典的股票名称信息都更改为小写,这样无论用户输入大写还是小写都能匹配到股票。

暂时没有找到关闭 filter 号的方法,所以搜索不了 stXX股票

有没有可能去除st等标记,因标记是在原股票名称前添加,不改变原股票名称

2.学习使用html_strip filter

html strip filter 代码如下:

1
2
3
4
5
6
"char_filter": {
"my_html": {
"type": "html_strip",
"escaped_tags": []
}
}

其中escaped_tags字段表示该列表之中的标签不用去除

3.创建索引,并设置IK为Tokenizer,Filter包括同义词和html_strip

完整设置和mapping如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
{
"settings": {
"index" : {
"analysis" : {
"analyzer" : {
"my_analyzer" : {
"tokenizer" : "my_ik",
"filter" : ["my_stop","synonym"],
"char_filter": ["my_html"]
}
},
"char_filter": {
"my_html": {
"type": "html_strip",
"escaped_tags": []
}
},
"filter" : {
"synonym" : {
"type" : "synonym",
"synonyms_path" : "synonym.txt"
},
"my_stop":{
"type":"stop",
"stopwords":"_none_"
}
},
"tokenizer":{
"my_ik":{
"type":"ik_max_word",
"enable_lowercase":true
}
}
}
}
},
"mappings":{
"news":{ //类型名,这里为news
"properties": {
"title": {
"type": "text",
"analyzer": "my_analyzer"
},
"keywords":{
"type": "text",
"analyzer": "my_analyzer"
},
"content":{
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
}

还需要完善:

  • 对于不需要和不希望加入搜索的字段进行not_analyze设置
  • 设置日期字段的数值类型date

4.对已有数据进行reindex(约34w数据)

之前进行reindex速度明显比这次高,原因是上次没有使用analyzer。

此次reindex 34w数据共用时793秒,每1秒操作428个文档。

如无analyzer,则每一秒操作1581个文档。

5.使用function_score进行filter检索,发布时间越靠前的得分越高

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
GET test/news/_search?search_type=dfs_query_then_fetch
{
"_source": ["title","publishdate"],
"query": {
"function_score": {
"query":{
"match": {
"title": "600340"
}
} ,
"functions": [
{
"exp": {
"publishdate" : {
"origin": "now",
"offset": "1h",
"scale" : "30d",
"decay": 0.2
}
},
"weight": 200
}
],
"boost_mode": "sum"
}
}
}

其中使用的是function score querydecayfunction(衰减函数)。

各参数设置如图:

stocksight

stocksight是一个开源的股票市场分析软件,它使用Elasticsearch存储Twitter和股票的新闻标题数据。stocksight分析作者所写内容的情感,并对文本进行情绪分析,以确定作者对股票的“感觉”。

https://www.5axxw.com/wiki/content/ecshb2

1.自己通过echarts之类的可视化框架做可视化也是个不错的选择,不过前期成本太大。

2. pandas+matplotlib已经足以应付大部分需求了,可是交互感太弱,所以借助一个可视化应用是很有必要的.

3.选择的是kibana, 它的竞品有Grafana.

Kibana 是为 Elasticsearch设计的开源分析和可视化平台.

https://zhuanlan.zhihu.com/p/76758435

 

Useful links

数据情况:
全部为股票及指数的分钟K线数据。

从mongodb导入数据到elastic search

https://zhuanlan.zhihu.com/p/50294393