使用Python構(gòu)建股票財(cái)務(wù)指標(biāo)打分系統(tǒng)
最近受到知識(shí)星球圈友【祿子?】的啟發(fā),利用Python基于財(cái)務(wù)指標(biāo)打分構(gòu)建價(jià)值投機(jī)股票的選股系統(tǒng)。首先感謝他給我發(fā)的電子書(shū)《價(jià)值投機(jī)》和他自己寫的code(公眾號(hào)回復(fù)“價(jià)值投資”或‘210319’即可獲?。?shū)中前半部分闡述了財(cái)務(wù)指標(biāo)的含義及打分模型,后半部分則介紹了技術(shù)分析和投資策略。本文以第一部分價(jià)值分析和評(píng)分模型為基礎(chǔ),使用Python構(gòu)建一個(gè)價(jià)值投機(jī)評(píng)分選股系統(tǒng)。實(shí)際上這里的打分模型本質(zhì)上是一個(gè)多因子模型,書(shū)中列出的十項(xiàng)財(cái)務(wù)指標(biāo)相當(dāng)于“因子”,而因子權(quán)重主要根據(jù)經(jīng)驗(yàn)分析進(jìn)行賦值,值的范圍在0-10,最后匯總得分。下面帶領(lǐng)大家一起了解一下相關(guān)財(cái)務(wù)指標(biāo)的構(gòu)成及其打分模型,并使用Python實(shí)現(xiàn)選股系統(tǒng)的構(gòu)建。
營(yíng)業(yè)收入增長(zhǎng)率是衡量企業(yè)經(jīng)營(yíng)狀況和市場(chǎng)占有能力、預(yù)測(cè)企業(yè)經(jīng)營(yíng)發(fā)展趨勢(shì)、評(píng)價(jià)企業(yè)成長(zhǎng)狀況的重要指標(biāo)。一般而言,當(dāng)營(yíng)業(yè)收入增長(zhǎng)率大于10%時(shí),表明公司產(chǎn)品處于成長(zhǎng)期;當(dāng)營(yíng)業(yè)收入增長(zhǎng)率在5%-10%時(shí),說(shuō)明公司產(chǎn)品已經(jīng)進(jìn)入穩(wěn)定期,不就將進(jìn)入衰退期;如果該比率低于5%,表明公司產(chǎn)品可能逐漸進(jìn)入衰退期。從基本面分析的角度看,我們要尋找那些處于上升期、成長(zhǎng)期的公司,因此在量化的時(shí)候以營(yíng)業(yè)收入增長(zhǎng)率達(dá)到10%作為基準(zhǔn)進(jìn)行評(píng)分,以最近季度增長(zhǎng)率與10%進(jìn)行對(duì)比,低于10%則每減少1%減1分(四舍五入整數(shù)),直至0分;高于10%則每增加1%加1分,最多至10分。
一般而言,公司盈利能力越強(qiáng),投資價(jià)值越高。書(shū)中將將選擇標(biāo)準(zhǔn)定在20%,即以增長(zhǎng)20%為基準(zhǔn)計(jì)5分,以最近季度增長(zhǎng)率與20%進(jìn)行對(duì)比,低于20%則每減少2%減1分,直至0分;高于20%則每增加2%加1分,最多至10分。
毛利率是毛利與銷售收入或營(yíng)業(yè)收入的百分比,即毛利率=(營(yíng)業(yè)收入-營(yíng)業(yè)成本)/營(yíng)業(yè)收入。毛利率是公司的重要經(jīng)營(yíng)指標(biāo),能反映公司產(chǎn)品的競(jìng)爭(zhēng)力和獲利潛力,該指標(biāo)可以反映公司某一主要產(chǎn)品或主要業(yè)務(wù)的盈利狀況。與歷史相比,若公司的毛利率顯著提高,則可能是公司所在行業(yè)處于復(fù)蘇時(shí)期,產(chǎn)品價(jià)格顯著上升。反之,若公司毛利率顯著降低,則可能是公司所在行業(yè)競(jìng)爭(zhēng)激烈,毛利率下降往往伴隨著價(jià)格戰(zhàn)的爆發(fā)或成本的失控,意味著盈利能力的下降。當(dāng)然,行業(yè)不同毛利率差異很大,因此毛利率只適合縱向比較。以前三年度平均毛利率為基準(zhǔn)計(jì)5分,以最近季度毛利率與前三年度平均毛利率比較,低于前三年平均毛利率則每減少0.5%減1分,直至0分;高于近三年平均毛利率則每增加0.5%加1分,最多10分。
期間費(fèi)用率=(營(yíng)業(yè)費(fèi)用+管理費(fèi)用+財(cái)務(wù)費(fèi)用)/營(yíng)業(yè)收入,該指標(biāo)能反映公司的費(fèi)用規(guī)模、管控能力、運(yùn)營(yíng)水平,是評(píng)估公司經(jīng)營(yíng)管理能力和效率的重要指標(biāo)。由于行業(yè)不同,期間費(fèi)用率差異較大,因此評(píng)價(jià)期間費(fèi)用率指標(biāo),只能是公司現(xiàn)在的期間費(fèi)用率水平與過(guò)去年度進(jìn)行比較,查看期間費(fèi)用率是在提升還是下降。以前三年度平均期間費(fèi)用率為基準(zhǔn)計(jì)5分;以最近季度期間費(fèi)用率與前三年度平均期間費(fèi)用率進(jìn)行對(duì)比,高于前三年度平均期間費(fèi)用率則每增加0.5%減1分,直至0分;低于前三年度平均期間費(fèi)用率則每減少0.5%加1分,最多至10分。
存貨周轉(zhuǎn)率用于反映存貨的周轉(zhuǎn)速度,可以反映企業(yè)存貨管理水平的高低,影響企業(yè)的短期償債能力。由于不同行業(yè)該指標(biāo)差異較大,因而只適合自身縱向比較,即觀察存貨周轉(zhuǎn)率是在提升還是下降。評(píng)分以前三年度平均存貨周轉(zhuǎn)率為基準(zhǔn)計(jì)5分,以最近季度的年化存貨周轉(zhuǎn)率與前三年度平均存貨周轉(zhuǎn)率進(jìn)行對(duì)比,每提高2%加1分,最多至10分,每降低2%減1分,直至0分。即存貨周轉(zhuǎn)率分值=5+(最近季度的年化存貨周轉(zhuǎn)率-前三年度平均存貨周轉(zhuǎn)率)/前三年度平均存貨周轉(zhuǎn)率x100/2。
每股經(jīng)營(yíng)現(xiàn)金流量反映公司為每一普通股獲取的現(xiàn)金流入量,計(jì)算公式為(公司經(jīng)營(yíng)活動(dòng)現(xiàn)金流入-經(jīng)營(yíng)活動(dòng)現(xiàn)金流出)/總股本,常用來(lái)衡量公司的盈利質(zhì)量,如果每股收益遠(yuǎn)高于每股經(jīng)營(yíng)現(xiàn)金流量,說(shuō)明公司當(dāng)期銷售形成的利潤(rùn)多為賬面利潤(rùn),沒(méi)有在當(dāng)期為格式帶來(lái)真金白銀,即利潤(rùn)或每股收益質(zhì)量差,可能是虛假繁榮。一般而言,每股經(jīng)營(yíng)性現(xiàn)金流量越大越好,但當(dāng)公司在高速擴(kuò)張期時(shí)期每股經(jīng)營(yíng)性現(xiàn)金流量可能為負(fù)。當(dāng)然如果一家公司連續(xù)出現(xiàn)每股現(xiàn)金流量為負(fù)值是值得警惕的,潛在風(fēng)險(xiǎn)包括過(guò)度擴(kuò)張、應(yīng)收賬款不能及時(shí)收回產(chǎn)生壞賬風(fēng)險(xiǎn),財(cái)務(wù)造假、虛增利潤(rùn)等。評(píng)分標(biāo)準(zhǔn):以最近三年每股收益之和為基準(zhǔn)計(jì)5分,以最近三年每股經(jīng)營(yíng)性現(xiàn)金流量之和與最近三年每股收益之和對(duì)比,每增加4%加1分,,最多10分;每減少4%減1分,直至0分。
加權(quán)凈資產(chǎn)收益率指標(biāo)是一個(gè)綜合性很強(qiáng)的指標(biāo),是衡量公司盈利能力、股東資金使用效率的重要指標(biāo)。加權(quán)凈資產(chǎn)收益率指標(biāo)值越高,說(shuō)明自有資本獲得凈收益的能力越強(qiáng)。一般而言,一家優(yōu)秀的成長(zhǎng)型公司的加權(quán)凈資產(chǎn)收益率應(yīng)保持在每年15%以上。因此評(píng)分以15%為基準(zhǔn)計(jì)5分,以最近季度的年化加權(quán)凈資產(chǎn)收益率與15%進(jìn)行對(duì)比,每增加1%加1分,最多10分;每減少1%減1分,直至0分。
總資產(chǎn)報(bào)酬率表示企業(yè)全部資產(chǎn)獲取收益的水平,能較全面地反映企業(yè)的獲利能力和投入產(chǎn)出狀況。一般情況,企業(yè)可根據(jù)此指標(biāo)與市場(chǎng)資本利率進(jìn)行比較,若該指標(biāo)大于市場(chǎng)利率,則表明企業(yè)可以利用財(cái)務(wù)杠桿進(jìn)行負(fù)債經(jīng)營(yíng),獲取更多的收益,該指標(biāo)越高,表明企業(yè)投入產(chǎn)出水平越好,企業(yè)的資產(chǎn)運(yùn)營(yíng)越有效。評(píng)分標(biāo)準(zhǔn)為:以5%為基準(zhǔn)計(jì)0分,以最近季度年化總資產(chǎn)報(bào)酬率(最近季度為四季度則為最近年度總資產(chǎn)報(bào)酬率)與5%進(jìn)行對(duì)比,每增加0.5%加1分,最多10分;每降低0.5%減1分,直至0分。其中最近季度的年化總資產(chǎn)報(bào)酬率=上年度總資產(chǎn)報(bào)酬率X最近季度總資產(chǎn)報(bào)酬率/上一年同季度總資產(chǎn)報(bào)酬率。即(最近季度年化總資產(chǎn)報(bào)酬率-5)/0.5。
市凈率是每股股價(jià)與每股凈資產(chǎn)的比率,一般而言,市凈率越低的股票其投資價(jià)值越高;反之,市凈率越高的股票,其投資價(jià)值越小。歷史經(jīng)驗(yàn)表明,一些跌破凈資產(chǎn)的股票往往會(huì)表現(xiàn)為較小的投資風(fēng)險(xiǎn),而在行情啟動(dòng)時(shí),具有較好的價(jià)值回歸動(dòng)力。以3倍市凈率為基準(zhǔn)計(jì)5分,每降低0.4倍加1分,最多10分,每提高0.4倍減1分,如果確定以市凈率為主要估值指標(biāo),則市凈率分值無(wú)下限,如果確定以PEG(動(dòng)態(tài)市盈率相對(duì)盈利增長(zhǎng)比率)指標(biāo)為估值指標(biāo),則市凈率分值最低0分。
PEG等于公司的市盈率除以公司的盈利增長(zhǎng)速度,與市凈率一樣,PEG是一個(gè)估值指標(biāo),兩者在使用時(shí)側(cè)重點(diǎn)不同。一般而言,PEG值越低,股價(jià)被低估的可能性越大,相應(yīng)的投資價(jià)值就可能越大;相反,PEG值越高,股價(jià)被低估的可能性越小,相應(yīng)的投資價(jià)值就可能越小。
PEG=動(dòng)態(tài)市盈率/過(guò)去三年平均凈利潤(rùn)增長(zhǎng)率,其中動(dòng)態(tài)市盈率=現(xiàn)在股價(jià)/年化每股收益;最近季度的年化每股收益=上年度每股收益X最近季度每股收益/上一年度同季度每股收益。評(píng)分標(biāo)準(zhǔn):以PEG值等于1為基準(zhǔn)計(jì)5分,每降低0.1倍加1分,最多10分;每提高0.1倍減1分。如果確定以PEG為主要估值指標(biāo),則PEG分值無(wú)下限,如果確定以市盈率為主要估值指標(biāo),則PEG分值最低0分。得分=5-[(動(dòng)態(tài)市盈率相對(duì)盈利增長(zhǎng)比率-1)/0.1]。
將上述指標(biāo)計(jì)分匯總得到總分,理論上當(dāng)總分大于50分認(rèn)為具備投資價(jià)值,因?yàn)檫x定的十項(xiàng)指標(biāo)中的每一項(xiàng)指標(biāo)的中間值都是按照具備投資價(jià)值的公司標(biāo)準(zhǔn)選定的。上述指標(biāo)對(duì)于判斷非周期性行業(yè)股票的投資價(jià)值,以及高成長(zhǎng)性股票的估值是否合理、成長(zhǎng)性能否持續(xù)都具有重要意義;對(duì)于周期性行業(yè)的股票也適用,但周期性股票的買賣點(diǎn)主要看行業(yè)的周期性拐點(diǎn),分值高低反而不重要。值得注意的是,上述十項(xiàng)指標(biāo)評(píng)估模型理論上可以適用于任何生產(chǎn)銷售型公司,但金融行業(yè)(銀行、券商等)不能直接適用,有些指標(biāo)需要重新設(shè)定。
下面使用Python實(shí)現(xiàn)上述指標(biāo)的計(jì)算、評(píng)分、可視化和選股。首先引入后面需要用到的包,本文使用tushare獲取公司財(cái)務(wù)指標(biāo)和股價(jià)數(shù)據(jù)。注意某些數(shù)據(jù)可能存在積分權(quán)限,token是注冊(cè)該網(wǎng)站獲取。
import pandas as pd
import numpy as np
from datetime import datetime
#畫圖
import matplotlib.pyplot as plt
%matplotlib inline
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
#獲取數(shù)據(jù)
import tushare as ts
token='輸入你在tushare上獲取的token'
ts.set_token(token)
pro=ts.pro_api(token)
需要用到的財(cái)務(wù)指標(biāo)名稱及其在tushare上的調(diào)用函數(shù):
{'營(yíng)業(yè)收入增長(zhǎng)率':'tr_yoy','營(yíng)業(yè)利潤(rùn)增長(zhǎng)率':'op_yoy','毛利率':'grossprofit_margin','期間費(fèi)用率':'expense_of_sales','存貨周轉(zhuǎn)率':'inv_turn','每股經(jīng)營(yíng)性現(xiàn)金流量':'ocfps', '每股收益':'eps','加權(quán)凈資產(chǎn)收益率':'roe_waa','年化凈資產(chǎn)收益率':'roe_yearly', '年化總資產(chǎn)報(bào)酬率':'roa2_yearly','歸屬母公司股東的凈利潤(rùn)-扣除非經(jīng)常損益同比增長(zhǎng)率':'dt_netprofit_yoy'}
編寫函數(shù)獲取相應(yīng)的財(cái)務(wù)指標(biāo),輸出dataframe格式。
def get_indicators(code):
#獲取當(dāng)前時(shí)間,計(jì)算當(dāng)前和過(guò)去四年時(shí)間
t0=datetime.now()
t1=datetime(t0.year-4,t0.month,t0.day)
end=t0.strftime('%Y%m%d')
start=t1.strftime('%Y%m%d')
#財(cái)務(wù)比率
fields='ann_date,end_date,tr_yoy,op_yoy,\
grossprofit_margin,expense_of_sales,inv_turn,eps,\
ocfps,roe_yearly,roa2_yearly,netprofit_yoy'
fina = (pro.fina_indicator(ts_code=code,start_date=start, end_date=end,fields=fields)
.drop_duplicates(subset=['ann_date','end_date'],keep='first'))
fina.set_index('end_date',inplace = True)
fina=fina.sort_index()
#獲取市盈率和市凈率指標(biāo)(pe、pb數(shù)據(jù))
pbe=pro.daily_basic(ts_code=code, fields='trade_date,pe_ttm,pb')
pbe.set_index('trade_date',inplace=True)
pbe=pbe.sort_index()
#合并數(shù)據(jù)
df=pd.merge(fina,pbe,left_index=True,right_index=True,how='left')
#pb缺失數(shù)據(jù)使用前值填充,pe不管,缺失值可能是因?yàn)橛麨樨?fù)數(shù)
df['pb'].fillna(method='ffill',inplace=True)
return df
編寫各項(xiàng)財(cái)務(wù)指標(biāo)的評(píng)分函數(shù)。
#存在缺失值或者負(fù)值(市盈率)情況下評(píng)分直接為0
#營(yíng)業(yè)收入增長(zhǎng)率打分(0-10)
def cal_tryoy(y):
'''y是營(yíng)業(yè)收入增長(zhǎng)率'''
try:
return 5+ min(round(y-10),5) if y>=10 else 5+ max(round(y-10),-5)
except:
return 0
#營(yíng)業(yè)利潤(rùn)增長(zhǎng)率打分(0-10)
def cal_opyoy(y):
'''y是營(yíng)業(yè)利潤(rùn)增長(zhǎng)率'''
try:
return 5+ min(round((y-20)/2),5) if y>=20 else 5+ max(round((y-20)/2),-5)
except:
return 0
#毛利率打分
def cal_gpm(y):
'''y是最近季度毛利率-前三季度平均毛利率'''
try:
return 5+min(round(y)/0.5,5) if y>0 else max(round(y)/0.5,-5)+5
except:
return 0
#期間費(fèi)用率打分
def cal_exp(y):
'''y是最近季度期間費(fèi)用率-前三季度平均期間費(fèi)用率'''
try:
return 5+min(round(y)/0.5,5) if y>0 else max(round(y)/0.5,-5)+5
except:
return 0
#存貨周轉(zhuǎn)率打分
def cal_inv(y):
'''y是(最近季度存貨周轉(zhuǎn)率-前三季度平均存貨周轉(zhuǎn)率)/前三季度平均存貨周轉(zhuǎn)率*100'''
try:
return 5+min(round(y/2),5) if y>0 else max(round(y/2),-5)+5
except:
return 0
#每股經(jīng)營(yíng)性現(xiàn)金流打分
def cal_ocfp(y):
'''y是(最近三季度每股經(jīng)營(yíng)性現(xiàn)金流之和-最近三季度每股收益之和)/最近三季度每股收益之和*100'''
try:
return 5+min(round(y/4),5) if y>0 else max(round(y/4),-5)+5
except:
return 0
#凈資產(chǎn)收益率打分
def cal_roe(y):
'''y是年化凈資產(chǎn)收益率'''
try:
return 5+ min(round(y-15),5) if y>=15 else 5+ max(round(y-15),-5)
except:
return 0
#總資產(chǎn)報(bào)酬率打分
def cal_roa(y):
'''y是最近季度年化總資產(chǎn)報(bào)酬率'''
try:
return min(round((y-5)/0.5),10) if y>=5 else max(round(y-5),0)
except:
return 0
#市凈率打分
def cal_pb(y):
'''y是市凈率'''
try:
return 5-max(round((y-3)/0.4),-5) if y<=3 else 5-min(round((y-3)/0.4),5)
except:
return 0
#動(dòng)態(tài)市盈率相對(duì)盈利增長(zhǎng)率(PEG)打分
def cal_pe(y):
'''y是動(dòng)態(tài)市盈率相對(duì)盈利增長(zhǎng)率'''
try:
return 5-max(round((y-1)/0.1),-5) if y<=1 else 5-min(round((y-1)/0.1),5)
except:
return 0
計(jì)算各項(xiàng)財(cái)務(wù)指標(biāo)得分。
#計(jì)算財(cái)務(wù)指標(biāo)得分
def indicator_score(code):
data=get_indicators(code)
'''(1)營(yíng)業(yè)收入增長(zhǎng)率打分'''
data['營(yíng)收得分']=data['tr_yoy'].apply(cal_tryoy)
'''(2)營(yíng)業(yè)利潤(rùn)增長(zhǎng)率打分'''
data['利潤(rùn)得分']=data['op_yoy'].apply(cal_opyoy)
'''(3)毛利率打分'''
#計(jì)算最近季度毛利率-前三季度平均毛利率
data['gpm']=data['grossprofit_margin']-data['grossprofit_margin'].rolling(3).mean()
data['毛利得分']=data['gpm'].apply(cal_gpm)
'''(4)期間費(fèi)用率打分'''
#最近季度期間費(fèi)用率-前三季度平均期間費(fèi)用率
data['exp']=data['expense_of_sales']-data['expense_of_sales'].rolling(3).mean()
data['費(fèi)用得分']=data['exp'].apply(cal_exp)
'''(5)周轉(zhuǎn)率打分'''
#(最近季度存貨周轉(zhuǎn)率-前三季度平均存貨周轉(zhuǎn)率)/前三季度平均存貨周轉(zhuǎn)率*100
data['inv']=(data['inv_turn']-data['inv_turn'].rolling(3).mean())*100/data['inv_turn'].rolling(3).mean()
data['周轉(zhuǎn)得分']=data['inv'].apply(cal_inv)
'''(6)每股經(jīng)營(yíng)現(xiàn)金流打分'''
#(最近三季度每股經(jīng)營(yíng)性現(xiàn)金流之和-最近三季度每股收益之和)/最近三季度每股收益之和*100
data['ocf']=(data['ocfps'].rolling(3).sum()-data['eps'].rolling(3).sum())*100/data['eps'].rolling(3).sum()
data['現(xiàn)金得分']=data['ocf'].apply(cal_ocfp)
'''(7)凈資產(chǎn)收益率打分'''
data['凈資產(chǎn)得分']=data['roe_yearly'].apply(cal_roe)
'''(8)總資產(chǎn)收益率打分'''
data['總資產(chǎn)得分']=data['roa2_yearly'].apply(cal_roa)
'''(9)市凈率打分'''
data['市凈率得分']=data['pb'].apply(cal_pb)
'''(10)動(dòng)態(tài)市盈率相對(duì)盈利增長(zhǎng)率打分'''
#動(dòng)態(tài)市盈率相對(duì)盈利增長(zhǎng)率
data['peg']=data['pe_ttm']/data['netprofit_yoy'].rolling(3).mean()
data['市盈率得分']=data['peg'].apply(cal_pe)
#計(jì)算總得分
data['總分']=data[['營(yíng)收得分','利潤(rùn)得分','費(fèi)用得分','周轉(zhuǎn)得分','現(xiàn)金得分','凈資產(chǎn)得分','總資產(chǎn)得分',\
'市凈率得分','市盈率得分']].sum(axis=1)
return data[['營(yíng)收得分','利潤(rùn)得分','費(fèi)用得分','周轉(zhuǎn)得分','現(xiàn)金得分','凈資產(chǎn)得分','總資產(chǎn)得分',\
'市凈率得分','市盈率得分','總分']]
以貴州茅臺(tái)為例,查看其財(cái)務(wù)指標(biāo)各季度得分和匯總情況。
#貴州茅臺(tái)
code='600519.SH'
indicator_score(code)

