接我上一篇文章,我是一名審計師,不是程式設計師,如果我想獲得某類股票的基本資訊,但又不記得這些股票的程式碼,那麼如何進行模糊查詢呢?
這裡要用到Baostock庫:
程式碼如下:
##獲取某類股票的資訊
import pandas as pd
import baostock as bs
# 登陸系統
lg = bs.login()
# 顯示登陸返回資訊
print('login respond error_code:' + lg.error_code)
print('login respond error_msg:' + lg.error_msg)
rs = bs.query_stock_basic(code_name="銀行") # 支援模糊查詢
data_list = []
while (rs.error_code == '0') & rs.next():
# 獲取一條記錄,將記錄合併在一起
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
bs.logout()
print(result)
執行結果如下:
login success!
login respond error_code:0
login respond error_msg:success
logout success!
code code_name ipoDate outDate type status
0 sh.000134 上證銀行股指數 2012-05-29 2 1
1 sh.000849 滬深300非銀行金融指數 2012-12-21 2 1
2 sh.000951 滬深300銀行指數 2009-10-28 2 1
3 sh.600000 浦發銀行 1999-11-10 1 1
4 sh.600015 華夏銀行 2003-09-12 1 1
5 sh.600016 民生銀行 2000-12-19 1 1
6 sh.600036 招商銀行 2002-04-09 1 1
7 sh.600908 無錫銀行 2016-09-23 1 1
8 sh.600919 江蘇銀行 2016-08-02 1 1
9 sh.600926 杭州銀行 2016-10-27 1 1
10 sh.600928 西安銀行 2019-03-01 1 1
11 sh.601009 南京銀行 2007-07-19 1 1
12 sh.601128 常熟銀行 2016-09-30 1 1
13 sh.601166 興業銀行 2007-02-05 1 1
14 sh.601169 北京銀行 2007-09-19 1 1
15 sh.601187 廈門銀行 2020-10-27 1 1
16 sh.601229 上海銀行 2016-11-16 1 1
17 sh.601288 農業銀行 2010-07-15 1 1
18 sh.601328 交通銀行 2007-05-15 1 1
19 sh.601398 工商銀行 2006-10-27 1 1
20 sh.601528 瑞豐銀行 2021-06-25 1 1
21 sh.601577 長沙銀行 2018-09-26 1 1
22 sh.601658 郵儲銀行 2019-12-10 1 1
23 sh.601665 齊魯銀行 2021-06-18 1 1
24 sh.601818 光大銀行 2010-08-18 1 1
25 sh.601838 成都銀行 2018-01-31 1 1
26 sh.601860 紫金銀行 2019-01-03 1 1
27 sh.601916 浙商銀行 2019-11-26 1 1
28 sh.601939 建設銀行 2007-09-25 1 1
29 sh.601963 重慶銀行 2021-02-05 1 1
30 sh.601988 中國銀行 2006-07-05 1 1
31 sh.601997 貴陽銀行 2016-08-16 1 1
32 sh.601998 中信銀行 2007-04-27 1 1
33 sh.603323 蘇農銀行 2016-11-29 1 1
34 sz.000001 平安銀行 1991-04-03 1 1
35 sz.002142 寧波銀行 2007-07-19 1 1
36 sz.002807 江陰銀行 2016-09-02 1 1
37 sz.002936 鄭州銀行 2018-09-19 1 1
38 sz.002948 青島銀行 2019-01-16 1 1
39 sz.002966 蘇州銀行 2019-08-02 1 1
如果我不想查“銀行”,而是想查“茅臺”呢?一樣可以的,只要將rs = bs.query_stock_basic(code_name=”銀行”)改成(code_name=”茅臺”)就可以了。
執行結果如下:
login success!
login respond error_code:0
login respond error_msg:success
logout success!
code code_name ipoDate outDate type status
0 sh.600519 貴州茅臺 2001-08-27 1 1
這樣的操作比較簡單,但如果我要做一個貴州茅臺的財務分析,再一個一個指標去查的話,將會比較麻煩。一般來說,我會將需要查詢的指標放到一個py程式中,固定格式,有需要的時候直接查詢,為了方便初學者理解,程式碼不用for in 迴圈結構,詳細如下:
##**查詢某隻股票的財務狀況能力*
import baostock as bs
import pandas as pd
# 登陸系統
lg = bs.login()
# 顯示登陸返回資訊
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
stocknum = input("請輸入股票程式碼,例如茅臺為:sh.600519,平安銀行為sz.000001等:")
# 查詢季頻估值指標盈利能力
profit_list = []
rs1= bs.query_profit_data(code=stocknum, year=2020, quarter=1)##獲取2020年第一季盈利能力
rs2= bs.query_profit_data(code=stocknum, year=2020, quarter=2)##獲取2020年第二季盈利能力
rs3= bs.query_profit_data(code=stocknum, year=2020, quarter=3)##獲取2020年第三季盈利能力
rs4= bs.query_profit_data(code=stocknum, year=2020, quarter=4)
rs5= bs.query_profit_data(code=stocknum, year=2021, quarter=1)
while (rs1.error_code == '0') & rs1.next():
profit_list.append(rs1.get_row_data())
profit_list.append(rs2.get_row_data())
profit_list.append(rs3.get_row_data())
profit_list.append(rs4.get_row_data())
profit_list.append(rs5.get_row_data())
resp = pd.DataFrame(profit_list,columns=rs1.fields)##匯入Pandas
resp.rename(columns={'code':'證券號'},inplace=True) #將表頭的名稱改成統一的名稱
resp.rename(columns={'pubDate':'財報日期'},inplace=True) #將表頭的名稱改成統一的名稱
resp.rename(columns={'statDate':'財報統計截止日'},inplace=True) #將表頭的名稱改成統一的名稱
resp.rename(columns={'roeAvg':'淨資產收益率(平均)'},inplace=True) #將表頭的名稱改成統一的名稱
resp.rename(columns={'npMargin':'銷售淨利率'},inplace=True) #將表頭的名稱改成統一的名稱
resp.rename(columns={'gpMargin':'銷售毛利率'},inplace=True) #將表頭的名稱改成統一的名稱
resp.rename(columns={'netProfit':'淨利潤(元)'},inplace=True) #將表頭的名稱改成統一的名稱
resp.rename(columns={'MBRevenue':'主營營業收入(元)'},inplace=True) #將表頭的名稱改成統一的名稱
resp.rename(columns={'totalShare':'總股本'},inplace=True) #將表頭的名稱改成統一的名稱
resp.rename(columns={'liqaShare':'流通股本'},inplace=True) #將表頭的名稱改成統一的名稱
resp.rename(columns={'epsTTM':'每股收益'},inplace=True) #將表頭的名稱改成統一的名稱
#獲取公司業績快報 #
result_list = []
rs6 = bs.query_dupont_data(code=stocknum, year=2020, quarter=1)
rs7 = bs.query_dupont_data(code=stocknum, year=2020, quarter=2)
rs8 = bs.query_dupont_data(code=stocknum, year=2020, quarter=3)
rs9 = bs.query_dupont_data(code=stocknum, year=2020, quarter=4)
rs10 = bs.query_dupont_data(code=stocknum, year=2021, quarter=1)
while (rs6.error_code == '0') & rs6.next():
result_list.append(rs6.get_row_data())
result_list.append(rs7.get_row_data())
result_list.append(rs8.get_row_data())
result_list.append(rs9.get_row_data())
result_list.append(rs10.get_row_data())
# 獲取一條記錄,將記錄合併在一起
resp2 = pd.DataFrame(result_list, columns=rs6.fields)
resp2.rename(columns={'code':'證券號'},inplace=True) #將表頭的名稱改成統一的名稱
resp2.rename(columns={'pubDate':'財報日期'},inplace=True) #將表頭的名稱改成統一的名稱
resp2.rename(columns={'statDate':'財報統計截止日'},inplace=True) #將表頭的名稱改成統一的名稱
resp2.rename(columns={'dupontROE':'淨資產收益率'},inplace=True) #將表頭的名稱改成統一的名稱
resp2.rename(columns={'dupontAssetStoEquity':'權益乘數'},inplace=True) #將表頭的名稱改成統一的名稱
resp2.rename(columns={'dupontAssetTurn':'總資產週轉率'},inplace=True) #將表頭的名稱改成統一的名稱
resp2.rename(columns={'dupontPnitoni':'歸屬母公司股東的淨利潤'},inplace=True) #將表頭的名稱改成統一的名稱
resp2.rename(columns={'dupontNitogr':'淨利潤率'},inplace=True) #將表頭的名稱改成統一的名稱
resp2.rename(columns={'dupontTaxBurden':'稅負水平(淨利潤/利潤總額)'},inplace=True) #將表頭的名稱改成統一的名稱
resp2.rename(columns={'dupontIntburden':'利息負擔(利潤總額/息稅前利潤)'},inplace=True) #將表頭的名稱改成統一的名稱
resp2.rename(columns={'dupontEbittogr':'經營利潤率'},inplace=True) #將表頭的名稱改成統一的名稱
respall=pd.merge(resp,resp2)
# 列印輸出
print(respall)
# 結果集輸出到csv檔案
#result_profit.to_csv("D:\\profit_data.csv", encoding="gbk", index=False)
# 登出系統
bs.logout()
當這個程式執行的時候,會彈出:
這個時候輸入要查詢的股票程式碼,如我想查詢茅臺,輸入sh.600519
結果如下:
如我想查詢五糧液,輸入:sz.000858
結果如下:
又或者,查詢兩者後將結果保在EXCEL檔案中。
程式碼說明:
baostock庫只提供了資料,如果將這些資料轉化成財務需要的格式是pandas庫的事,從基本上說,涉及統計和資料分析的庫中,Pandas是必須要掌握的資料結構,它能提供快速、靈活的資料整理方法,又可以結合其他不同功能的庫進行使用,應用生態豐富,所以很多搞大資料分析的人都會用到Pandas這個工具,就像修車的一定會用扳手一樣。而作為財務人員,我的建議是掌握幾個基本的套路,因為一般的財務工作大多帶有重複性,只要重複的套路用多了,遲早會熟能生巧。
本作品採用《CC 協議》,轉載必須註明作者和本文連結