对于以定投指数的方式理财的朋友,最需要关注的指标便是各个指数的估值,在指数低估时买入,高估时卖出,那如何制作一张估值图来跟踪指数的估值情况呢?本文就从0到1介绍如何用Matplotlib画一张漂亮的指数估值图。

准备数据

首先,准备我们需要的数据,一般来说,经历了一轮牛熊周期的历史估值更具比较意义,所以,这里以上证指数2013年到目前为止的行情数据为例进行演示,同时,采用滚动市盈率为估值指标。数据来源为tushare。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import tushare as ts
from datetime import *
%matplotlib inline
#设置显示中文
plt.rcParams['font.sans-serif'] = 'FangSong'pro = ts.pro_api()index_df = pro.index_dailybasic(ts_code = "000001.SH",start_date = "20130101",end_date = "20200311",fields="trade_date,pe_ttm")
index_df.sort_values(by="trade_date",inplace=True)
x = pd.to_datetime(index_df["trade_date"]).values
y = index_df["pe_ttm"].values

根据得到的数据,可以绘制出上证指数市盈率的走势图:

fig,ax = plt.subplots(figsize=(12,8))
ax.plot(x,y)

接下来便需要根据一定的规则,将估值划分为高估区、正常区以及低估区。

估值区间划分

参照比较常见的划分方法,本文将大于80%分位数的区域视为高估区间,低于20%分位数的区域视为低估区间,位于两者之间的,则为正常区间。下面的代码算出了这几个关键数据点

max = np.max(y)
pe_80 = np.percentile(y,80)
pe_20 = np.percentile(y,20)
min = np.min(y)
now = y[-1]   #为了后续标出当日估值

绘图

根据分割的数据点,就可以进行绘图了,这里主要用到fill_between函数绘制各区域的颜色分割,将高估区域用红色块填充,正常区间用黄色块填充,低估值区域用绿色块填充。同时为了显示效果,将图的上下限分别设置为最大值+1和最小值-1。

fig,ax = plt.subplots(figsize=(12,8))
ax.plot(x,y,linewidth=3)
ax.fill_between(x,min-1,pe_20,facecolor = "#00ff80",alpha=0.2)
ax.fill_between(x,pe_20,pe_80,facecolor = "#ffff4d",alpha=0.2)
ax.fill_between(x,pe_80,max+1,facecolor = "#ff69b4",alpha=0.2)

整个图形的大致轮廓已经出来了,为了更好的显示效果,接下来还需要对图形进行微调。比如:

  • 去掉坐标轴的刻度并将相应字体放大-->ax.tick_params()
  • 去掉图形与坐标轴之间的空白-->ax.margins()
  • 在图中标出当日市盈率-->ax.text()
  • 将图形的方框去掉-->plt.box()
  • 为图标添加标题-->plt.title

所以,在之前代码的基础上,加入下面的调整代码,就可以得到最终的成品图

fig,ax = plt.subplots(figsize=(12,8))
ax.plot(x,y,linewidth=3)
ax.fill_between(x,min-1,pe_20,facecolor = "#00ff80",alpha=0.2)
ax.fill_between(x,pe_20,pe_80,facecolor = "#ffff4d",alpha=0.2)
ax.fill_between(x,pe_80,max+1,facecolor = "#ff69b4",alpha=0.2)
ax.tick_params(axis='both', which='both',length=0)
ax.tick_params(axis='both', which='major', labelsize=16)
ax.margins(0.01,0)
ax.text(0.75,0.9,"市盈率 = {}".format(now),transform=ax.transAxes,fontdict={'size':18})
plt.xticks(rotation=45)
plt.box(False)
plt.title("上证指数估值图",fontdict={'size':24})

函数封装

进一步地,为了将上面的代码复用,可以将所有绘图的代码封装成函数,之后只需要输入相应的指数代码(可以值宽基指数、行业板块指数)和时间范围,即可快速生成一张估值图。

def pe_plot(ts_code = "",name="",period=5):#准备数据now = datetime.now()end_date = str(now.date()).replace("-","")start_date = str(now.year-period)+end_date[4:]index_df = pro.index_dailybasic(ts_code = ts_code,start_date = start_date,end_date = end_date,fields="trade_date,pe_ttm")index_df.sort_values(by="trade_date",inplace=True)x = pd.to_datetime(index_df["trade_date"]).valuesy = index_df["pe_ttm"].values#划定分割范围max = np.max(y)pe_80 = np.percentile(y,80)pe_20 = np.percentile(y,20)min = np.min(y)now = y[-1]#绘图fig,ax = plt.subplots(figsize=(12,8))ax.plot(x,y,linewidth=3)ax.fill_between(x,min-1,pe_20,facecolor = "#00ff80",alpha=0.2)ax.fill_between(x,pe_20,pe_80,facecolor = "#ffff4d",alpha=0.2)ax.fill_between(x,pe_80,max+1,facecolor = "#ff69b4",alpha=0.2)ax.tick_params(axis='both', which='both',length=0)ax.tick_params(axis='both', which='major', labelsize=16)ax.margins(0.01,0)ax.text(0.75,0.9,"市盈率 = {}".format(now),transform=ax.transAxes,fontdict={'size':18})plt.xticks(rotation=45)plt.box(False)plt.title("{}估值图".format(name),fontdict={'size':24})plt.show()

