如何用baostock庫查詢某隻股票的財務狀況能力?

Gandedong 發表於 2021-08-08

接我上一篇文章,我是一名審計師,不是程式設計師,如果我想獲得某類股票的基本資訊,但又不記得這些股票的程式碼,那麼如何進行模糊查詢呢?
這裡要用到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()

當這個程式執行的時候,會彈出:

如何用baostock庫查詢某隻股票的財務狀況能力?

這個時候輸入要查詢的股票程式碼,如我想查詢茅臺,輸入sh.600519
如何用baostock庫查詢某隻股票的財務狀況能力?
結果如下:

如我想查詢五糧液,輸入:sz.000858

結果如下:

如何用baostock庫查詢某隻股票的財務狀況能力?

又或者,查詢兩者後將結果保在EXCEL檔案中。

程式碼說明:

baostock庫只提供了資料,如果將這些資料轉化成財務需要的格式是pandas庫的事,從基本上說,涉及統計和資料分析的庫中,Pandas是必須要掌握的資料結構,它能提供快速、靈活的資料整理方法,又可以結合其他不同功能的庫進行使用,應用生態豐富,所以很多搞大資料分析的人都會用到Pandas這個工具,就像修車的一定會用扳手一樣。而作為財務人員,我的建議是掌握幾個基本的套路,因為一般的財務工作大多帶有重複性,只要重複的套路用多了,遲早會熟能生巧。

本作品採用《CC 協議》,轉載必須註明作者和本文連結