0%

【量化投资】通达信板块数据提取

数据提取

从MongoDB中进取通达信板块数据,该数据均通过通达信api从服务器上提取并存入MongoDB。

实例

1. 模糊查询

MongoDB 使用 $regex 操作符来设置匹配字符串的正则表达式来进行模糊查询。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pymongo import MongoClient

#存入数据
def get_block_list(database):
stocklist = []
collection = db['stock_block']
for item in collection.find({'blockname':{'$regex':'酒'}},{'_id':0,'code':1}):
stocklist.append(item['code'])
stocklist = list(set(stocklist))
return stocklist

if __name__ == '__main__':
client = MongoClient('localhost', 27017)
db = client['quantaxis']
stocklist = get_block_list(database=db)
print("Total {} stocks are in this block.\n{}".format(len(stocklist),stocklist))
1
2
Total 69 stocks are in this block.
['600257', '000752', '600616', '600766', '600779', '601579', '603919', '603198', '600771', '603101', '600132', '000524', '600258', '605108', '000428', '600750', '000888', '603025', '002461', '600238', '600754', '601007', '000929', '000596', '600573', '600600', '603299', '600059', '600197', '002772', '600559', '300237', '600260', '600543', '000721', '600084', '600365', '000930', '000858', '000860', '603369', '000568', '600655', '600809', '600702', '002304', '002568', '000869', '600382', '600781', '002342', '000829', '600381', '600199', '002646', '603589', '603777', '002183', '000995', '600252', '000729', '603779', '002803', '002186', '600395', '600696', '600519', '000007', '000799']

2. 提取板块名称

用MongoDB命令提取

1
db.getCollection('stock_block').distinct('blockname')

用pymongo模块提取

1
2
3
4
5
6
7
8
from pymongo import MongoClient

client = MongoClient('localhost', 27017)
db = client['quantaxis']
collection = db['stock_block']

res = collection.distinct('blockname')
print(res[:10])

输出结果:

[None, '300ESG', '300周期', '300非周', '3D打印', '5G概念', 'BIPV概念', 'C2M概念', 'CRO概念', 'ETC概念']

如需要知道酒类板块的名称,可以采用模糊查询的方式来提取数据。

1
db.getCollection('stock_block').distinct('blockname',{'blockname':{$regex:'酒'}})

3. 提取板块中的股票代码及名称

查询板块白酒白酒概念中的股票列表(包括代码及名称)

仅提取代码

用MongoDB命令提取

因通达信同一板块定义中包含通达信行业、申万行业等不同分类,含有重复项,所以用去重方式进行查询。

1
db.getCollection('stock_block').distinct('code',{'blockname':'白酒'})
1
db.getCollection('stock_block').distinct('code',{'blockname':'白酒概念'})

用pymongo模块提取
1
2
3
4
5
6
7
8
9
from pymongo import MongoClient

client = MongoClient('localhost', 27017)
db = client['quantaxis']
collection = db['stock_block']

res = collection.distinct('code',{'blockname':'白酒'})
print("Total {} stocks are in this block".format(len(res)))
print(res)

1
2
Total 20 stocks are in this block
['000568', '000596', '000799', '000858', '000860', '000995', '002304', '002646', '600197', '600199', '600519', '600559', '600702', '600779', '600809', '603025', '603198', '603369', '603589', '603919']

提取代码及名称

需要使用联表查询,使用aggregate函数。

用MongoDB命令提取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
db.getCollection('stock_block').aggregate([{
$lookup: { // 左连接
from: "stock_list", // 关联到stock_list表
localField: "code", // stock_block 表关联的字段
foreignField: "code", // stock_list 表关联的字段
as: "stock_list"
}
},
{ $match : {'blockname' : '白酒'}},
{ $project: {'code':1,'stock_list.name':1,'_id':0}},
{ $unwind:'$stock_list'},
{ $replaceWith:{'code':'$code','name':'$stock_list.name'}},
{ $group: {_id:'$code','name':{ $first:"$name" }}},
{ $replaceWith:{'code':'$_id','name':'$name'}}
])

用pymongo模块提取
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
from pymongo import MongoClient

client = MongoClient('localhost', 27017)
db = client['quantaxis']
collection = db['stock_block']
count = 0

res = collection.aggregate(
[
{
'$lookup': { #左连接
'from': "stock_list", # 关联到stock_list表
'localField': "code", # stock_block 表关联的字段
'foreignField': "code", # stock_list 表关联的字段
'as': "stock_list"
}
},
{ '$match' : {'blockname' : '白酒'}},
{ '$project': {'code':1,'stock_list.name':1,'_id':0}},
{ '$unwind':'$stock_list'},
{ '$replaceWith':{'code':'$code','name':'$stock_list.name'}},
{ '$group': {'_id':'$code','name':{ '$first':"$name" }}},
{ '$replaceWith':{'code':'$_id','name':'$name'}}

])

