Python股票资金流向数据可视化分析

时间:2024-02-20 15:41:51

一、摘要:

  本选题应用Python网络爬虫方法,在东方财富网站爬取个股资金流实时数据,通过数据可视化,展现各企业当日股价、涨跌率、净额度、主力净流入情况。

二、选题背景:

  随着社会的高速发展,股票作为股份公司为筹建资金而发行的一种有价证券,是证明投资者投资入股并据以获取股利收入的一种股权凭证,早已走进千家万户,成为许多家庭投资的重要目标。股票投资已成为老百姓日常谈论的热门话题,但股票具有高收益、高风险的特点,所以在“炒股”过程中需要异常谨慎。

  身为学习Python数据处理编程的人来说,最为清楚图形中的奥秘:一张好的可视化图形,不仅能够直观的表现出事物的现象,还能够揭示现象背后的本质;而一张差强人意的可视化图,却会给人以误导,蒙蔽现象背后的本质。在当今信息化时代,涌现了许多关于”炒股”的软件,有些股票软件数据杂乱无章,图表信息量大且不能简单明了,并不能为炒股人带去帮助。制作合适的图形来展示股市的变化信息对”炒股”来说尤为重要。在学习本课程中,学习到了一些网络爬虫和数据可视化的相关知识,利用这些知识绘制一些关于每天股市变化的相关信息,帮助炒股人规避一定的风险。

三、数据说明:

  爬取东方财富网实时更新的企业资金流向数据,绘制股票价格条形图、涨跌幅折线图、净额饼图,展现各企业当天的股票行情。

四、实施过程及代码:

1、企业当日个股资金流数据情况:

1)数据爬取

 1 import requests
 2 import json
 3 import matplotlib.pyplot as plt
 4 import pandas as pd
 5 from bs4 import BeautifulSoup 
 6 
 7  #设置浏览器对象
 8 headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"}
 9 
