基于Python的指數(shù)基金量化投資 - 指數(shù)的市盈率和市凈率計算

上一篇《基于Python的指數(shù)基金量化投資 - 通過市盈率和市凈率對指數(shù)估值》介紹了通過市盈率和市凈率對指數(shù)進(jìn)行估值,然后結(jié)合具體的估值百分位來進(jìn)行投資锨用。所以指數(shù)的市盈率和市凈率是兩個非常重要的指標(biāo)。

這里就會有個問題,指數(shù)的市盈率和市凈率怎么進(jìn)行計算峡继,指數(shù)不像個股,個股的市盈率計算起來比較簡單:

同樣個股的市凈率計算也比較簡單:

而指數(shù)是一籃子股票匈挖,例如滬深300就包含了300家上市公司碾牌,中證500包含了500家上市公司,上證50包含了50家上市公司儡循,所以指數(shù)是一個上市公司的集合體舶吗,這個集合體我們也可以把它看成一家公司,里面包含的這些上市公司可以看成這家公司的某一部分或者某一個部門择膝,這樣的話誓琼,這家公司的市值就是所有部門的市值總和,公司凈利潤就是所有部門的利潤總和,而公司凈資產(chǎn)就是所有部門的凈資產(chǎn)總和腹侣,同樣再通過上面的計算過程就可以得到指數(shù)的市盈率:

同樣的方式也可以得到指數(shù)的市凈率:

具體怎么做呢叔收,分為3個步驟:

1)通過指數(shù)包含的個股,解析出具體的個股信息傲隶;

2)把第一步中所有個股的總市值饺律、總凈利潤和總凈資產(chǎn)計算出來;

3)通過上面介紹的指數(shù)計算方式計算出市盈率和市凈率即可伦籍;


具體來看看代碼實現(xiàn)

首先看看市盈率的計算方式

import pandas as pd

import math


indexType =['./importfile/indexSeries/indexTpye/hs300.csv',? #滬深300 - 0

????????????'./importfile/indexSeries/indexTpye/zz500.csv',? #中證500 - 1

????????????'./importfile/indexSeries/indexTpye/zz100.csv',? #中證100 - 2

????????????'./importfile/indexSeries/indexTpye/shz50.csv',? #上證50? - 3

????????????'./importfile/indexSeries/indexTpye/hsyy300.csv',? #滬深醫(yī)藥300 - 4

????????????'./importfile/indexSeries/indexTpye/zzyh.csv',?? #中證銀行? -5

????????????'./importfile/indexSeries/indexTpye/zzxf.csv',?? #中證消費(fèi)? -6

????????????'./importfile/indexSeries/indexTpye/zzbj.csv',?? #中證白酒? -7

????????????'./importfile/indexSeries/indexTpye/db500.csv',? # 500低波動-8

????????????'./importfile/indexSeries/indexTpye/jz300.csv',? # 300價值?? -9

????????????'./importfile/indexSeries/indexTpye/yy100.csv',? #醫(yī)藥100?? -10

????????????'./importfile/indexSeries/indexTpye/zzyyao.csv',?? #中證醫(yī)藥? -11

????????????'./importfile/indexSeries/indexTpye/jbm50.csv',? #基本面50? -12

????????????'./importfile/indexSeries/indexTpye/shzhl.csv',? #上證紅利? -13

????????????'./importfile/indexSeries/indexTpye/zzhl.csv',?? #中證紅利? -14

????????????'./importfile/indexSeries/indexTpye/zzjg.csv',?? #中證軍工? -15

????????????'./importfile/indexSeries/indexTpye/spyl.csv',?? #食品飲料? -16

????????????'./importfile/indexSeries/indexTpye/zqgs.csv',?? #證券公司? -17

????????????'./importfile/indexSeries/indexTpye/ylcy.csv',?? #養(yǎng)老產(chǎn)業(yè)? -18

????????????'./importfile/indexSeries/indexTpye/szhl.csv',?? #深證紅利? -19

????????????'./importfile/indexSeries/indexTpye/zzhb.csv',?? #中證環(huán)保? -20

????????????'./importfile/indexSeries/indexTpye/cyb.csv']??? #創(chuàng)業(yè)板??? -21

