对于股票来说,PE = 市值 / 利润即可,但对于包含多个股票的指数来说,其平均PE如何计算更科学呢?所谓科学指的是反应这个指数的合理估值水平。
采用了5种方式进行了计算,上证50在2016年7月15日的计算结果:
pe1 = 18.6416 个股PE直接算术平均:容易受极值影响,极高pe或者极低pe容易带偏指数的平均值,不好。
pe2 = 9.67004307116 所有股票中总股本的总市值/所有股票产出的税后利润: 容易受体量大的影响,如工商银行市值和利润对平均值影响就大,说白了自带权重,个大的公司股票影响大。
pe3 = 7.70961743489 所有股票中流通股本的总市值/这些股票产出的税后利润:与pe2情况类似,只不过用的流通股而不是总股本,其实这个比PE2要更好点。
pe4 = 12.2162122921 屏蔽市值影响,等权重,亏损的公司股票市盈率统一按0算。
pe5 = 11.4832395546 等权重,亏损的公司其pe不计入平均值。
因此,对于大指数,如上证指数,算整体PE用等权更能合理的反应市场估值水平。对于某些行业指数如养老指数,里面既包括了大块头的保险公司,也包含小公司,体量差别上百倍,等权的意义就更明显了。
附验证代码:
# -- coding: utf-8 --
"""
验证指数平均市盈率
@author forestgumpgg(雪球ID、聚宽ID),欢迎关注,共同讨论量化分析之道
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import bisect
code = '000016.XSHG'#'000016.XSHG' #'000300.XSHG' #399006.XSHE
date = '2016-07-15'#pd.datetime.today()
stocks = get_index_stocks(code, date)
q = query(valuation).filter(valuation.code.in_(stocks))
df = get_fundamentals(q, date)
#计算方法1:将个股的市盈率简单地进行算术平均,计算公式为:平均市盈率=所有股票市盈率之和/股票个数
if len(df)>0:
pe1 = df['pe_ratio'].values.sum() / len(df)
else:
pe1 = float('NaN')
print "pe1 = ", pe1
#计算方法2:理论平均市盈率=该类股票中总股本的总市值/这些股票产出的税后利润
sum_p = 0
sum_e = 0
for i in range(0, len(df)):
sum_p = sum_p + df['market_cap'][i]
sum_e = sum_e + df['market_cap'][i] / df['pe_ratio'][i]
if sum_e > 0:
pe2 = sum_p / sum_e
else:
pe2 = float('NaN')
print 'pe2 = ', pe2
#计算方法3:理论平均市盈率=该类股票中流通股本的总市值/这些股票产出的税后利润
sum_p = 0
sum_e = 0
for i in range(0, len(df)):
sum_p = sum_p + df['circulating_market_cap'][i]
sum_e = sum_e + df['market_cap'][i] / df['pe_ratio'][i]
if sum_e > 0:
pe3 = sum_p / sum_e
else:
pe3 = float('NaN')
print 'pe3 = ', pe3
#计算方法4:@scc https://www.joinquant.com/post/1058?replyId=11942
if len(df)>0:
pe4 = len(df)/sum([1/p if p>0 else 0 for p in df.pe_ratio])
else:
pe4 = float('NaN')
print "pe4 = ", pe4
#计算方法5:等权重,每支股票市值为1,剔除了PE为负的股票
pe_plus_num = 0
sum_e = 0
for i in range(0, len(df)):
if df['pe_ratio'][i] >= 0 :
pe_plus_num = pe_plus_num + 1
sum_e = sum_e + 1.0 / df['pe_ratio'][i]
pe5 = pe_plus_num /sum_e
print "pe5 = ", pe5
计算结果:
pe1 = 18.6416
pe2 = 9.67004307116
pe3 = 7.70961743489
pe4 = 12.2162122921
pe5 = 11.4832395546