楼主: JoinQuant
3971 1

[源码分享] 多图解读三大股票指数 沪深300、中证500、中证1000有何细节差异 [推广有奖]

  • 0关注
  • 23粉丝

等待验证会员

博士生

18%

还不是VIP/贵宾

-

威望
0
论坛币
105 个
通用积分
18.1313
学术水平
12 点
热心指数
9 点
信用等级
9 点
经验
3401 点
帖子
97
精华
0
在线时间
134 小时
注册时间
2015-9-9
最后登录
2020-3-18

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

指数分类的标准有很多,比如说按市场分、按投资标的分、按指数代表性分。从代表性来分类的话,一般可以分为有三类:综合指数、宽基指数、窄基指数。

综合指数是指成分股包含所有上市的股票,以反映全市场的状况,最典型的就是我们所熟知的上证指数、深证指数,其是观察市场整体走势的一个重要指标。我们国内的中证指数公司,就是专门构建各类指数,为投资者提供新的分析工具和投资标的。

1.png

今天的文章就集中在对于沪深 300、中证 500、中证 1000指数的量化解读方面,既然是量化,那么可视化必须是其中很重要一个组成部分,我们的文章会提供数据调取和可视化代码,供各位更好理解指数构成以及特性。

一、综合走势与波动率

>>> 沪深300指数

它以规模和流动性作为选样的两个根本标准,并赋予流动性更大的权重,符合该指数定位于交易指数的特点。300 指数反映的是流动性强和规模大的代表性股票的股价的综合变动,可以给投资者提供权威的投资方向,也便于投资者进行跟踪和进行投资组合,保证了指数的稳定性、代表性和可操作性。


>>> 中证500指数

该指数又称中证小盘 500 指数(CSI Smallcap 500 index),简称中证 500(CSI 500),上海行情代码为 000905,深圳行情代码为 399905。中证 500 指数有 3 个构建步骤。

步骤1. 样本空间内股票扣除沪深300指数样本股即最近一年日均总市值排名前300名的股票;

步骤2. 将步骤1中剩余股票按照最近一年(新股为上市以来)的日均成交金额由高到低排名,剔除排名后20%的股票;

步骤3. 将步骤2中剩余股票按照日均总市值由高到低进行排名,选取排名在前500名的股票作为中证500指数样本股。


>>> 中证1000指数

根据金融界网站提供的资料,中证 1000 指数编制方法采用较为普遍的自由流通市值加权法,指数成分股从全部A股中剔除沪深 300、中证 500 指数成分股后,结合流动性标准选取过去一年日均总市值最大的 1000 只股票,综合反映中国 A 股市场中小市值公司的股票价格表现,是中证核心市值指数体系的重要组成部分。

2.jpg

我们通过聚宽研究平台,首先构建一个 list 名单“index_list”,然后通过 get_price 函数调取数据,然后将数据处理成净值,绘制出来,得到以下效果:

3.png

我们定日期 2019-04-18 为截止日期,向前推 1000 天,发现最近 4 年来,表现最差的其实是中证 1000 指数,说明了在市场长期价值筛选中,小盘股出现了显著的估值下滑和资金流出。而之前大家对于小盘股的印象则是高波动率和高回报率。

4.png


上图就是三大指数的波动率情况,还是同一个时间段,我们使用移动窗口标准差,再除以该窗口期内的价格均值,去价格量纲得到这个曲线,通过研究平台文件我们输出波动率具体值为:

  1. 000852.XSHG 0.034911

  2. 000905.XSHG 0.030969

  3. 000300.XSHG 0.023826
复制代码

这表示 000852.XSHG 中证 1000 指数在全段时间的波动率是最高的,通过蓝线也可以清晰看出。而沪深 300 由于大盘股较多,波动率偏低,中证 500 居中。


这三大指数之间有何种相关关系呢?实际上从走势看,它们毕竟都属于中国股票市场,应该非常相关,我们抱着这个疑问,绘制了全段价格相关性和全段波动率相关性,试图寻找答案。

5.png

6.png

绘制相关性矩阵需要导入 seaborn 包,其 heatmap 函数就是专门用于热力标色的矩阵图绘制的。分析结果显示,三大指数的走势相关性并不十分高,特别是沪深 300 和中证 1000 差异最大。而波动率相关性分析则体现出更高的结果,说明在出现较大波动时刻,指数的共振还是很明显的,这表现出较高的系统性风险。

二、指数成分股市值特性分析

我们进入所有聚宽的老用户们最熟悉的 get_fundamentals 函数,通过调取 valuation.code、valuation.market_cap 这两项数值,获得股票代码和市值数据,并打印前5行,获得以下效果:

7.png

然后我们分别绘制了沪深 300、中证 500、中证 1000 的市值分布,得到以下效果:

8.png

9.png

10.png

我们得到一个直观上很显著的统计特性——中证 1000 的分布最为均匀,首尾差异较小,沪深 300 的市值分布很不均匀,有部分股票市值极大。

通过绘制直方图,可以看到指数成分股(以沪深 300 为例)的市值分布情况:

11.png

