tushare+matplotlib 簡單財務分析


tushare是python的一個免費財經數據接口包,可以很方便的查詢股票數據和公司財務數據。matplotlib是python數據可視化的有力工具。如果把tushare和matplotlib結合起來,從tushare調取股票和財務數據,用matplotlib實現數據可視化,效果應該不錯。閑話少敘,上圖上代碼。

代碼中還有需要再完善的地方,歡迎批評指正。謝謝!

效果圖

 

代碼:

#-*- coding:utf-8 -*-

#代碼基於python2版本,請用python2執行
#輸入scode時,請加引號,如‘600600’
#輸入year時,請直接輸入,如 2017
import tushare as ts import matplotlib.pyplot as plt import numpy as np def Asset_And_Equity(scode): scode = scode stock_basics = ts.get_stock_basics() stock__basics = stock_basics[stock_basics.index == scode] name = str(stock__basics.name[stock__basics.index == scode]) industry = str(stock__basics.industry[stock__basics.index == scode]) area = str(stock__basics.area[stock__basics.index == scode]) pe = float(stock__basics.pe[stock__basics.index == scode]) pb = float(stock__basics.pb[stock__basics.index == scode]) liquidasset = float(stock__basics.liquidAssets[stock__basics.index == scode]) fixedasset = float(stock__basics.fixedAssets[stock__basics.index == scode]) totalasset = float(stock__basics.totalAssets[stock__basics.index == scode]) outstanding = float(stock__basics.outstanding[stock__basics.index == scode]) totals = float(stock__basics.totals[stock__basics.index == scode]) esp = float(stock__basics.esp[stock__basics.index == scode]) bvps = float(stock__basics.bvps[stock__basics.index == scode]) reservedpershare = float(stock__basics.reservedPerShare[stock__basics.index == scode]) perundp = float(stock__basics.perundp[stock__basics.index == scode]) plt.figure(figsize=(12,6)) #資產狀況餅圖 plt.subplot(131) labels_asset = 'liquid asset','fixed asset' sizes_asset = liquidasset, fixedasset colors_asset = 'yellowgreen', 'gold' plt.axis('equal') plt.pie(sizes_asset, explode=None,labels=labels_asset,colors=colors_asset,autopct='%1.1f%%',shadow=True,startangle=50) plt.title('Asset situation') col_labels = ['liquid(wanyuan)', 'fixed(wanyuan)','outstanding(yigu)', 'totals(yigu)'] row_labels = ['%s'%scode] table_vals = [[liquidasset,fixedasset,outstanding,totals]] my_table = plt.table(cellText=table_vals,colWidths=[0.4]*4,\ rowLabels=row_labels,colLabels=col_labels ) #股本狀況餅圖 plt.subplot(132) labels_share = 'outstanding', 'totals' sizes_share = outstanding, totals colors_share = 'yellowgreen', 'gold' plt.axis('equal') plt.pie(sizes_share, explode=None, labels=labels_share,colors=colors_share,autopct='%1.1f%%',shadow=True,startangle=50) plt.title('Equity situation') #每股凈資,每股未分配利潤 plt.subplot(133) ind = np.arange(2) numlist = [bvps,perundp] plt.bar(ind, numlist) plt.xlabel('DATA PS') plt.ylabel('YUAN') plt.title('NA&UNDNI PS') plt.xticks(ind, ('NAPS', 'UNDNIPS')) for a, b in zip(ind, numlist): plt.text(a, b+0.05, '%.2f'%b, ha='center', va='bottom', fontsize=7) plt.show() def get_profit_data(year1, year2, year3, year4, year5, scode): timelist = [] timelist.append(year1) timelist.append(year2) timelist.append(year3) timelist.append(year4) timelist.append(year5) roe = [] net_profit_ratio = [] gross_profit_rate = [] net_profits = [] eps = [] business_income = [] bips = [] for i in timelist: profit_data = ts.get_profit_data(i,4) profit_data.index = profit_data.code data = profit_data[profit_data.index == scode] roe.append(float(data.roe)) net_profit_ratio.append(float(data.net_profit_ratio)) gross_profit_rate.append(float(data.gross_profit_rate)) net_profits.append(float(data.net_profits)) eps.append(float(data.eps)) business_income.append(float(data.business_income)) bips.append(float(data.bips)) plt.figure(figsize=(12,6)) #營業收入柱狀圖 plt.subplot(231) ind = np.arange(5) plt.bar(ind, business_income, color='yellowgreen') plt.title('Business Income(BaiWan Yuan)') plt.xticks(ind, (year1, year2, year3, year4, year5)) for a, b in zip(ind, business_income): plt.text(a, b+0.05, '%.2f'%b, ha='center', va='bottom', fontsize=7) #凈利潤柱狀圖 plt.subplot(232) plt.bar(ind, net_profits, color='gold') plt.title('Net_profits(Wan Yuan)') plt.xticks(ind, (year1, year2, year3, year4, year5)) for a, b in zip(ind, net_profits): plt.text(a, b+0.05, '%.2f'%b, ha='center', va='bottom', fontsize=7) #每股收益柱狀圖 plt.subplot(233) plt.bar(ind, eps, color='#FFA500') plt.title('EPS') plt.xticks(ind, (year1, year2, year3, year4, year5)) for a, b in zip(ind, eps): plt.text(a, b+0.05, '%.2f'%b, ha='center', va='bottom', fontsize=7) #roe折線圖 plt.subplot(234) plt.title('ROE(%)') plt.plot(roe, 'r', label='ROE') plt.xticks(ind, (year1, year2, year3, year4, year5)) #凈利潤率折線圖 plt.subplot(235) plt.title('Net_Profit_Ratio(%)') plt.plot(net_profit_ratio, 'b', label='Net_Profit_Ratio') plt.xticks(ind, (year1, year2, year3, year4, year5)) #毛利率折線圖 plt.subplot(236) plt.title('Gross_Profit_Rate(%)') plt.plot(gross_profit_rate, 'g', label='Gross_Profit_Ratio') plt.xticks(ind, (year1, year2, year3, year4, year5)) plt.show() def get_operation_data(year1, year2, year3, year4, year5, scode): timelist = [] timelist.append(year1) timelist.append(year2) timelist.append(year3) timelist.append(year4) timelist.append(year5) arturnover = [] arturndays = [] inventory_turnover = [] inventory_days = [] currentasset_turnover = [] currentasset_days = [] for i in timelist: operation_data = ts.get_operation_data(i,4) operation_data.index = operation_data.code data = operation_data[operation_data.index == scode] arturnover.append(float(data.arturnover)) arturndays.append(float(data.arturndays)) inventory_turnover.append(float(data.inventory_turnover)) inventory_days.append(float(data.inventory_days)) currentasset_turnover.append(float(data.currentasset_turnover)) currentasset_days.append(float(data.currentasset_days)) plt.figure(figsize=(12,6)) ind = np.arange(5) #應收賬款折線圖 plt.subplot(231) plt.title('AR Turnover(ci)') plt.plot(arturnover, 'r', label='AR Turnover') plt.xticks(ind, (year1, year2, year3, year4, year5)) #存貨折線圖 plt.subplot(232) plt.title('Inventory Turnover(ci)') plt.plot(inventory_turnover, 'b', label='Inventory Turnover') plt.xticks(ind, (year1, year2, year3, year4, year5)) #流動資產折線圖 plt.subplot(233) plt.title('CA Turnover(ci)') plt.plot(currentasset_turnover, 'g', label='CA Turnover') plt.xticks(ind, (year1, year2, year3, year4, year5)) #應收賬款柱狀圖 plt.subplot(234) plt.bar(ind, arturndays, color='yellowgreen') plt.title('AR Turnover Days') plt.xticks(ind, (year1, year2, year3, year4, year5)) for a, b in zip(ind, arturndays): plt.text(a, b+0.05, '%.2f'%b, ha='center', va='bottom', fontsize=7) #存貨柱狀圖 plt.subplot(235) plt.bar(ind, inventory_days, color='gold') plt.title('Inventory Turnover Days') plt.xticks(ind, (year1, year2, year3, year4, year5)) for a, b in zip(ind, inventory_days): plt.text(a, b+0.05, '%.2f'%b, ha='center', va='bottom', fontsize=7) #流動資產柱狀圖 plt.subplot(236) plt.bar(ind, currentasset_days, color='#FFA500') plt.title('CA Turnover Days') plt.xticks(ind, (year1, year2, year3, year4, year5)) for a, b in zip(ind, currentasset_days): plt.text(a, b+0.05, '%.2f'%b, ha='center', va='bottom', fontsize=7) plt.show() def get_growth_data(year1, year2, year3, year4, year5, scode): timelist = [] timelist.append(year1) timelist.append(year2) timelist.append(year3) timelist.append(year4) timelist.append(year5) mbrg = [] nprg = [] nav = [] targ = [] eps = [] epsg = [] seg = [] for i in timelist: growth_data = ts.get_growth_data(i,4) growth_data.index = growth_data.code data = growth_data[growth_data.index == scode] mbrg.append(float(data.mbrg)) nprg.append(float(data.nprg)) nav.append(float(data.nav)) targ.append(float(data.targ)) epsg.append(float(data.epsg)) seg.append(float(data.seg)) plt.figure(figsize=(12,6)) ind = np.arange(5) #收入增長率 plt.subplot(231) plt.title('Income Growth(%)') plt.plot(mbrg, 'r', label='Income Growth') plt.xticks(ind, (year1, year2, year3, year4, year5)) #凈利潤增長率 plt.subplot(232) plt.title('NI Growth(%)') plt.plot(nprg, 'b', label='NI Growth') plt.xticks(ind, (year1, year2, year3, year4, year5)) #凈資產增長率 plt.subplot(233) plt.title('NA Growth(%)') plt.plot(nav, 'g', label='NA Growth') plt.xticks(ind, (year1, year2, year3, year4, year5)) #總資產增長率 plt.subplot(234) plt.title('TA Growth(%)') plt.plot(targ, 'r', label='TA Growth') plt.xticks(ind, (year1, year2, year3, year4, year5)) #EPS增長率 plt.subplot(235) plt.title('EPS Growth(%)') plt.plot(epsg, 'b', label='EPS Growth') plt.xticks(ind, (year1, year2, year3, year4, year5)) #股東權益增長率 plt.subplot(236) plt.title('Equity Growth(%)') plt.plot(seg, 'g', label='seg') plt.xticks(ind, (year1, year2, year3, year4, year5)) plt.show() def get_debtpaying_data(year1, year2, year3, year4, year5, scode): timelist = [] timelist.append(year1) timelist.append(year2) timelist.append(year3) timelist.append(year4) timelist.append(year5) currentratio = [] #流動比率 quickratio = [] #速動比率 cashratio = [] #現金比率 icratio =[] #利息支付倍數 sheqratio = [] #股東權益比率 adratio = [] #股東權益增長率 for i in timelist: debtpaying_data = ts.get_debtpaying_data(i,4) debtpaying_data.index = debtpaying_data.code data = debtpaying_data[debtpaying_data.index == scode] currentratio.append(float(data.currentratio)) quickratio.append(float(data.quickratio)) cashratio.append(float(data.cashratio)) icratio.append(float(data.icratio)) sheqratio.append(float(data.sheqratio)) adratio.append(float(data.adratio)) plt.figure(figsize=(12,6)) ind = np.arange(5) plt.subplot(231) plt.title('CurrentRatio') plt.plot(currentratio, 'r', label='CurrentRatio') plt.xticks(ind, (year1, year2, year3, year4, year5)) plt.subplot(232) plt.title('QuickRatio') plt.plot(quickratio, 'g', label='QuickRatio') plt.xticks(ind, (year1, year2, year3, year4, year5)) plt.subplot(233) plt.title('CashRatio') plt.plot(cashratio, 'b', label='CashRatio') plt.xticks(ind, (year1, year2, year3, year4, year5)) plt.subplot(234) plt.title('Interest Coverage Ratio') plt.plot(icratio, 'r', label='Interest Coverage Ratio') plt.xticks(ind, (year1, year2, year3, year4, year5)) plt.subplot(235) plt.title('EquityRatio') plt.plot(sheqratio, 'g', label='EquityRatio') plt.xticks(ind, (year1, year2, year3, year4, year5)) plt.subplot(236) plt.title('Equity Growth(%)') plt.plot(adratio, 'b', label='Equity Growth') plt.xticks(ind, (year1, year2, year3, year4, year5)) plt.show() def get_cashflow_data(year1, year2, year3, year4, year5, scode): timelist = [] timelist.append(year1) timelist.append(year2) timelist.append(year3) timelist.append(year4) timelist.append(year5) cf_sales = [] #經營現金凈流量對銷售收入比率 rateofreturn = [] #資產的經營現金流量回報率 cf_nm = [] #經營現金凈流量與凈利潤的比率 cf_liabilities =[] #經營現金凈流量對負債比率 cashflowratio = [] #現金流量比率 for i in timelist: cashflow_data = ts.get_cashflow_data(i,4) cashflow_data.index = cashflow_data.code data = cashflow_data[cashflow_data.index == scode] cf_sales.append(float(data.cf_sales)) rateofreturn.append(float(data.rateofreturn)) cf_nm.append(float(data.cf_nm)) cf_liabilities.append(float(data.cf_liabilities)) cashflowratio.append(float(data.cashflowratio)) plt.figure(figsize=(12,6)) ind = np.arange(5) plt.subplot(231) plt.title('OCF/Sales') plt.plot(cf_sales, 'r', label='OCF/Sales') plt.xticks(ind, (year1, year2, year3, year4, year5)) plt.subplot(232) plt.title('OCF/Asset') plt.plot(rateofreturn, 'g', label='OCF/Asset') plt.xticks(ind, (year1, year2, year3, year4, year5)) plt.subplot(233) plt.title('OCF/NI') plt.plot(cf_nm, 'b', label='OCF/NI') plt.xticks(ind, (year1, year2, year3, year4, year5)) plt.subplot(234) plt.title('OCF/Liabilities') plt.plot(cf_liabilities, 'r', label='OCF/Liabilities') plt.xticks(ind, (year1, year2, year3, year4, year5)) plt.subplot(235) plt.title('CashflowRatio') plt.plot(cashflowratio, 'g', label='CashflowRatio') plt.xticks(ind, (year1, year2, year3, year4, year5)) plt.show()

 


免責聲明!

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



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