這里就會有個問題,指數(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ù)基金投資