指数历史估值源码分享,寻找最佳底部机会!

本文通过具体案例演示了如何利用Python计算指数的市盈率(PE)和市净率(PB),并进一步计算历史百分位,以此判断指数的低估或高估状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家好,我是小一

震惊了,兄弟们

上一篇文章我不是发起了一个投票嘛,结果今天去看的时候,结果震惊到我了。先上图

cd244ec5643c7ef375f83d87415704ca.png

下面那2票,有1票是我投的1e6cdee08345aad6fbdeb61bd939f501.png

既然大家这么热情,那我也不能拖后腿,加班出了这篇源码复现的文章。

048c9637c10d9690723823963a00f605.jpeg

另外,在指数估值的时候各大平台的算法都不一样,这个不知道大家是否感兴趣

如果感兴趣的人比较多,后面我也整理一下把相应的伪代码分享出来👇

下面开始今天的主要内容

先来看下昨天文章提到的几个概念,也是指数估值需要用到的一些核心点:

  • 市盈率(PE):指数市盈率衡量了指数价格与收益的关系,一般来说,市盈率越低,指数越容易被低估,未来的成长性越高。

  • 市净率(PB):指数市净率衡量了指数价格与净资产的关系,一般来说,市净率越低,投资价值越高。

  • PE(PB)百分位:判断当前的PE(PB)是否处于低位,可以用估值历史百分位,来分析指数估值在历史数据中所处的百分位。一般来说,百分位数值越小,指数的估值越低。

所以,计算指数估值最主要的问题就是能够获取到指数的历史PE/PB数据,然后计算出当前数值在历史中所处的百分位

最后,根据相关估值算法确定当前的低估/高估状态,并在低估时买入,高估时卖出

下面就来看一下我是怎么计算的,以及相关源码

计算思路及源码

获取源码文件请直接在后台回复 估值计算

今天的代码👉科技含量比较高,所以仅限前20位读者免费领取,先到先得吧。

对了,今天的源码是在聚宽平台上运行的,因为聚宽的在线环境挺好用的,所以我就没有在本地测试。

建议大家认真考虑一下,别浪费名额。要是代码给你了,因为你在本地运行而导致出错的,我也没有太多的时间专门去一个个教,反而有些浪费

另外,源代码是我在公开的代码和官方API的基础做了个人的修改和优化,也算是站在巨人的肩膀上才有的。

下面开始具体的步骤演示

>1、导入相应的包
# 导入相应的包
from jqdata import *
import time
import datetime
import pandas as pd
from six import BytesIO
>2、获取PE/PB数据

get_valuation方法是官方给的一个接口,可以获取多个标的在指定交易日范围内的市值表数据

其中,市值表字段比较多,就包括我们需要的:总市值、市盈率、市净率

对应的计算PE、PB数据的核心代码如下:

# 计算PE、PB
stocks = get_index_stocks(index_code, date)
df_PE_PB = get_valuation(stocks, start_date=date, end_date=date, fields=['pe_ratio','pb_ratio', 'market_cap'])
df_PE_PB['pe_value'] = df_PE_PB['market_cap']/df_PE_PB['pe_ratio']
df_PE_PB['pb_value'] = df_PE_PB['market_cap']/df_PE_PB['pb_ratio']

pe_value = df_PE_PB.market_cap.sum()/df_PE_PB.pe_value.sum()
pb_value = df_PE_PB.market_cap.sum()/df_PE_PB.pb_value.sum()
>3、计算百分位

在计算出PE和PB的历史数值之后,就可以进一步的算出近5年的历史百分位、近10年的历史百分位,以及全部百分位。

一般10年都会有一个完整的牛熊轮回,所以大多数平台这里都会取近10年的历史百分位

计算历史百分位的核心代码如下:

# 计算历史百分位
df_PE_PB2[tag+'_历史最大'] = df_PE_PB2[tag].max()
df_PE_PB2[tag+'_历史最小'] = df_PE_PB2[tag].min()
df_PE_PB2[tag+'_5年估值%'] = df_PE_PB2[tag].rolling(5*244).apply(lambda x: H_V_H(x), raw=True)
df_PE_PB2[tag+'_10年估值%'] = df_PE_PB2[tag].rolling(10*244).apply(lambda x: H_V_H(x), raw=True)
# 历史估值
df_PE_PB2[tag+'估值'] = df_PE_PB2[tag+'_10年估值%'].apply(lambda x: get_valuation_status(x))
>4、示例演示

下面我们以上一节文中:历史百分位1.49%,超级低估 提到的中证医疗为例,进行演示

代码运行之后,获取到的数据如下:

0015f767a440fccbb5e5b6973e13d55b.png

中证医疗指数的数据是从2014-10-31开始,一直到2022-11-04,不足10年,所以百分位用的是历史所有百分位

对应的PE、PB数据如下:

edcb6622ac6f4dcaf90d4bcfd2045272.jpeg

d99e72d51132c82b53d8a4560140244e.png

根据我自己的指数评估标准,为了展示方便,我进行了如下设置:

  • 超低估用红色上三角表示

  • 低估用黑色圆圈表示

  • 高估用黄色圆圈表示

  • 超高估用绿色下三角表示

最终绘制出来的图形如下:

bea0cb42c7741094e4b6cd94904855c8.png

👆这个图可以放大看,绝对有收获

指数刚开始的前三年,因为对比数据不足,所以不是很准确。

但是当经过了2015-2106年的牛熊之后,在后面2019年的表现可谓是相当出色

接下来是2022年,到底会怎样走,大家可以期待一下。

我相信:数据会带给我惊喜


OK,今天就到这,文章的最后,需要再做一个免责声明:上面所有的内容也只是我的个人推测,提到的所有基金/股票代码只是为了演示,仅供参考,不构成投资建议,投资有风险,入市需谨慎。

👆获取源码请在后台回复估值计算

最后,给大家推荐几篇我以前写的文章,可以简单了解一下量化原理以及一些常见的量化策略:

如何建立自己的量化模型?

基金定投真的能赚钱吗?

国庆节的赚钱效应...

支付宝智能定投策略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值