Python股票資金流向數據可視化分析


一、摘要:

  本選題應用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進行股市數據分析,可以極大程度上幫助股民規避一定的風險,也可

以幫助剛接觸炒股的股民快速上手。該思路可以應用到許多其他的領域的實時數據展示,比如:天氣情況、房子信息、用戶網上消費情況等。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM