大家好,最近大a的白马股们简直 跌妈不认,作为重仓了抱团白马股基金的养鸡少年,每日那是一个以泪洗面啊。
不过从金融界最近一个交易日的大盘云图来看,其实很多中小股还是红色滴,绿的都是白马股们。
以下截图来自金融界网站-大盘云图:
那么,今天我们试着用python爬取最近交易日的股票数据,并试着用excel简单绘制以下上面这个树状图。本文旨在抛砖引玉,吼吼。
1. python爬取网易财经不同板块股票数据
目标网址:
http://quotes.money.163.com/old/#query=hy010000&datatype=hs_rank&sort=percent&order=desc&count=24&page=0
由于这个爬虫部分比较简单,这里不做过多赘述,仅介绍一下思路并附上完整代码供大家参考。
爬虫思路:
- 请求目标网站数据,解析出主要行业(新)的数据:行业板块名称及对应id(如金融,hy010000)
- 根据行业板块对应id构造新的行业股票数据网页
- 由于翻页网址不变,按照《》的里的套路找到股票列表数据的真实地址
- 代入参数,获取全部页数,然后翻页爬取全部数据
爬虫代码:
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
56
57
58
59
60
61
62
|
# -*- coding: utf-8 -*-
"""
created feb 28 10:30:56 2021
@author: 可以叫我才哥
"""
import requests
import re
import pandas as pd
# 获取全部板块及板块id
url = 'http://quotes.money.163.com/old/#query=hy001000&datatype=hs_rank&sort=percent&order=desc&count=24&page=0'
r = requests.get(url)
html = r.text
# 替换非字符为空,便于下面的正则
html = re.sub( '\s' ,'',html)
# 正则获取 板块及id所在区域
labelhtml = re.findall(r '</span>主要行业\(新\)</a>(.*?)</span>证监会行业\(新\)' ,html)[ 0 ]
# 正则板块和id,结果为由元组组成的列表
label = re.findall(r '"qid="(hy.*?)"qquery=.*?"title="(.*?)">' ,labelhtml)
# 转化为dataframe类型
dflabel = pd.dataframe(label,columns = [ 'id' , '板块' ])
# 根据板块id和翻页获取页面数据(json格式)
def get_json(hy_id, page):
query = 'plate_ids:' + str (hy_id)
params = {
'host' : 'http://quotes.money.163.com/hs/service/diyrank.php' ,
'page' : page,
'query' : query,
'fields' : 'no,symbol,name,price,percent,updown,five_minute,open,yestclose,high,low,volume,turnover,hs,lb,wb,zf,pe,mcap,tcap,mfsum,mfratio.mfratio2,mfratio.mfratio10,sname,code,announmt,uvsnews' , #你可以不用这么多字段
'sort' : 'percent' ,
'order' : 'desc' ,
'count' : '24' ,
'type' : 'query' ,
}
url = 'http://quotes.money.163.com/hs/service/diyrank.php?'
r = requests.get(url,params = params)
j = r.json()
return j
# 空列表用于存取每页数据
dfs = []
# 遍历全部板块
for hy_id,板块 in dflabel.values:
# 获取页数
j = get_json(hy_id, 0 )
pages = j[ 'pagecount' ]
for page in range (pages):
j = get_json(hy_id, page)
data = j[ 'list' ]
df = pd.dataframe(data)
df[ '板块' ] = 板块
dfs.append(df)
print (f '已爬取{len(dfs)}个板块数据' )
result = pd.concat(dfs)
|
2. excel树状图
excel树状图是在office2016级之后版本中新加的图表类型,想要绘制需要基于此版本及之后的版本哦。
2.1. 简单的树状图
简单的树状图绘制流程:框选数据—>插入—>图表—>选中树状图 即可。
以下图为例,在树状图中,每个色块代表一个省份,色块面积大小则由其gdo值大小决定。
2.2. 带有增长率的树状图
我们发现,在基础的树状图中,色块颜色除了区别色块之外并没有其他特殊含义。拿gdp来说,除了值之外我们一般也会去看其增长率,那么是否可以让色块颜色和增长率有关联呢?
下面我们试着探究一下,如果成功的话,那么金融界的大盘云图似乎也可以用excel树状图来进行绘制了不是!
思路:
- 我们希望色块颜色能代表增长率,比如红色是上涨,绿色是下降且颜色越深代表绝对值越大
- 再对每个色块进行对应的颜色填充即可
由于 树状图顶多支持多级,色块颜色也只能手动单一填充,怎么办呢?既然手动可以,那么其实就可以用vba自动化这个过程咯。
2.3.1. 增长率配色
基于思路1,我们需要对增长率进行配色,最简单的就是用条件格式里的色阶。
框选增长率数据—>开始—>条件格式—>色阶(选中那个让值越大颜色越红的,由于这里有负增长率,所以选了带红绿的):
为了更好的展示区分正负增长率,我们在设置完色阶后再进行管理规则:
- 我们将中间值设为数字0,这样负增长率就是绿色,正增长率就是红色;
- 我们将最大值设置为百分点值80,也就是增长率前80%的值都是最红的。
最终配色效果:
2.3.2. vba填充色块颜色
先看效果:
湖北因为收到疫情影响最大,有接近小半年属于封省状态,全年增长率为负数。
由于条件格式下单元格颜色是不固定的无法通过vba获取,我们需要将颜色赋值到新的一列中去,需要用到如下操作:
**选中增长率数据复制,然后点击剪切板最右下角会出现剪贴板,再鼠标左键选择需要粘贴的地方如e2,点击剪贴板中需要粘贴的数据即可。**这个时候,被粘贴的单元格区域的颜色就是固定的了,你可以选择删除数据只留颜色部分。
vba思路:
激活需要操作的图表(activate)
遍历全部的系列和数据点(activechart.fullseriescollection(1).points.count)
从第一个数据点开始,获取对应增长率单元格颜色(activesheet.range("e" & i + 1).interior.color)
将单元格赋值给该数据点(selection.format.fill.forecolor.rgb)
vba代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
sub my_color()
activesheet.chartobjects( "图表 1" ).activate
'遍历全部的数据点
for i = 1 to activechart.fullseriescollection( 1 ).points.count
'选中数据点
activechart.fullseriescollection( 1 ).points(i).select
'获取单元格颜色
mycolor = activesheet. range ( "e" & i + 1 ).interior.color
'将单元格颜色赋值给对应数据点填充色
selection. format .fill.forecolor.rgb = mycolor
next
end sub
|
执行脚本过程如下:
好了,以上就是本次全部内容,大家可以试着爬取股票数据,然后试着绘制一下。
温馨提示:接近小5000股票数据,vba填充色块颜色会卡死,不建议全选操作。
以上就是python爬取股票最新数据并用excel绘制树状图的示例的详细内容,更多关于python 爬取股票数据并绘图的资料请关注服务器之家其它相关文章!
原文链接:https://www.cnblogs.com/the7theme/p/14458886.html