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

教你用Python自制一张好看的指数估值图!这招很好用!对于以定投指数的方式理财的朋友 最需要关注的指标便是各个指数的估值 在指数低估时买入 高估时卖出 那如何制作一张估值图来跟踪指数的估值情况呢 本文就从 0 到 1 介绍如何用 Matplotlib 画一张漂亮的指数估值图 准备数据首先 准备我们需要的数据 一般来说 经历了一轮牛熊周期的历史估值更具比较意义 所以 这里以上证指数 2013 年到目前为止的行情数据为例进行演示 同时 采用滚动市盈率为估值指标 数据来源为 tushare importpandas

对于以定投指数的方式理财的朋友,最需要关注的指标便是各个指数的估值,在指数低估时买入,高估时卖出,那如何制作一张估值图来跟踪指数的估值情况呢?本文就从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 = "", end_date = "",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) 

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

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

估值区间划分

参照比较常见的划分方法,本文将大于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) 

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

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

  • 去掉坐标轴的刻度并将相应字体放大–>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}) 

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

函数封装

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

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"]).values y = 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=".SZ",name="创业板指",period=5)

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

 

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

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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/234027.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JQuery时间戳与时间字符串的转换「建议收藏」

    JQuery时间戳与时间字符串的转换「建议收藏」JS时间戳转字符串:varformatlistdate=function(time){vardate=newDate(time);vary=date.getFullYear();varm=date.getMonth()+1;vard=date.getDate();varhour=date.get…

    2022年5月23日
    72
  • idea打包maven项目jar_tomcat部署maven项目

    idea打包maven项目jar_tomcat部署maven项目今天遇到一个需求,客户要求项目用maven管理,真是操碎了心,还好最终解决了,也在这里分享一下心得。首先选中要buide成maven的包——>右键——>addframeworksupport…,然后勾选maven即可;…

    2022年9月28日
    5
  • win10多合一原版系统_win10简体中文64位16299.15多合一版本

    win10多合一原版系统_win10简体中文64位16299.15多合一版本镜像有点大估计压缩后也会超过4G,所以不会上传多合一版本介绍:包含以下版本windows10homewindows10homesinglelanguagewindows10homechinawindows10prowindows10educationwindows10enterprisewindows10s注意全部是64位的哈!!微云:http://url.cn/…

    2022年6月17日
    56
  • myeclipse8.5注册码在线生成_MyEclipse激活码

    myeclipse8.5注册码在线生成_MyEclipse激活码主要是myeclipse8.0的注册码,估计7.5的也能用,注册码都是到2014年12月过期,附送注册机Subscriber:zxSubscriptionCode:mLR8ZO-655444-6967865456424254Subscriber:huahuaSubscriptionCode:uLR8ZO-655444-69678657696224504Subscriber:yayaSubsc

    2022年9月30日
    2
  • 软件架构模式和设计模式的区别_几种常见软件架构

    软件架构模式和设计模式的区别_几种常见软件架构什么是架构?  软件体系结构通常被称为架构,指可以预制和可重构的软件框架结构。架构尚处在发展期,对于其定义,学术界尚未形成一个统一的意见,而不同角度的视点也会造成软件体系结构的不同理解,以下是一些主流的标准观点。ANSI/IEEE610.12-1990软件工程标准词汇对于体系结构定义是:“体系架构是以构件、构件之间的关系、构件与环境之间的关系为内容的某一系统的基本组织结构以及知道上

    2022年10月18日
    3
  • java使用键盘输入_java中键盘输入代码

    java使用键盘输入_java中键盘输入代码展开全部程序开发过程中,32313133353236313431303231363533e78988e69d8331333365633962需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代表遇到这种情况我们就束手无策,请你看以下三种解决方法吧:以下将列出几种方法:方法一:…

    2022年9月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号