根據(jù)書(shū)中的打分模型,貴州茅臺(tái)這只大牛股的得分并沒(méi)有特別突出。
當(dāng)個(gè)股指標(biāo)總得分高于50模型認(rèn)為具有投資價(jià)值,下面對(duì)該信號(hào)進(jìn)行可視化,可視化函數(shù)代碼較長(zhǎng)此處略(見(jiàn)知識(shí)星球“Python金融量化”)。
plot_signal(code)

plot_stock_signal(code)

從打分模型中給出的交易信號(hào)看,該模型對(duì)貴州茅臺(tái)個(gè)股的指導(dǎo)作用較差,買入持有反而是更理想的策略。當(dāng)然,正如書(shū)中提到,當(dāng)前財(cái)務(wù)指標(biāo)打分高于標(biāo)準(zhǔn)并不代表可以立刻買入,還要結(jié)合個(gè)股的技術(shù)形態(tài)進(jìn)一步確認(rèn)。
獲取A股上市交易股票進(jìn)行橫向比較
下面獲取A股當(dāng)前交易的股票,分別剔除上市時(shí)間短于4年個(gè)股(時(shí)間短財(cái)務(wù)指標(biāo)無(wú)法反映趨勢(shì))、銀行券商等金融股(指標(biāo)模型不適用)、ST和*ST股。
#獲取當(dāng)前正常上市交易的股票列表
def get_code():
t=datetime.now()
df=pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
#排除上市日期短于4年的個(gè)股
#獲取當(dāng)前年份
year=datetime.now().strftime('%Y')
#四年前
year=str(int(year)-4)+'0101'
#保留上市時(shí)間大于四年個(gè)股數(shù)據(jù)
df=df[df.list_date<year]
#排除銀行、保險(xiǎn)、多元金融公司
df=df[-df.industry.isin(['銀行','保險(xiǎn)','多元金融'])]
#排除st和*ST股
df=df[-df.name.str.startswith(('ST'))]
df=df[-df.name.str.startswith(('*'))]
code=df.ts_code.values
name=df.name
return dict(zip(name,code))
計(jì)算股票財(cái)務(wù)指標(biāo)總分并合并成一個(gè)dataframe
#計(jì)算所有股票財(cái)務(wù)指標(biāo)總分
def get_all_score():
df=pd.DataFrame()
for name,code in get_code().items():
try:
df[name]=indicator_score(code)['總分']
except:
continue
return df
dff=get_all_score()
獲取最近財(cái)務(wù)報(bào)表(年報(bào)還未出)總分排名前十五只個(gè)股。
#獲取最近日期總分排名前15個(gè)股
dff.T.sort_values(dff.T.columns[-1],ascending=False).iloc[:15,-10:]