比如,生成一张创业板指数近5年的估值图

pe_plot(ts_code="399006.SZ",name="创业板指",period=5)

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

python免费学习资料以及群交流解答点击即可加入

教你用Python自制一张好看的指数估值图!这招很好用!相关推荐

  1. 小编教你如何打印出一张好看的思维导图

    很多小伙伴喜欢把思维导图笔记打印出来,再进行记忆和背诵.但在打印过程中总是会遭遇以下各类难题: 内容多时打印出来的字太小,整张图很拥挤: 打印出的内容很模糊,有些主题看不清字: 打印出的导图空白太多, ...

  2. 教你用 Python 自制简单版《我的世界》

    <我的世界 Minecraft>大家应该都听说过,但你有没有想过自己写一个这样的游戏呢?太难.太复杂了?也许吧,但是不试一试你怎么知道能不能成呢? 国外有位叫fogleman的开发者就用P ...

  3. python设计拼图小游戏_教你用Python自制拼图小游戏,轻松搞定熊孩子

    摘要:本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyth ...

  4. 教你用Python自制拼图小游戏,轻松搞定熊孩子

    摘要:本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyth ...

  5. python拼图游戏编码_教你用Python自制拼图小游戏,轻松搞定熊孩子

    摘要:本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyth ...

  6. python拼图游戏代码_教你用Python自制拼图小游戏,轻松搞定熊孩子

    摘要:本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyth ...

  7. 教你用Python自制拼图小游戏,一起来玩吧

    摘要: 本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyt ...

  8. python头像教程_教你用 Python 生成一张全体微信好友的头像墙

    |前言 还记得前阵子这篇文章么: 『又来瞎鼓捣』微信群友相隔远?那也一键生成全家福 ,用来给群好友生成一张头像全家福的. 搞完那个之后我就在想,要不写一个微信好友全家福的吧?我微信里有一千多号人,生成 ...

  9. 手把手教你用Python自制拼图小游戏

    摘要:本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyth ...

  10. python设计拼图小游戏_关于python:教你用Python自制拼图小游戏轻松搞定熊孩子

    摘要:本文次要为大家具体介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们能够参考一下. 开发工具 Python版本:3.6.4 相干模块: pygame模块: 以及一些Pyth ...

最新文章

  1. 计算机维护系统Win8PE,u启动windows8PE工具箱
  2. 超级队长VR线下体验店落地上海,让娱乐突破想象
  3. openGL第四讲——像素格式管理
  4. mysql go命令行_Go语言调用mysql.exe和mysqldump命令行导入导出数据库
  5. spring task 定时
  6. VS2008SP1中CDialogEx的使用问题及解决
  7. UI素材模板|新拟态新趋势图标ICON
  8. xmind怎样画流程图_老师是怎样上网课的?
  9. python建立虚拟环境付款_python 创建虚拟环境(virtualenv)
  10. 中国人民公安大学(PPSUC) 网络对抗技术作业一
  11. 帆软高级函数应用之其他函数
  12. 关于Shell脚本执行python代码,出现No such file or directorython: can't open file的问题
  13. ztree的select设置,完笔
  14. 星环大数据使用经验总结
  15. 服务器的mdf文件怎么打开,mdf文件,教您mdf文件怎么打开
  16. 2017计算机一级考试试题题库,2017年计算机一级考试题库试题及答案
  17. DirectX12(D3D12)基础教程(十九)—— 多实例渲染
  18. DNSPOD实现DDNS动态域名解析功能
  19. linux 光标切换快捷键,光标操作快捷键,光标快捷键
  20. 解决小程序canvas高清屏模糊问题

热门文章

  1. mysql用户标签表设计_「用户标签」在数据库设计时应该如何存储?
  2. 数字图像处理基础笔记
  3. VsCode建立工程
  4. ubuntu20.04设置登录壁纸
  5. JAVA跑步计时器app_锻炼计时器app
  6. 在Swing中设置字体的大小
  7. 规范化理论:候选键的求解理论和算法
  8. python数据分析18-21
  9. 第5章 Stata非参数检验
  10. 分位数回归(Quantile Regression)