for item in res:
print(item)
count = count + 1
print("Total {} stocks are in this block".format(count))
  • 白酒板块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{'code': '000858', 'name': '五 粮 液'}
{'code': '600519', 'name': '贵州茅台'}
{'code': '002646', 'name': '青青稞酒'}
{'code': '600809', 'name': '山西汾酒'}
{'code': '000995', 'name': '皇台酒业'}
{'code': '603025', 'name': '大豪科技'}
{'code': '002304', 'name': '洋河股份'}
{'code': '000596', 'name': '古井贡酒'}
{'code': '600559', 'name': '老白干酒'}
{'code': '603198', 'name': '迎驾贡酒'}
{'code': '000799', 'name': '酒鬼酒'}
{'code': '603369', 'name': '今世缘'}
{'code': '603589', 'name': '口子窖'}
{'code': '600779', 'name': '水井坊'}
{'code': '600199', 'name': '金种子酒'}
{'code': '600702', 'name': '舍得酒业'}
{'code': '000860', 'name': '顺鑫农业'}
{'code': '603919', 'name': '金徽酒'}
{'code': '000568', 'name': '泸州老窖'}
{'code': '600197', 'name': '伊力特'}
Total 20 stocks are in this block
  • 白酒概念板块
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
{'code': '600238', 'name': '海南椰岛'}
{'code': '002304', 'name': '洋河股份'}
{'code': '000596', 'name': '古井贡酒'}
{'code': '600382', 'name': '*ST广珠'}
{'code': '600750', 'name': '江中药业'}
{'code': '600252', 'name': '中恒集团'}
{'code': '002646', 'name': '青青稞酒'}
{'code': '600519', 'name': '贵州茅台'}
{'code': '600696', 'name': '岩石股份'}
{'code': '600771', 'name': '广誉远'}
{'code': '600809', 'name': '山西汾酒'}
{'code': '603919', 'name': '金徽酒'}
{'code': '600655', 'name': '豫园股份'}
{'code': '000888', 'name': '峨眉山A'}
{'code': '000930', 'name': '中粮科技'}
{'code': '000829', 'name': '天音控股'}
{'code': '002183', 'name': '怡 亚 通'}
{'code': '002342', 'name': '巨力索具'}
{'code': '000799', 'name': '酒鬼酒'}
{'code': '002803', 'name': '吉宏股份'}
{'code': '300237', 'name': '美晨生态'}
{'code': '600257', 'name': '大湖股份'}
{'code': '002772', 'name': '众兴菌业'}
{'code': '600260', 'name': 'ST凯乐'}
{'code': '600395', 'name': '盘江股份'}
{'code': '600559', 'name': '老白干酒'}
{'code': '000995', 'name': '皇台酒业'}
{'code': '600766', 'name': '*ST园城'}
{'code': '603101', 'name': '汇嘉时代'}
{'code': '603198', 'name': '迎驾贡酒'}
{'code': '603025', 'name': '大豪科技'}
{'code': '603369', 'name': '今世缘'}
{'code': '603777', 'name': '来伊份'}
{'code': '000568', 'name': '泸州老窖'}
{'code': '600197', 'name': '伊力特'}
{'code': '000858', 'name': '五 粮 液'}
{'code': '600779', 'name': '水井坊'}
{'code': '600199', 'name': '金种子酒'}
{'code': '600702', 'name': '舍得酒业'}
{'code': '000860', 'name': '顺鑫农业'}
{'code': '600781', 'name': 'ST辅仁'}
{'code': '603589', 'name': '口子窖'}
{'code': '600381', 'name': '青海春天'}
{'code': '603299', 'name': '苏盐井神'}
Total 44 stocks are in this block

4. 查询股票所属板块

贵州茅台(600519)为例:

用MongoDB命令提取

1
db.getCollection('stock_block').distinct('blockname',{'code':'600519'})

用pymongo模块提取

1
2
3
4
5
6
7
8
9
from pymongo import MongoClient

client = MongoClient('localhost', 27017)
db = client['quantaxis']
collection = db['stock_block']

res = collection.distinct('blockname',{'code':'600519'})
print("The stock belongs to Total {} blocks".format(len(res)))
print(res)
1
2
The stock belongs to Total 36 blocks
['300ESG', '300非周', 'MSCI成份', '上证180', '上证50', '上证混改', '上证超大', '中华A80', '中证100', '中证龙头', '保险重仓', '北上重仓', '国证农业', '国证成长', '基金重仓', '大盘成长', '大盘股', '央视50', '富时A50', '投资时钟', '持续增长', '昨成交20', '沪深300', '泛珠三角', '白酒', '白酒概念', '百元股', '绩优股', '罗素大盘', '股权转让', '融资融券', '行业龙头', '证金汇金', '通达信88', '银河99', '高市净率']

参考

1/ Aggregation — MongoDB Manual

2/ $group (aggregation) — MongoDB Manual