plot_stock_signal(get_code()['電魂網(wǎng)絡(luò)'])

本文根據(jù)《價(jià)值投機(jī)》書(shū)中的十項(xiàng)財(cái)務(wù)指標(biāo)及其打分模型,分享了使用Python構(gòu)建基于財(cái)務(wù)指標(biāo)的選股系統(tǒng)。文中提及股票僅供學(xué)習(xí)交流,不構(gòu)成任何投資建議。實(shí)際上上述打分模型存在一定的局限性,缺乏對(duì)策略的歷史回測(cè)和模型評(píng)估,其適用性和范圍有待讀者進(jìn)一步完善。根據(jù)傳統(tǒng)股票定價(jià)模型,股票價(jià)值應(yīng)等于公司未來(lái)收入現(xiàn)金流的貼現(xiàn)值。但是現(xiàn)實(shí)中往往很難使用股票定價(jià)模型對(duì)股票價(jià)格作出準(zhǔn)確判斷,首先,由于公司未來(lái)收入的現(xiàn)金流很難刻畫和預(yù)測(cè),因此股票價(jià)值本身是很難精確評(píng)估的,只能做到模糊的估測(cè);其次,股票交易價(jià)格受到交易情緒(如投機(jī)氛圍)和尾部風(fēng)險(xiǎn)(極端事件)的影響比較大,因此短期上看股價(jià)波動(dòng)一般比公司基本面的波動(dòng)要大;再次,股價(jià)是實(shí)時(shí)變動(dòng)的,反映了投資者的預(yù)期,而財(cái)務(wù)信息存在一定的滯后性,包括財(cái)務(wù)報(bào)表的披露與報(bào)告日期存在較長(zhǎng)時(shí)間差,可能帶來(lái)未來(lái)函數(shù);最后,國(guó)內(nèi)很多上市公司的財(cái)務(wù)信息可靠性較差。盡管如此,量化投資應(yīng)該多與基本面結(jié)合,尋找符合經(jīng)濟(jì)含義解釋(理論)的因子比單純依靠數(shù)據(jù)挖掘更有可靠性。
資料來(lái)源:
海洋. 2017. 《價(jià)值投機(jī)——投資標(biāo)準(zhǔn)化之路》.中國(guó)經(jīng)濟(jì)出版社
PS:公號(hào)內(nèi)回復(fù)「Python」即可進(jìn)入Python 新手學(xué)習(xí)交流群,一起 100 天計(jì)劃!
老規(guī)矩,兄弟們還記得么,右下角的 “在看” 點(diǎn)一下,如果感覺(jué)文章內(nèi)容不錯(cuò)的話,記得分享朋友圈讓更多的人知道!


【神秘禮包獲取方式】
