利用Python实现财务分析/经营分析自动化
之前寫公司研究報告時,所有的數據都是通過翻看招股說明書/年報的PDF獲取的,把數字從PDF里復制粘貼到EXCEL里再生成圖表的過程非常繁瑣,而且容易因為看錯行/列摘錯數據。使用Python可以實現提取財務數據、計算財務指標、可視化呈現等一系列操作的自動化,加之可以通過爬蟲從巨潮資訊、雪球等網站批量獲取公司財務報表,在沒有專用數據庫可用的情況下,Python能為財務大數據分析、大范圍的公司研究、行業(yè)研究提供極大便利。
一、獲取報表
巨潮資訊上的數據最權威,但是各個年度數據是分開存放的,而雪球提供財務數據是各年度都在同一個CSV里。由于經營分析涉及趨勢研究,需要連續(xù)多年的數據,在數據按年度分為多個文件的情況下還得多進行一次遍歷,不是很方便,故這里選擇從雪球批量獲取財務報表。
定義利潤表、資產負債表、現金流量表的下載函數:
def download_lrb(url):r = requests.get(url, headers=headers)filename = url.split('=')[-1] + '_lrb.csv'print(filename)with open(filename, 'wb') as f:f.write(r.content)def download_fzb(url):r = requests.get(url, headers=headers)filename = url.split('=')[-1] + '_fzb.csv'print(filename)with open(filename, 'wb') as f:f.write(r.content)def download_llb(url):r = requests.get(url, headers=headers)filename = url.split('=')[-1] + '_llb.csv'print(filename)with open(filename, 'wb') as f:f.write(r.content)股票代碼.txt存放需要分析的公司的股票代碼,格式為SHXXXXXX或SZXXXXXX
with open('股票代碼.txt', 'r', encoding='utf-8') as f:symbol = [s.strip() for s in f.readlines()]lrb_urls = [lrb_base_url + i for i in symbol] fzb_urls = [fzb_base_url + i for i in symbol] llb_urls = [llb_base_url + i for i in symbol]pool = ThreadPool(10) pool.map(download_lrb, lrb_urls) pool.close() pool.join() pool = ThreadPool(10) pool.map(download_fzb, fzb_urls) pool.close() pool.join() pool = ThreadPool(10) pool.map(download_llb, llb_urls) pool.close() pool.join()美的集團SZ000333
格力電器SZ000651
下載結果:
二、以格力電器為例的經營分析
經營分析主要包括兩個方面:公司的業(yè)績和公司的經營水平。相關數據可從利潤表和資產負債表獲取。
輸入要分析的公司的股票代碼
# 股票代碼 stock_0 = 'SZ000651' #格力電器 # 輸入年份(輸入年報數據截止年份的下一年) year = 2018定義函數:讀取csv文件,轉化為DataFrame格式
def get_lrb(stock_id):# 讀取利潤表數據lrb = pd.read_csv(r'data/%s_lrb.csv' % (stock_id),encoding='utf-8',header=0,index_col=None)list_lrb = [] #獲取所有截止日期的列表for i in lrb['報表期截止日']:list_lrb.append(str(i))list_lrb_0 = [] #將20171231的格式轉換為2017-12-31for i in list_lrb:i_ = i[:4] + '-' + i[4:6] + '-' + i[6:8]list_lrb_0.append(i_)lrb['報告時間'] = [pd.to_datetime(t) for t in list_lrb_0] #轉為日期數據類型lrb.index = lrb['報告時間'] #重新設置利潤表索引data_lrb = lrb[::-1] #由于csv中為時間倒序,將表倒序排列使之呈時間正序return data_lrbdef get_fzb(stock_id):# 讀取資產負債表表數據fzb = pd.read_csv(r'data/%s_fzb.csv' % (stock_id),encoding='utf-8',header=0,index_col=None)list_fzb = [] for i in fzb['報表日期']:list_fzb.append(str(i))list_fzb_0 = [] for i in list_fzb:i_ = i[:4] + '-' + i[4:6] + '-' + i[6:8]list_fzb_0.append(i_)fzb['報告時間'] = [pd.to_datetime(t) for t in list_fzb_0]fzb.index = fzb['報告時間'] data_fzb = fzb[::-1]return data_fzb定義函數:篩選出年報數據,根據月份篩選,12月的即為年報數據
def get_data_month(data, month):data_month = data[data.index.month == month]return data_month定義函數:實現數據可視化
def data_plot(data, y, legend='格力電器', kind='bar'):l_0 = len(data)s_0 = list(range(l_0))x_0 = np.array(s_0)y_0 = tuple([str(i) for i in range(year - l_0, year)])data[y].plot(kind=kind)plt.title(y)plt.legend([legend], loc='upper left')plt.xticks(x_0, y_0)plt.grid(color='#95a5a6', linestyle='--', linewidth=1, axis='y',alpha=0.4)plt.savefig(r'pic/%s.png' % (y,))return(1)公司業(yè)績分析
公司業(yè)績主要看業(yè)績結果和業(yè)績質量。業(yè)績結果的主要指標為營業(yè)收入、毛利、凈利;業(yè)績質量的主要指標為毛利率、凈利率、成本費用率。數據全部來自利潤表。
定義函數:計算業(yè)績分析需要的指標
實現數據讀取、篩選、計算、可視化
# 讀取數據 data_lrb = get_lrb(stock_0) #數據全部來自利潤表 # 篩選年報數據 data_lrb_year = get_data_month(data_lrb, 12) # 計算所需指標 result_p = get_performance(data_lrb_year) #可視化 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] #顯示中文 for i in ['營業(yè)收入','毛利','凈利','毛利率','凈利率','成本費用率']:data_plot(result_p, i)plt.show()
營業(yè)收入和毛利近年波動較大,但凈利基本保持高速增長。
近年毛利率基本保持穩(wěn)定,凈利率穩(wěn)步高速增長,成本費用率有降低的趨勢,說明經營效率在逐步提高。
(2)公司經營水平分析
經營水平的核心指標有凈利率、資產周轉率、資產負債率、凈資產收益率。數據來自利潤表和資產負債表。
定義函數:計算經營水平分析需要的指標
實現數據讀取、篩選、計算、可視化:
#讀取數據,數據來自利潤表和資產負債表 data_lrb = get_lrb(stock_0) data_fzb = get_fzb(stock_0) #篩選年報數據 data_lrb_year = get_data_month(data_lrb, 12) data_fzb_year = get_data_month(data_fzb, 12) #將利潤表和資產負債表合為一表,方便計算 data=pd.merge(left=data_lrb_year.drop(columns = ['報告時間']),right=data_fzb_year.drop(columns = ['報告時間']),on="報告時間") #計算所需指標 result_m = get_management(data) #可視化 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] for i in ['凈利率','資產周轉率','資產負債率','凈資產收益率']:data_plot(result_m, i)plt.show()
這一類指標通常需要與競爭對手相比較才能判斷優(yōu)劣,后續(xù)深入分析可以將同類公司(如美的、奧克斯…)的股票代碼做成一個列表,使用for循環(huán)批量下載財務報表、將相關指標可視化進行對比分析。
三、風險分析
這里深入分析一下格力的資產負債率,即使不進行同類對比,也可以看出格力的資產負債率非常高,幾乎始終在70%~80%之間,資產負債率普遍較高的房地產企業(yè)平均水平也就70%左右(此處只是舉例,資產負債率不能跨行業(yè)對比)。理論上高資產負債率的企業(yè)風險更大(償債壓力大),那么格力這么高的資產負債率是否真的意味著高風險?
理論上講,高資產負債率帶來的風險即償債風險,公司面臨較大償債壓力,因此需要進一步探究企業(yè)的流動負債結構以判別高風險是否真實存在。
定義函數:分析流動負債結構
實現數據讀取、篩選、計算、可視化:
data_fzb = get_fzb(stock_0) data_fzb_year = get_data_month(data_fzb, 12) result_s = get_structure(data_fzb_year)plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] for i in ['經營性負債占比','貸款占比']:data_plot(result_s, i)plt.show()
可以看出格力的經營性負債一直較高,在1999-2006甚至達到了80%或90%以上,即便近年有所下降依然處于40%的高位,而貸款占比很少,近年有所上升也不到15%,由此可以看出,高資產負債率的格力實際上償債風險并不高。流動負債中會帶來償債壓力的貸款占比很少,經營性負債才是主體,而大量的應付款項和預收款項實際上是供應商、經銷商資金的占用,在產品不愁銷路的情況下一般不會有什么問題,反而是競爭力的體現,這說明格力在整個產業(yè)鏈中非常強勢。
本文只是展示使用Python進行財務分析/公司研究的大概思路和流程,分析本身存在不嚴謹之處。定義好計算相關指標的函數后,只要列出研究對象的股票代碼,使用for循環(huán)便能實現快速披露獲取報表、讀取數據、處理數據、計算指標并最終實現可視化,使分析效率大大提高。
總結
以上是生活随笔為你收集整理的利用Python实现财务分析/经营分析自动化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言中函数指针和指针函数
- 下一篇: DolbyAudio访问杜比音效驱动程序