# 指數(shù)文件蓝晒,里面提供了指數(shù)包含的個股信息


idx = -1

total_share = 1

for indexCnt in range(len(indexType)):

???csv_data = pd.read_csv(indexType[indexCnt])


???total_profit_sum = 0

???total_total_sum = 0

???for i in range(csv_data.shape[0]):

???????if csv_data.values[i][4] >= 600000:

???????????stock_info_prc = pd.read_csv('C:/Program Files(x86)/Python/prjs/exportfile/stockDataAll/sh.' + str(csv_data.values[i][4]) +'.csv')

???????????stock_info_epsTTM = pd.read_csv('./exportfile/stockDataProfit/' +str(csv_data.values[i][4]) + '.csv')

???????elif csv_data.values[i][4] >= 300000:

???????????stock_info_prc = pd.read_csv('C:/Program Files (x86)/Python/prjs/exportfile/stockDataAll/sz.'+ str(csv_data.values[i][4]) + '.csv')

???????????stock_info_epsTTM = pd.read_csv('./exportfile/stockDataProfit/' +str(csv_data.values[i][4]) + '.csv')

???????else:

???????????len_name = len(str(csv_data.values[i][4]))

???????????if len_name == 1:

??????????????? stock_code = '00000' +str(csv_data.values[i][4])

???????????elif len_name == 2:

??????????????? stock_code = '0000' +str(csv_data.values[i][4])

???????????elif len_name == 3:

??????????????? stock_code = '000' +str(csv_data.values[i][4])

???????????elif len_name == 4:

??????????????? stock_code = '00' +str(csv_data.values[i][4])

???????????elif len_name == 5:

??????????????? stock_code = '0' + str(csv_data.values[i][4])

???????????elif len_name == 6:

??????????????? stock_code =str(csv_data.values[i][4])

???????????else:

??????????????? stock_code = ''

???????????stock_info_prc = pd.read_csv('C:/Program Files(x86)/Python/prjs/exportfile/stockDataAll/sz.' + stock_code + '.csv')

???????????stock_info_epsTTM = pd.read_csv('./exportfile/stockDataProfit/' +stock_code + '.csv')


???????stock_single_price = stock_info_prc['close']

???????stock_single_pe = stock_info_prc['peTTM']

???????stock_single_eps = stock_info_epsTTM['epsTTM']

???????stock_single_total = stock_info_epsTTM['liqaShare']

???????#解析個股的信息,包含個股價格帖鸦、市值斥滤、市盈率和市凈率


???????stock_single_total_tmp = stock_single_total.values[-1]

???????if math.isnan(stock_single_total_tmp):

???????????stock_single_total_tmp = stock_single_total.values[-2]


???????stock_single_profit = stock_single_eps.values[-1] *stock_single_total_tmp

???????if stock_single_pe.values[idx] < 0 or stock_single_eps.values[-1]< 0 or stock_single_pe.values[idx] > 500:

???????????weight_sum = 0

???????else:

???????????weight_sum = total_share / csv_data.shape[0]


???????total_profit_sum = weight_sum * stock_single_profit + total_profit_sum

???????total_total_sum = weight_sum * stock_single_total_tmp *stock_single_price.values[idx] + total_total_sum


???calc_pe = str(total_total_sum / total_profit_sum)

??? #通過公式計算出市盈率


???print('index name???? : ' + csv_data.values[0][2])

???print('weight_sum PE? : ' +calc_pe)

print('---------------')


其次再看看市凈率的計算過程


import pandas as pd

import math


