前面介绍了指数的市盈率和市净率的计算过程以及怎么通过市盈率和市净率获得估值信息,从而进行相应的投资投资。
这次就来和大家聊聊全市场的市盈率和市净率计算,有了指数的估值数据,为什么还要看全市场的估值信息呢?先看看下面这张图。
从整体来看,全市场估值和沪深300、上证红利、中证消费和中证医药的趋势基本是同步的,但在某些局部区域也会有细微的差别,像2018年4月左右,全市场估值较低,但中证消费的估值较高,2021年3月左右,全市场估值较低,但中证医药和中证消费的估值却非常高。
所以全市场估值会起到一个参考的作用,可以结合全市场估值和指数的估值来进行绝对估值和相对估值,也就是通过指数本身的估值来判断指数的便宜程度,同时通过全市场估值来判断指数的相对位置。
可以结合下面的表格进行投资。
所以全市场的估值计算就变得非常重要,下面就来看看怎么计算全市场的市盈率和市净率。
大A股目前有4千多家上市公司,如果把全市场看作一个指数的话,通过前面文章《基于Python的指数基金量化投资 - 指数的市盈率和市净率计算》介绍的计算方法是可以算出全市场对应的估值的,但这样的话要计算的数据就非常多,速度会很慢。这里就改变一下计算方法。
我们发现全市场有4千多家上市公司,数据空间相对来说是足够大的,所以这里就采用取中位数的方式来代替全市场的估值数据,这样计算的话速度快,同时结果具有代表性。下面先简单介绍下怎么进行中位数计算。
这样计算的话就简单很多,按照三个步骤就能获得全市场市盈率:
1、 首先获取所有个股的市盈率数据;
2、其次对市盈率数据进行排序;
3、最后取出中间位置上的数据就是全市场市盈率;
下面来看看具体的代码实现:
import pandas as pd
import numpy as np
stock_name_code = pd.read_csv('./importfile/code2name.csv')
# 所有个股名称和证券号
cnt = 0
array_pe_history_tmp =np.zeros([stock_name_code.shape[0], 1])
for i in range(stock_name_code.shape[0]):
stock_name = stock_name_code.loc[i]['code']
stock_file_name = stock_name + '.csv'
stock_info = pd.read_csv('C:/Program Files(x86)/Python/prjs/exportfile/stockDataAll/' + stock_file_name)
array_pe_history_tmp[cnt] = stock_info['peTTM'].values[-1]
cnt = cnt + 1
# 加载所有个股的市盈率
sorted_tmp_pe =np.array(sorted(array_pe_history_tmp[0:cnt - 1]))
# 对所有个股市盈率进行排序
global_pe =sorted_tmp_pe[round(len(sorted_tmp_pe)/2)]
# 取出中间位置的市盈率作为全市场市盈率估值
print("全市场pe= " + str(global_pe))
同样采用和市盈率一样的计算方式可以获得全市场市净率,只是把个股的市盈率数据换成市净率即可。
import pandas as pd
import numpy as np
stock_name_code =pd.read_csv('./importfile/code2name.csv')
# 所有个股名称和证券号
cnt = 0
array_pb_history_tmp =np.zeros([stock_name_code.shape[0], 1])
for i in range(stock_name_code.shape[0]):
stock_name = stock_name_code.loc[i]['code']
stock_file_name = stock_name + '.csv'
stock_info = pd.read_csv('C:/Program Files(x86)/Python/prjs/exportfile/stockDataAll/' + stock_file_name)
array_pb_history_tmp[cnt] = stock_info['pbMRQ'].values[-1]
cnt = cnt + 1
# 加载所有个股的市盈率
sorted_tmp_pb =np.array(sorted(array_pb_history_tmp[0:cnt - 1]))
# 对所有个股市盈率进行排序
global_pb =sorted_tmp_pb[round(len(sorted_tmp_pb)/2)]
# 取出中间位置的市盈率作为全市场市盈率估值
print("全市场pb= " + str(global_pb))
代码中使用到的个股数据大家可以参看《基于Python的指数基金量化投资 - 股票数据源baostock》
课程参考:网易云课堂 基于Python的量化指数基金投资