一、財報分析 大家在購買股票的時候,已經(jīng)不只是憑感覺去買了,基本上都會對一個股票進(jìn)行深入的分析。 畢竟購買股票還是一項風(fēng)險性較高的投資,需要在較為熟悉以后才能去開展,不能蠻干,錢也都不是天上掉下來的。那么作為散戶投資者,如何去分析一家企業(yè)的經(jīng)營狀況,基本上都是從從他們的財務(wù)報表入手,而且這些資料在上市公司的公告信息里都能查的到,這也是散戶比較好的分析一家企業(yè)的支撐材料。 財報分析,一般是通過詳細(xì)的閱讀上市公司定期披露的季報、半年報、年報,了解其中各項信息進(jìn)而進(jìn)行深度分析,當(dāng)然最終會利用分析結(jié)果去對股票進(jìn)行較為準(zhǔn)確的操作。 財報分析的對象是財務(wù)報表,財務(wù)報表主要包括三大報表,資產(chǎn)負(fù)債表、利潤表、現(xiàn)金流量表。這三大報表分析,也會以關(guān)注主要項為主,如果能全面分析是最好: 1.獲利能力分析:利潤的高低、利潤額的增長速度等。 2.償債能力分析:短期償債能力主要分析其變現(xiàn)能力即流動資產(chǎn)的分布、變動情況,確保投資的安全。具體從兩個方面進(jìn)行分析:長期償債能力主要分析財務(wù)報表中權(quán)益項目之間、權(quán)益與收益之間、權(quán)益與資產(chǎn)之間的關(guān)系。 3.經(jīng)營能力分析: 企業(yè)經(jīng)營能力分析的主要指標(biāo)是企業(yè)營運(yùn)資產(chǎn)的效率與效益,主要是分析資產(chǎn)的周轉(zhuǎn)率或周轉(zhuǎn)速度,如存貨、固定資產(chǎn)、應(yīng)收賬款等。 以上的各項分析,目前在各個股票軟件里面都有比較好的數(shù)據(jù)了,但是也是因為其通用性,造成了按照自己的對比和查看不那么方便,今天我給大家介紹的是如何利用python+tushane+pandas獲取三大報表的數(shù)據(jù),進(jìn)行個性化分析,這里我主要還是以介紹獲取數(shù)據(jù)為主,具體的分析還要靠各位自行努力。 步長制藥的財報數(shù)據(jù)(手機(jī)端) 步長制藥自分析圖片 自己用數(shù)據(jù)進(jìn)行的分析(只選擇了一些項進(jìn)行對比,有了數(shù)據(jù)以后,大家可以自行選擇分析項) 二、數(shù)據(jù)獲取 這些數(shù)據(jù)如何獲取,當(dāng)然有很多地方,可以下載財報,也可以自己輸入,但是這些都比較慢,我利用python+tushare+pandas只需要幾行代碼就可以快速的獲取,而且一旦寫好一次后,后續(xù)想獲取任意股票的數(shù)據(jù),就非常方便了,而且我是把四張報表合并了分析(增加了軟件里常用的財務(wù)主要指標(biāo)表),大家也可以簡單的,先分析一張報表。 以下是具體的代碼,我做了說明,實際用到的代碼非常少,真正有用的代碼不超過20行. ''' Author:唐朝品鑒 Date:2020年5月24日 獲取指定公司的利潤表、資產(chǎn)負(fù)債表、現(xiàn)金流量表 ''' import pandas as pd import tushare as ts from time import sleep ''' 下面是參數(shù)說明: ts_code 股票代碼 end_date 報告期 report_type 報表類型,1合并報表 2單季合并 3調(diào)整單季合并表 4調(diào)整合并報表 5調(diào)整前合并報表 6母公司報表 7母公司單季報 8 母公司調(diào)整單季表 9母公司調(diào)整表 10母公司調(diào)整前報表 11調(diào)整前合并報表 12母公司調(diào)整前報表 basic_eps 基本每股收益 diluted_eps 稀釋每股收益 total_revenue 營業(yè)總收入 sell_exp 銷售費(fèi)用 admin_exp 管理費(fèi)用 fin_exp 財務(wù)費(fèi)用 total_profit 利潤總額 income_tax 所得稅費(fèi)用 n_income 凈利潤(含少數(shù)股東損益) ''' #這里是獲取數(shù)據(jù)前的定義,方便修改,重復(fù)利用 #注冊地址 https:///register?reg=365370 token='**這個需要大家去注冊一個tushare,免費(fèi)的,然后從后臺獲取**' pro = ts.pro_api(token) my_code='603858.SH' fbegdate='20150101' fenddate='20201231' lrb_files='ts_code,end_date,report_type,basic_eps,diluted_eps,total_revenue,' \ 'sell_exp,admin_exp,fin_exp,total_profit,income_tax,n_income' zcfzb_files='ts_code,end_date,report_type,money_cap,notes_receiv,accounts_receiv,oth_receiv,inventories,total_cur_assets,' \ 'cip,r_and_d,total_assets,total_cur_liab,total_liab,minority_int' xjllb_files='ts_code,end_date,report_type,net_profit,finan_exp,c_fr_sale_sg,c_inf_fr_operate_a,c_paid_to_for_empl,' \ 'st_cash_out_act,n_cashflow_act,n_cashflow_inv_act,n_cash_flows_fnc_act' cwzb_files='ts_code,end_date,' \ 'profit_dedt,gross_margin,inv_turn,ar_turn,ca_turn,fa_turn,assets_turn,fcff,' \ 'ocfps,netprofit_margin,grossprofit_margin,cogs_of_sales,expense_of_sales,roe,' \ 'roe_yearly,debt_to_assets,fixed_assets,rd_exp' #下面是利用代碼,獲取網(wǎng)上數(shù)據(jù) while True: try: #利潤表 lr_df = pro.income(ts_code=my_code, start_date=fbegdate, end_date=fenddate,fields=lrb_files) sleep(2) #資產(chǎn)負(fù)債表 zcfz_df = pro.balancesheet(ts_code=my_code, start_date=fbegdate, end_date=fenddate,fields=zcfzb_files) sleep(2) #現(xiàn)金流量表 xjll_df = pro.cashflow(ts_code=my_code, start_date=fbegdate, end_date=fenddate, fields=xjllb_files) sleep(2) #財務(wù)主要指標(biāo)表 cwzb_df = pro.fina_indicator(ts_code=my_code, start_date=fbegdate, end_date=fenddate,fields=cwzb_files) sleep(2) break except Exception as e: print(e) continue # 這里是利用年月日的時間生成,年、季度列;插入指定列,0表示第一列,即生成年度列和季度列 lr_df.insert(2, 'fyear',lr_df['end_date'].str[0:4]) lr_df.insert(3,'fperiod',lr_df['end_date'].str[4:6]) #利用drop_duplicates刪除重復(fù)行 nlr_df=lr_df.drop_duplicates(subset=['ts_code','end_date','report_type'], keep='first') nzcfz_df=zcfz_df.drop_duplicates(subset=['ts_code','end_date','report_type'], keep='first') nxjll_df=xjll_df.drop_duplicates(subset=['ts_code','end_date','report_type'], keep='first') ncwzb_df=cwzb_df.drop_duplicates(subset=['ts_code','end_date'], keep='first') hz_df1=pd.merge(nlr_df,nzcfz_df,on=['ts_code','end_date']) hz_df2=pd.merge(hz_df1,nxjll_df,on=['ts_code','end_date']) hz_df3=pd.merge(hz_df2,ncwzb_df,on=['ts_code','end_date']) #以下是我用來重命名,改成中文的主要為了方便,所以有點長,其實可以省略的 def renname(df): i = 0 # 用i的目的是區(qū)別,列名重復(fù)的問題,確保重命名后不重復(fù),為刪除列做好準(zhǔn)備 # 獲取列名 for column in df.iloc[:,:]: # 用i的目的是區(qū)別,列名重復(fù)的問題,確保重命名后不重復(fù),為刪除列做好準(zhǔn)備 print(column) i = i + 1 if column == 'ts_code': newname = '股票代碼' elif column == 'end_date': newname='時間' elif column== 'fyear': newname='年度' elif column == 'fperiod': newname='月份' elif column == 'report_type_x': newname='利潤表類型' elif column == 'basic_eps': newname='基本每股收益' elif column == 'diluted_eps': newname='稀釋每股收益' elif column == 'total_revenue': newname='營業(yè)總收入' elif column == 'sell_exp': newname='銷售費(fèi)用' elif column == 'admin_exp': newname='管理費(fèi)用' elif column == 'fin_exp': newname='財務(wù)費(fèi)用' elif column == 'total_profit': newname='利潤總額' elif column == 'income_tax': newname='所得稅費(fèi)用' elif column == 'n_income': newname='凈利潤(含少數(shù)股東損益)' elif column == 'report_type_y': newname='資產(chǎn)負(fù)債表類型' elif column == 'money_cap': newname = '貨幣資金' elif column == 'notes_receiv': newname='應(yīng)收票據(jù)' elif column == 'accounts_receiv': newname='應(yīng)收賬款' elif column == 'oth_receiv': newname='其他應(yīng)收款' elif column == 'inventories': newname='存貨' elif column == 'total_cur_assets': newname='流動資產(chǎn)合計' elif column == 'cip': newname='在建工程' elif column == 'r_and_d': newname='研發(fā)支出' elif column == 'total_assets': newname='資產(chǎn)總計' elif column == 'total_cur_liab': newname='流動負(fù)債合計' elif column == 'total_liab': newname='負(fù)債合計' elif column == 'minority_int': newname='少數(shù)股東權(quán)益' elif column == 'report_type': newname='現(xiàn)金流量表類型' elif column == 'net_profit': newname='凈利潤' elif column == 'finan_exp': newname='(現(xiàn))財務(wù)費(fèi)用' elif column == 'c_fr_sale_sg': newname='銷售商品、提供勞務(wù)收到的現(xiàn)金' elif column == 'c_inf_fr_operate_a': newname='經(jīng)營活動現(xiàn)金流入小計' elif column == 'c_paid_to_for_empl': newname='支付給職工以及為職工支付的現(xiàn)金' elif column == 'st_cash_out_act': newname='經(jīng)營活動現(xiàn)金流出小計' elif column == 'n_cashflow_act': newname='經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額' elif column == 'n_cashflow_inv_act': newname='投資活動產(chǎn)生的現(xiàn)金流量凈額' elif column == 'n_cash_flows_fnc_act': newname='籌資活動產(chǎn)生的現(xiàn)金流量凈額' elif column == 'profit_dedt': newname='扣除非經(jīng)常性損益后的凈利潤' elif column == 'gross_margin': newname='毛利' elif column == 'inv_turn': newname='存貨周轉(zhuǎn)率' elif column == 'ar_turn': newname='應(yīng)收賬款周轉(zhuǎn)率' elif column == 'ca_turn': newname='流動資產(chǎn)周轉(zhuǎn)率' elif column == 'fa_turn': newname='固定資產(chǎn)周轉(zhuǎn)率' elif column == 'assets_turn': newname='總資產(chǎn)周轉(zhuǎn)率' elif column == 'fcff': newname='企業(yè)自由現(xiàn)金流量' elif column == 'ocfps': newname='每股經(jīng)營活動產(chǎn)生的現(xiàn)金流量凈額' elif column == 'netprofit_margin': newname='銷售凈利率' elif column == 'grossprofit_margin': newname='銷售毛利率' elif column == 'cogs_of_sales': newname='銷售成本率' elif column == 'expense_of_sales': newname='銷售期間費(fèi)用率' elif column == 'roe': newname='凈資產(chǎn)收益率' elif column == 'roe_yearly': newname='年化凈資產(chǎn)收益率' elif column == 'debt_to_assets': newname='資產(chǎn)負(fù)債率' elif column == 'fixed_assets': newname='固定資產(chǎn)合計' elif column == 'rd_exp': newname='研發(fā)費(fèi)用' else: newname=column # df=df.drop([column],axis=1, inplace=True) #根據(jù)列名刪除該列 df.rename(columns={column: str(newname)}, inplace=True) return df #這里是調(diào)用了重命名函數(shù),也可以不用的 renname(hz_df3) #把結(jié)果保存的excel,備用 hz_df3.to_excel('F:/python_analyze/%s_cbhz.xlsx'%my_code) print('完成') |
|