indexType =['./importfile/indexSeries/indexTpye/hs300.csv',? #滬深300 - 0

????????????'./importfile/indexSeries/indexTpye/zz500.csv',? #中證500 - 1

????????????'./importfile/indexSeries/indexTpye/zz100.csv',? #中證100 - 2

????????????'./importfile/indexSeries/indexTpye/shz50.csv',? #上證50? - 3

????????????'./importfile/indexSeries/indexTpye/hsyy300.csv',? #滬深醫(yī)藥300 - 4

????????????'./importfile/indexSeries/indexTpye/zzyh.csv',?? #中證銀行? -5

????????????'./importfile/indexSeries/indexTpye/zzxf.csv',?? #中證消費(fèi)? -6

????????????'./importfile/indexSeries/indexTpye/zzbj.csv',?? #中證白酒? -7

????????????'./importfile/indexSeries/indexTpye/db500.csv',? # 500低波動-8

????????????'./importfile/indexSeries/indexTpye/jz300.csv',? # 300價值?? -9

????????????'./importfile/indexSeries/indexTpye/yy100.csv',? #醫(yī)藥100?? -10

????????????'./importfile/indexSeries/indexTpye/zzyyao.csv',?? #中證醫(yī)藥? -11

????????????'./importfile/indexSeries/indexTpye/jbm50.csv',? #基本面50? -12

????????????'./importfile/indexSeries/indexTpye/shzhl.csv',? #上證紅利? -13

????????????'./importfile/indexSeries/indexTpye/zzhl.csv',?? #中證紅利? -14

????????????'./importfile/indexSeries/indexTpye/zzjg.csv',?? #中證軍工? -15

????????????'./importfile/indexSeries/indexTpye/spyl.csv',?? #食品飲料? -16

????????????'./importfile/indexSeries/indexTpye/zqgs.csv',?? #證券公司? -17

????????????'./importfile/indexSeries/indexTpye/ylcy.csv',?? #養(yǎng)老產(chǎn)業(yè)? -18

????????????'./importfile/indexSeries/indexTpye/szhl.csv',?? #深證紅利? -19

????????????'./importfile/indexSeries/indexTpye/zzhb.csv',?? #中證環(huán)保? -20

????????????'./importfile/indexSeries/indexTpye/cyb.csv']??? #創(chuàng)業(yè)板??? -21

# 指數(shù)文件芜赌,里面提供了指數(shù)包含的個股信息


idx = -1

total_share = 1

for indexCnt in range(len(indexType)):

???total_profit_sum = 0

???total_asset_sum = 0

???total_total_sum = 0

??? csv_data= pd.read_csv(indexType[indexCnt])

???for i in range(csv_data.shape[0]):

???????if csv_data.values[i][4] >= 600000:

???????????stock_info_prc = pd.read_csv('C:/Program Files(x86)/Python/prjs/exportfile/stockDataAll/sh.' + str(csv_data.values[i][4]) +'.csv')

???????????stock_info_epsTTM = pd.read_csv('./exportfile/stockDataProfit/' +str(csv_data.values[i][4]) + '.csv')

???????elif csv_data.values[i][4] >= 300000:

???????????stock_info_prc = pd.read_csv('C:/Program Files(x86)/Python/prjs/exportfile/stockDataAll/sz.' + str(csv_data.values[i][4]) +'.csv')

???????????stock_info_epsTTM = pd.read_csv('./exportfile/stockDataProfit/' +str(csv_data.values[i][4]) + '.csv')

???????else:

???????????len_name = len(str(csv_data.values[i][4]))

???????????if len_name == 1:

??????????????? stock_code = '00000' +str(csv_data.values[i][4])

???????????elif len_name == 2:

??????????????? stock_code = '0000' +str(csv_data.values[i][4])

???????????elif len_name == 3:

??????????????? stock_code = '000' +str(csv_data.values[i][4])

???????????elif len_name == 4:

??????????????? stock_code = '00' +str(csv_data.values[i][4])

???????????elif len_name == 5:

??????????????? stock_code = '0' +str(csv_data.values[i][4])

???????????elif len_name == 6:

??????????????? stock_code =str(csv_data.values[i][4])

???????????else:

??????????????? stock_code = ''

