判断指数是否具有投资价值,我们会用到估值百分位(《估值百分位》),通过当前市盈率或者市净率的位置,可以获得当前指数估值的高低从而获得指数的便宜程度,从而进行投资。
同时投资者的投资情绪,前面也介绍过,可以通过全市场成交量进行量化(《A股全市场成交量计算》),投资情绪也是一个指导投资很重要的指标,当市场处于大熊市下跌到低点时,成交量往往很小,相反,当市场处于大牛市,市场持续上涨,成交量会越来越大。
那估值百分位和成交量两者之间有没有什么关系,如果有,是否可以用来进行量化投资,下面就来分析下这个过程。
首先来看看全市场估值和全市场成交量的关系。下面是全市场从2000年到现在的估值走势。
通过估值走势可以计算出估值百分位的变化,下面是截取2010年以来的估值数据计算出来的估值百分位情况。
可以看出在2012年年底到2013年初和2018年年底到2019年初两个时间段全市场是处于非常低估的阶段,而在2015年估值达到了历史高位。但这和市场的成交量有没有什么联系呢?先看看下面的全市场成交量从2010年以来的数据。
从时间上来看也能明显的看出在2012年年底到2013年初和2018年年底到2019年初两个时间段全市场成交量是很低的,同时在2015年估值达到了历史高位的时候成交量非常高,那有没有办法把两者的关系结合在一起来看呢?下面就来介绍全市场联合指标,它就是结合了估值百分位和成交量的一个非常重要的投资指标。
接下来把全市场估值百分位作为纵坐标,而全市场成交量作为横坐标,两者画成散点图如下:
图上有几个明显的特征
1)区域特征
估值百分位低的情况下成交量也很低,所形成的点集聚在左下角,反过来,当估值百分位高的时候成交量也高,点分布在右上角。而中间的过度区域(图中偏左部分)则是估值处在中间区域同时成交量也处在中间区域。
看起来左下角点的密度是最高的,逐渐朝右上方扩散的同时密度在逐步变小,这个过程说明全市场处在中等偏低估的区间是最多的,高估区间是非常少的。也说明了A股是一个熊长牛短的过程。
2)分布特征
图中右下角的整个区域是没有任何数据点的,说明在估值偏低和估值低估区域是不可能有大成交量的,也说明估值的上升是因为成交量放大导致指数上涨所引起的。左上角的的区域也基本没有数据分布,也同样说明在高估值的氛围下成交量很难出现低成交量。
可以拟合整个分布得到上面图中一条红色的曲线,估值百分位和成交量是分布在它的左右两边。
通过上面的分析其实就可以得到一个很重要的信息,越靠近左下角的位置市场越低估市场情绪越低,这个时候往往是很好的买入建仓机会,而越靠近右上角市场越高估市场情绪越高,这种情况下是很危险的区间,尽量卖出保持空仓状态。
所以从左下角到右上角是一个买入,持有,然后逐渐过度到卖出的过程,通过量化目前所处的位置就能起到锚定投资的作用。所以可以结合下面的数据图形来分析当前的市场情况进行投资,这里把这种方式称为联合投资指标。
图中红色的点就是当前市场所处的位置,通过这个指标我们很清楚的知道目前市场处于哪个阶段,然后再结合各个指数的估值来进行投资。
源码
#源码中用到的indexType文件下的指数数据.csv请参看《基于Python的指数基金量化投资——指数包含的个股数据获取》
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import math as math
import baostock as bs
time_end = '2020-12-23'
print(time_end)
# 登陆系统
lg = bs.login()
# 获取货币供应量
rs = bs.query_money_supply_data_month(start_date="2010-09", end_date=time_end[0:len(time_end)-3])
# 打印结果集
data_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
# 结果集输出到csv文件
result.to_csv("./exportfile/transactionOfMarket/m2.csv", encoding="gbk", index=False)
name_index_list = ['sh.000001','sz.399107']
for i in range(len(name_index_list)):
rs = bs.query_history_k_data_plus(name_index