投资指数基金,最简单也最实用的策略就是便宜的时候买入,昂贵的时候卖出,那怎么判断目前指数基金是否便宜?就会通过估值来进行判断,估值包含两个指标,一个是市盈率,另外一个是市净率,通过计算市盈率或者市净率的历史百分位就可以得到指数基金的估值情况,从而根据具体的估值点位来进行投资。
像宽基指数,沪深300、中证500、上证50、中证100等都用市盈率进行估值,而像中证银行和证券公司就要用到市净率进行估值,因为对于金融业来说,货币反而是产品,通过市盈率进行估值就会失真,所以需要用市净率。
下面通过创业板指的市盈率先来看看到底怎么用市盈率进行估值。
其中蓝线是从2010年以来创业板指的市盈率曲线,红线是当前市盈率的位置,百分数88.63%表示当前市盈率的百分位,也就是说当前市盈率比过去88.63%的时间要高。大家可以结合下面表格中的百分位确定估值区间的高低来进行投资的操作,通过表格可以得到创业板指处于高估区间,可以大份额卖出。
同样像中证银行也是一样的效果,只不过采用的估值指标是市净率。
从上面的图中可以看出中证银行估值百分位是13.49%,处于低估区间,可以采取大份额定投。
下面具体来看看代码怎么实现。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
view_name = 'g_cyb'
index_name = '创业板指- '
index_info = pd.read_csv('./importfile/indexSeries/indexValuation/g/'+ view_name + '.csv')
# 加载创业板市盈率数据
index_data_pe =index_info['pe'].values[1:len(index_info['pe']):1]
index_data_pb =index_info['pb'].values[1:len(index_info['pb']):1]
index_data_roe = index_info['roe'].values[1:len(index_info['roe']):1]
# 获取指数的市盈率、市净率和ROE数据
val_loc = np.where(index_data_pe
val_percentage = len(val_loc[0]) /(len(index_data_pe))
# 计算历史百分位
size_title = 28
size_label = 23
size_text = 35
size_line = 3
size_rotation = 20
plt_gap = 11
plt.rcParams["axes.grid"] = True
plt.rcParams['font.sans-serif'] =['Microsoft YaHei']
plt.rcParams['axes.unicode_minus']=False
plt.rcParams["grid.linestyle"] =(3, 5)
# 画图的参数设置
fig = plt.figure(1)
ax1 = fig.add_subplot(1,1,1)
ax1.plot(index_data_pe,label='',color='cornflowerblue',linewidth='2',linestyle='-')
plt.plot([len(index_data_pe),0],[index_data_pe[-1],index_data_pe[-1]],color='tomato',linewidth=size_line)
font = {'size': size_text, 'color':'tomato', 'weight': 'bold'}
plt.text(len(index_data_pe),index_data_pe[-1],str("{:.2f}".format(100*val_percentage)+'%'),fontdict=font)
index_ticks =index_info['date'].values[1:len(index_info['date']):1]
index_x =range(len(index_ticks),0,-round(len(index_ticks)/plt_gap))
index_xticks_tmp = index_ticks.tolist()
index_xticks =index_xticks_tmp[len(index_xticks_tmp):0:-round(len(index_ticks)/plt_gap)]
ax1.set_xticks(index_x)
ax1.set_xticklabels(index_xticks,rotation=size_rotation)
plt.tick_params(labelsize=size_label)
plt.title(index_name + '市盈率', size=size_title)
val_loc = np.where(index_data_pb
val_percentage = len(val_loc[0]) /(len(index_data_pb))
plt.rcParams["axes.grid"] = True
plt.rcParams['font.sans-serif'] =['Microsoft YaHei']
plt.rcParams['axes.unicode_minus']=False
plt.rcParams["grid.linestyle"] =(3, 5)
fig = plt.figure(2)
ax1 = fig.add_subplot(1,1,1)
ax1.plot(index_data_pb,label='',color='cornflowerblue',linewidth='2',linestyle='-')
plt.plot([len(index_data_pb),0],[index_data_pb[-1],index_data_pb[-1]],color='tomato',linewidth=size_line)
font = {'size': size_text, 'color':'tomato', 'weight': 'black'}
plt.text(len(index_data_pb),index_data_pb[-1],str("{:.2f}".format(100*val_percentage)+'%'),fontdict=font)
index_ticks =index_info['date'].values[1:len(index_info['date']):1]
index_x =range(len(index_ticks),0,-round(len(index_ticks)/plt_gap))
index_xticks_tmp = index_ticks.tolist()
index_xticks =index_xticks_tmp[len(index_xticks_tmp):0:-round(len(index_ticks)/plt_gap)]
ax1.set_xticks(index_x)
ax1.set_xticklabels(index_xticks,rotation=size_rotation)
plt.tick_params(labelsize=size_label)
plt.title(index_name + '市净率', size=size_title)
plt.show()
如需代码里面用到的指数估值数据或者有疑问,大家可以留言,欢迎拍砖^_^
课程参考:网易云课堂 基于Python的量化指数基金投资