这里显示出仅有少量样本分布在市值极大的区间,而大部分有统计意义的样本集中在市值 1000 亿元左右的区间。这样的数据分布形态很容易扭曲均值的表达能力,所以针对这类样本,我们应该多用中位数而非均值表达整体特征。

接下来我们使用 4 个简单的统计指标完成对沪深 300 为例的指数的特性描述,分别是:均值、中位数、标准差、极差。

  1. # 均值market_cap_mean_50 = mean(list(df_50.market_cap))

  2. # 中位数market_cap_median_50 = median(list(df_50.market_cap))

  3. # 标准差market_cap_std_50 = std(list(df_50.market_cap))

  4. # 极差market_cap_ptp_50 = ptp(list(df_50.market_cap))
复制代码

经过计算得到:沪深300样本的成分股市值

均值:979.8816889999999

中位数:381.9389

标准差:2070.650186717265

极差:18721.7925

依然是围绕市值,我们分引入箱体图Boxplot,它是一种表示数据分布的方法,一个基本的箱体图从上到下分别表示最大值,上四分位,均值,下四分位,最小值。有的箱体图中还会加入异常值等。

箱体图有以下几个优点:

1. 可以直观明了地识别数据中的异常值

2. 利用箱体图可以判断数据的偏态和尾重

3. 利用箱体图可以比较不同批次的数据形状




通过python的pandas包提供的boxplot()函数即可绘制得到效果。

12.png

通过分析三大指数的箱体图,我们看到沪深 300 的样本离群情况最为严重,箱体图主体部分(25%分位到75%分位)被离群点严重压缩。中证 500 表现较好,离群点并不很多。中证 1000 也包含了部分市值较大的股票,主要原因是从 100 亿元到 300 亿元的某些股票可能由于市值上升过快,没能及时被编制更新到中证 500 指数中。

了解一个指数的行业构成也非常关键,我们可以看到其成分股是否在行业方面有过度集中。通过聚宽提供的 get_industry 函数可以获得行业数据。

具体代码为:

  1. industry = get_industry(list(df_50.code))

  2. stock_dict={}

  3. for stock in industry.keys():

  4.     try:

  5.         # 取到每个股票的【申万一级】行业名称

  6.         stock_dict[stock] = industry[stock]['sw_l1']['industry_name']

  7.     except:

  8.         pass
复制代码

然后我们导入 import matplotlib.pyplot as plt,通过其 pie 函数,可以实现对饼图的绘制。

代码如下:

  1. tt = DFindustry.groupby(['industry_name']).size()

  2. tt1 = list(tt.index.values)

  3. tt2 = list(tt.values)

  4. labels = tt1

  5. fracs = tt2

  6. plt.figure(figsize=(10,8))

  7. plt.axes(aspect=1)  # set this , Figure is round, otherwise it is an ellipse

  8. plt.pie(x=fracs, labels=labels, explode=None,autopct='%3.1f %%',shadow=True)

  9. plt.title('成分股行业分布饼图')

  10. plt.show()
复制代码

13.png

上图显示的是中证1000指数的行业分布,我们还辅助计算了分布的均匀性,得到结论:

行业数量:28

平均个股数量:35.714285714285715

个股数量标准差:23.84452189685916

个股分布变异系数:0.6676466131120564

结论显示中证 1000 指数在各行业分布均匀,平均每个行业 35 只个股。如果到了沪深 300 领域,这个分布情况发生了如下变化:

14.png

可以看到,银行和非银金融占据了非常大的比重,资产较重的交通运输、化工、有色金属和房地产也有较大提升。说明了沪深 300 指数对于金融行业的风险暴露比较大。这里仅展示了上市公司家数分布,如果按照市值展示,情况会更加显著。

我们还可以深入到指数内部去挖掘一个因子——两两相关系数平均值,并通过 for 循环,实现对于每个日期截面的该因子值计算。

程序设计方面,首先通过 get_trade_days 获得一个日期序列,用于循环。然后通过 get_price 提取 20 日价格 DataFrame,再通过 corr().mean().mean() 实现相关系数计算、每个标的相关系数、均值的均值,获得每个日期截面一个值。我们将指数净值化处理,和这个指标绘制在一起,可以看到如图效果:

15.png

指数成分股两两相关性均值是一个风险指标,当该值达到较高区间时,说明成分股同向波动显著,一般是市场极度活跃的区间。统计绘图和计算,我们得到:

中证1000:0.36256388612173046

中证500:0.36003023746871143

沪深300:0.3196961076040989

说明指数内部,随着股票数量的增加特别是高 beta 股票的增加,这种风险更加加剧。本次我们仅展示部分简单的统计指标计算,核心都是通过图形化方式,解读指数内部特征,希望读者们也能补充思路,进一步挖掘指数特性,在深刻熟悉指数构成的基础上,即可熟悉alpha因子的挖掘。




点击【阅读原文】,查看完整代码~




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


沙发
東方红 发表于 2019-5-2 22:22:09 |只看作者 |坛友微信交流群
谢谢分享!相关创意挺好!

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-25 14:36