10 #headers=headers表示伪装浏览器访问
11 resp=requests.get("http://push2.eastmoney.com/api/qt/clist/get?pn=1&pz=50&po=1&np=1&ut=b2884a393a59ad64002292a3e90d46a5&fltt=2&invt=2&fid0=f4001&fid=f62&fs=m:0+t:6+f:!2,m:0+t:13+f:!2,m:0+t:80+f:!2,m:1+t:2+f:!2,m:1+t:23+f:!2,m:0+t:7+f:!2,m:1+t:3+f:!2&stat=1&fields=f12,f14,f2,f3,f62,f184,f66,f69,f72,f75,f78,f81,f84,f87,f204,f205,f124&rt=53597607&cb=jQuery18303181849503270513_1607928142376&_=1607928235420",headers=headers)#headers=headers表示伪装浏览器访问
12 
13 #print(resp.text)   #输出网页内容
14 #把网页内容存入content变量
15 content=resp.text
16 
17 #去掉前后不是大括号内的代码
18 rest=content.replace(\'jQuery18303181849503270513_1607928142376(\',\'\').replace(\');\',\'\')  #去掉前后不是大括号内的代码
19 
20 #rest
21 #将代码通过json库载入,成为键值对的形式
22 resp_dict=json.loads(rest)
23 
24 #提取data里diff列表内容
25 datas=resp_dict.get(\'data\').get(\'diff\')
26 
27 #输出网页内容
28 print(datas)

2)数据集构建

 1 #构建数据集
 2 companies=[]
 3 prices=[]
 4 shares_1=[]
 5 uds=[]
 6 moneys=[]
 7 
 8 #遍历datas内容
 9 for data in datas:
10     
11     #公司名
12     company=data.get(\'f14\')
13     
14     #今日主力净流入 净占比
15     share_1=data.get(\'f184\')
16     
17     #净额
18     money=data.get(\'f62\')
19     
20     #当日涨跌幅
21     ud=data.get(\'f3\')
22     
23     #当天股价
24     price=data.get(\'f2\')
25     
26     #把公司数据追加到companies
27     companies.append(company)
28     
29     #把股价数据追加到prices
30     prices.append(price)
31     
32     #把净额数据追加到moneys
33     moneys.append(money)
34     
35     #把净占比追加到shares_1
36     shares_1.append(share_1)
37     
38     #把涨跌幅数据追加到uds
39     uds.append(ud)

(3)储存数据、读取csv文件、检测缺失值

1 #设置数据存储
2 aa={"公司名称":companies,"最新股票价格":prices,"涨跌幅":uds,"净额":moneys,"净占比":shares_1}
3 
4 #创建二维数据表,aa数据存入
5 df=pd.DataFrame(aa)
6 
7 #检查是否有缺失值
8 df.isnull()

1 #数据保存为gupiao.csv文件,取消索引,编码为utf-8
2 df.to_csv("gupiao.csv",index=False,encoding=\'utf-8\')
3 
4 #读取gupiao.csv文件,构建数据框province_df
5 province_df= pd.read_csv(r"个股资金流数据.csv", sep=",",encoding=\'utf-8\')

2、当日股价前十公司对比(条形图):

 1 from pyecharts.charts import Bar
 2 import numpy as np
 3 import matplotlib.pyplot as plt
 4 
 5 # 解决中文问题
 6 plt.rcParams[\'font.sans-serif\'] = [\'SimHei\']
 7 
 8 #对原始数据集按照股票价格降序排列
 9 province_sorted = province_df.sort_values(by = \'最新股票价格\', ascending = False)
10 
11 #把公司名称数据存入列表a
12 a=province_sorted[\'公司名称\']
13 
14 #把最新股票价格数据存入列表b
15 b=province_sorted[\'最新股票价格\']
16 
17 #绘制区域大小
18 plt.figure(figsize=(12,6))
19 
20 #取a列表前10条数据
21 x=a[:10]
22 
23 #取b列表前10条数据
24 y=b[:10]
25 
26 #设置标题内容
27 plt.title(\'当日前十股票最高价公司对比图\',fontsize=14,color=\'red\')
28 
29 #设置x坐标标签,字体大小
30 plt.xlabel(\'公司名称\',fontsize=15)
31 
32 #设置x坐标标签,字体大小
33 plt.ylabel(\'股票价/元\',fontsize=15)
34 
35 #显示图形
36 plt.bar(x, y)
37 
38 #循环为图形添加数据注释
39 for x,y in zip(x,y):
40     plt.text(x, y, \'%.2f\' % y, ha=\'center\', va= \'bottom\',fontsize=15,color=\'b\')

运行后的条形图如下:

3、各企业股票涨跌幅比较(折线图):

 1 #把涨跌幅数据存入列表c
 2 c=province_sorted[\'涨跌幅\']
 3 
 4 ##绘制区域大小
 5 fig=plt.figure(dpi=100,figsize=(10,6))
 6 
 7 #绘制一行两列的子图,第一张图
 8 ax1 = plt.subplot(1,2,1)
 9 
10 #获取前15条公司数据
11 x=a[:15]
12 
13 #获取前15条涨跌幅数据
14 y=c[:15]
15 
16 #为图形添加标题,字体大小,颜色
17 plt.title(\'今日股票价1~15名公司涨跌幅比较图\',fontsize=10,color=\'r\')
18 
19 #设置x坐标标签
20 plt.xlabel(\'公司名称\')
21 
22 #设置y坐标标签
23 plt.ylabel(\'涨跌幅\%\')
24 
25 #设置x轴数据字体大小
26 plt.xticks(fontsize=8)
27 
28 #设置y轴数据字体大小
29 plt.yticks(fontsize=8)
30 
31 #设置x轴数据斜显示
32 fig.autofmt_xdate()
33 
34 #绘制图形,洋红色,点形状标记v,线形状--
35 plt.plot(x,y, color=\'m\', marker=\'v\',linestyle = "--")
36 
37 #添加网格背景,透明度为0.5,样式为--
38 plt.grid(alpha=0.5,linestyle=\'--\')
39 
40 #绘制一行两列的子图,第二张图
41 ax2 = plt.subplot(1,2,2)
42 
43 #获取15-30条公司数据
44 x1=a[15:30]
45 
46 #获取15-30条涨跌幅数据
47 y1=c[15:30]
48 
49 #为图形添加标题,字体大小,颜色
50 plt.title(\'今日股票价15~30名公司涨跌幅比较图\',fontsize=10,color=\'r\')
51 
52 #设置x坐标标签
53 plt.xlabel(\'公司名称\')
54 
55 #设置y坐标标签
56 plt.ylabel(\'涨跌率\%\')
57 
58 #设置x轴数据字体大小
59 plt.xticks(fontsize=8)
60 
61 #设置y轴数据字体大小
62 plt.yticks(fontsize=8)
63 
64 #设置x轴数据斜显示
65 fig.autofmt_xdate()
66 
67 #绘制图形,青色,点形状标记v,线形状:
68 plt.plot(x1,y1, color=\'c\', marker=\'p\',linestyle = ":")
69 
70 #添加网格背景,透明度为0.5,样式为--
71 plt.grid(alpha=0.5,linestyle=\'--\')

运行后的折线图如下:

4、股价前10公司净额比例对比(饼图):

 1 #把净额数据存入列表d
 2 d=province_sorted[\'净额\']/100000000
 3 
 4 #提取前10公司数据
 5 x=a[:10]
 6 
 7 #提取前10净额数据
 8 y=d[:10]
 9 
10 #设置各项距离圆心n个半径
11 explode=[0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04]
12 
13 #为图形添加标题,pad设置位置
14 plt.title(\'当日股价前10公司净额比例对比图\',fontsize=20,pad=130)
15 
16 #绘制饼图,百分率,大小
17 plt.pie(y,explode=explode,labels=x,autopct=\'%1.2f%%\',radius=2,textprops={\'fontsize\':10})
18 
19 #绘制图例,图例位置
20 plt.legend(loc=\'upper left\', bbox_to_anchor=(1.7, 1.5))
21 
22 #显示图形
23 plt.show()

运行后的饼图如下:

 

 

完整代码:

  1 import requests
  2 import json
  3 import matplotlib.pyplot as plt
  4 import pandas as pd
  5 from bs4 import BeautifulSoup 
  6 
  7  #设置浏览器对象
  8 headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"}
  9 
 10 #headers=headers表示伪装浏览器访问
 11 resp=requests.get("http://push2.eastmoney.com/api/qt/clist/get?pn=1&pz=50&po=1&np=1&ut=b2884a393a59ad64002292a3e90d46a5&fltt=2&invt=2&fid0=f4001&fid=f62&fs=m:0+t:6+f:!2,m:0+t:13+f:!2,m:0+t:80+f:!2,m:1+t:2+f:!2,m:1+t:23+f:!2,m:0+t:7+f:!2,m:1+t:3+f:!2&stat=1&fields=f12,f14,f2,f3,f62,f184,f66,f69,f72,f75,f78,f81,f84,f87,f204,f205,f124&rt=53597607&cb=jQuery18303181849503270513_1607928142376&_=1607928235420",headers=headers)#headers=headers表示伪装浏览器访问
 12 
 13 #print(resp.text)   #输出网页内容
 14 #把网页内容存入content变量
 15 content=resp.text
 16 
 17 #去掉前后不是大括号内的代码
 18 rest=content.replace(\'jQuery18303181849503270513_1607928142376(\',\'\').replace(\');\',\'\')  #去掉前后不是大括号内的代码
 19 
 20 #rest
 21 #将代码通过json库载入,成为键值对的形式
 22 resp_dict=json.loads(rest)
 23 
 24 #提取data里diff列表内容
 25 datas=resp_dict.get(\'data\').get(\'diff\')
 26 
 27 #输出网页内容
 28 print(datas)
 29 
 30 #构建数据集
 31 companies=[]
 32 prices=[]
 33 shares_1=[]
 34 uds=[]
 35 moneys=[]
 36 
 37 #遍历datas内容
 38 for data in datas:
 39     
 40     #公司名
 41     company=data.get(\'f14\')
 42     
 43     #今日主力净流入 净占比
 44     share_1=data.get(\'f184\')
 45     
 46     #净额
 47     money=data.get(\'f62\')
 48     
 49     #当日涨跌幅
 50     ud=data.get(\'f3\')
 51     
 52     #当天股价
 53     price=data.get(\'f2\')
 54     
 55     #把公司数据追加到companies
 56     companies.append(company)
 57     
 58     #把股价数据追加到prices
 59     prices.append(price)
 60     
 61     #把净额数据追加到moneys
 62     moneys.append(money)
 63     
 64     #把净占比追加到shares_1
 65     shares_1.append(share_1)
 66     
 67     #把涨跌幅数据追加到uds
 68     uds.append(ud)
 69 
 70 #设置数据存储
 71 aa={"公司名称":companies,"最新股票价格":prices,"涨跌幅":uds,"净额":moneys,"净占比":shares_1}
 72 
 73 #创建二维数据表,aa数据存入
 74 df=pd.DataFrame(aa)
 75 
 76 #检查是否有缺失值
 77 df.isnull()
 78 
 79 #数据保存为gupiao.csv文件,取消索引,编码为utf-8
 80 df.to_csv("gupiao.csv",index=False,encoding=\'utf-8\')
 81 
 82 #读取gupiao.csv文件,构建数据框province_df
 83 province_df= pd.read_csv(r"个股资金流数据.csv", sep=",",encoding=\'utf-8\')
 84 
 85 from pyecharts.charts import Bar
 86 import numpy as np
 87 import matplotlib.pyplot as plt
 88 
 89 # 解决中文问题
 90 plt.rcParams[\'font.sans-serif\'] = [\'SimHei\']
 91 
 92 #对原始数据集按照股票价格降序排列
 93 province_sorted = province_df.sort_values(by = \'最新股票价格\', ascending = False)
 94 
 95 #把公司名称数据存入列表a
 96 a=province_sorted[\'公司名称\']
 97 
 98 #把最新股票价格数据存入列表b
 99 b=province_sorted[\'最新股票价格\']
100 
101 #绘制区域大小
102 plt.figure(figsize=(12,6))
103 
104 #取a列表前10条数据
105 x=a[:10]
106 
107 #取b列表前10条数据
108 y=b[:10]
109 
110 #设置标题内容
111 plt.title(\'当日前十股票最高价公司对比图\',fontsize=14,color=\'red\')
112 
113 #设置x坐标标签,字体大小
114 plt.xlabel(\'公司名称\',fontsize=15)
115 
116 #设置x坐标标签,字体大小
117 plt.ylabel(\'股票价/元\',fontsize=15)
118 
119 #显示图形
120 plt.bar(x, y)
121 
122 #循环为图形添加数据注释
123 for x,y in zip(x,y):
124     plt.text(x, y, \'%.2f\' % y, ha=\'center\', va= \'bottom\',fontsize=15,color=\'b\')
125 
126 #把涨跌幅数据存入列表c
127 c=province_sorted[\'涨跌幅\']
128 
129 ##绘制区域大小
130 fig=plt.figure(dpi=100,figsize=(10,6))
131 
132 #绘制一行两列的子图,第一张图
133 ax1 = plt.subplot(1,2,1)
134 
135 #获取前15条公司数据
136 x=a[:15]
137 
138 #获取前15条涨跌幅数据
139 y=c[:15]
140 
141 #为图形添加标题,字体大小,颜色
142 plt.title(\'今日股票价1~15名公司涨跌幅比较图\',fontsize=10,color=\'r\')
143 
144 #设置x坐标标签
145 plt.xlabel(\'公司名称\')
146 
147 #设置y坐标标签
148 plt.ylabel(\'涨跌幅\%\')
149 
150 #设置x轴数据字体大小
151 plt.xticks(fontsize=8)
152 
153 #设置y轴数据字体大小
154 plt.yticks(fontsize=8)
155 
156 #设置x轴数据斜显示
157 fig.autofmt_xdate()
158 
159 #绘制图形,洋红色,点形状标记v,线形状--
160 plt.plot(x,y, color=\'m\', marker=\'v\',linestyle = "--")
161 
162 #添加网格背景,透明度为0.5,样式为--
163 plt.grid(alpha=0.5,linestyle=\'--\')
164 
165 #绘制一行两列的子图,第二张图
166 ax2 = plt.subplot(1,2,2)
167 
168 #获取15-30条公司数据
169 x1=a[15:30]
170 
171 #获取15-30条涨跌幅数据
172 y1=c[15:30]
173 
174 #为图形添加标题,字体大小,颜色
175 plt.title(\'今日股票价15~30名公司涨跌幅比较图\',fontsize=10,color=\'r\')
176 
177 #设置x坐标标签
178 plt.xlabel(\'公司名称\')
179 
180 #设置y坐标标签
181 plt.ylabel(\'涨跌率\%\')
182 
183 #设置x轴数据字体大小
184 plt.xticks(fontsize=8)
185 
186 #设置y轴数据字体大小
187 plt.yticks(fontsize=8)
188 
189 #设置x轴数据斜显示
190 fig.autofmt_xdate()
191 
192 #绘制图形,青色,点形状标记v,线形状:
193 plt.plot(x1,y1, color=\'c\', marker=\'p\',linestyle = ":")
194 
195 #添加网格背景,透明度为0.5,样式为--
196 plt.grid(alpha=0.5,linestyle=\'--\')
197 
198 #把净额数据存入列表d
199 d=province_sorted[\'净额\']/100000000
200 
201 #提取前10公司数据
202 x=a[:10]
203 
204 #提取前10净额数据
205 y=d[:10]
206 
207 #设置各项距离圆心n个半径
208 explode=[0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04]
209 
210 #为图形添加标题,pad设置位置
211 plt.title(\'当日股价前10公司净额比例对比图\',fontsize=20,pad=130)
212 
213 #绘制饼图,百分率,大小
214 plt.pie(y,explode=explode,labels=x,autopct=\'%1.2f%%\',radius=2,textprops={\'fontsize\':10})
215 
216 #绘制图例,图例位置
217 plt.legend(loc=\'upper left\', bbox_to_anchor=(1.7, 1.5))
218 
219 #显示图形
220 plt.show()

五、案例自评:

  股票是当代社会最重要的投资方式之一,深受人们的欢迎。作为一名软件工程专业的学生,在学习完Python数据处理编程后,借助Python工具,处理股市中对股民具有参考价值的数据,是我本次的目标。通过各类可视化图形的绘制,帮助股民

分析股市行情,及时加仓或者卖出。

(1)创新性

  市面上的相关炒股软件,大部分并不能直观的为股民带来有用的数据消息,且有的软件并没有及时更新数据。Python有着”流程可控、工作高效、丰富的库”的特点,使用Python分析股市数据,可以大大提高数据处理的效率,实时更新股市情况,快速

的获取炒股所需要的数据信息,分析股票行情。

  与使用传统的作图软件相比,使用Python中绘制的各类数据图形更加简便美观,效率也更加快。

(2)实用性

  通过Python进行数据处理,大大提高了获取数据的效率。将网络爬虫和数据可视化结合起来,把获取到的数据进行可视化,能够使我们快速、高效的得到有帮助的信息。使用Python进行股市数据分析,可以极大程度上帮助股民规避一定的风险,也可

以帮助刚接触炒股的股民快速上手。该思路可以应用到许多其他的领域的实时数据展示,比如:天气情况、房子信息、用户网上消费情况等。