???????????stock_info_prc = pd.read_csv('C:/Program Files (x86)/Python/prjs/exportfile/stockDataAll/sz.'+ stock_code + '.csv')

???????????stock_info_epsTTM = pd.read_csv('./exportfile/stockDataProfit/' +stock_code + '.csv')

???????stock_single_price = stock_info_prc['close']

???????stock_single_pb = stock_info_prc['pbMRQ']

??? ????stock_single_eps =stock_info_epsTTM['epsTTM']

???????stock_single_total = stock_info_epsTTM['liqaShare']

????????????? #解析個股的信息杆故,包含個股價格舱沧、市值、市盈率和市凈率


???????stock_single_total_tmp = stock_single_total.values[-1]

???????if math.isnan(stock_single_total_tmp):

???????????stock_single_total_tmp = stock_single_total.values[-2]


???????stock_single_profit = stock_single_eps.values[-1] *stock_single_total_tmp

???????stock_single_asset = stock_single_total_tmp *stock_single_price.values[idx] / stock_single_pb.values[idx]

???????if stock_single_pb.values[idx] < 0 or stock_single_eps.values[-1]< 0:

???????????weight_sum = 0

???????else:

???????????weight_sum = total_share / csv_data.shape[0]


???????total_profit_sum = weight_sum * stock_single_profit + total_profit_sum

???????total_asset_sum = weight_sum * stock_single_asset + total_asset_sum

???????total_total_sum = weight_sum * stock_single_total_tmp *stock_single_price.values[idx] + total_total_sum


calc_pb =str(total_total_sum / total_asset_sum)

# 通過公式計算出市盈率


???print('index name???? : ' +csv_data.values[0][2])

???print('weight_sum PB : ' + calc_pb)

print('----------------')


大家注意幾個問題:

1攻锰、代碼中用到的指數(shù)文件shz50.csv等可以在中證指數(shù)官網(wǎng)下載晾嘶,也可以直接聯(lián)系小將獲取娶吞;

2垒迂、另外個股信息數(shù)據(jù)和個股盈利數(shù)據(jù)(’prjs/exportfile/stockDataAll/sz.' + stock_code + '.csv'),'./exportfile/stockDataProfit/' + stock_code + '.csv' )可以在baostock上下載妒蛇,在文章中《202102_基于Python的指數(shù)基金量化投資 - 股票數(shù)據(jù)源baostock》有相關(guān)介紹机断。

課程參考:網(wǎng)易云課堂? 基于Python的量化指數(shù)基金投資

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市绣夺,隨后出現(xiàn)的幾起案子吏奸,更是在濱河造成了極大的恐慌,老刑警劉巖陶耍,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奋蔚,死亡現(xiàn)場離奇詭異,居然都是意外死亡烈钞,警方通過查閱死者的電腦和手機(jī)泊碑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毯欣,“玉大人蛾狗,你說我怎么就攤上這事∫敲剑” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長算吩。 經(jīng)常有香客問我留凭,道長,這世上最難降的妖魔是什么偎巢? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任蔼夜,我火速辦了婚禮,結(jié)果婚禮上压昼,老公的妹妹穿的比我還像新娘求冷。我一直安慰自己,他們只是感情好窍霞,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布匠题。 她就那樣靜靜地躺著,像睡著了一般但金。 火紅的嫁衣襯著肌膚如雪韭山。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天冷溃,我揣著相機(jī)與錄音钱磅,去河邊找鬼。 笑死似枕,一個胖子當(dāng)著我的面吹牛盖淡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凿歼,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼褪迟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了毅往?” 一聲冷哼從身側(cè)響起牵咙,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎攀唯,沒想到半個月后洁桌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡侯嘀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年另凌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戒幔。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡吠谢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诗茎,到底是詐尸還是另有隱情工坊,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站王污,受9級特大地震影響罢吃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昭齐,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一尿招、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阱驾,春花似錦就谜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至租谈,卻和暖如春篮奄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背割去。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工窟却, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呻逆。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓夸赫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親咖城。 傳聞我的和親對象是個殘疾皇子茬腿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容