用plotly搭建自己的A股指数估值监控系统

2020-04-22  本文已影响0人  吴玉海

前段时间看到有朋友在网上分享自己的指数估值监控程序,就是将整个大盘估值的历史数据画成表格,然后定时发往订阅者的邮箱。感觉确实对整个大盘估值还蛮有用的,只不过必须依赖某一个量化数据平台来实现,后期缺乏一定的可扩展性,所以就想脱离平台用tushare的数据做一个类似的功能。

话不多说,直接开干。

首先是选择做图表的工具,以前我用的都是Matplotlib进行表格的绘制,这次我发现一个更强大的绘图库——plotly。
plotly是一个可交互,基于浏览器的绘图库,主打功能是绘制在线可交互的图表,使用plotly绘制图表返回的是一个可以交互操作的网页,这样可以更方便的分享给其他人,另外这些图表还会保存在自己的云端空间中,方便以后再进行查看。

pip install plotly

通过tushare获得指数数据,一般是利用PE来进行指数估值,这里就只获取PE数据就好

df = pro.index_dailybasic(ts_code='000001.SH',start_date='2010-06-10',end_date='2020-01-01',files=['pe_ttm','pe'])

为了画图标准,日期我们要做一些处理:

def formatDate(arrLike):  #用来格式化日期的函数
    date_time = datetime.datetime.strptime(arrLike['trade_date'],'%Y%m%d')
    return date_time
df['datetime'] = df.apply(formatDate , axis = 1)

一开始画出来就是这样


image

但这样只能看个大概,为了能更定量分析当前指数估值,我们接下来需要计算并标出整个数据的历史百分位:

_df = pd.DataFrame()
#计算历史百分位
_df["pe"] = df["pe"]
_df = _df.iloc[-n * 244:]  # n是想要计算的年数,244个交易日差不多是一年
p_high = [_df["pe"].quantile(i / 10.0) for i in [3, 5, 7]] 
for p_h, i in zip(p_high, [3, 5, 7]):
    df[str(i / 10 * 100)+'%'] = p_h

画图前先配置个人账号

import plotly 
plotly.tools.set_credentials_file(username='xxxxx', api_key='xxxxxx')

然后绘制图片


import plotly.plotly as py
import plotly.graph_objs as go


# Create a trace
trace = go.Scatter(
    x = df['datetime'],
    y = df['pe'],
    name = 'pe',
    line = dict(width = 1)
)

trace1 = go.Scatter(
    x = df['datetime'],
    y = df['30.0%'],
    line = dict(
        color = ('rgb(205, 12, 24)'), #线段颜色
        width = 4,     #线宽
        dash = 'dot'),              
    name = '30.0%'
)

trace2 = go.Scatter(
    x = df['datetime'],
    y = df['50.0%'],
    line = dict(
        color = ('rgb(25, 120, 24)'),
        width = 3,
        dash = 'dot'),
    name = '50.0%'
)

trace3 = go.Scatter(
    x = df['datetime'],
    y = df['70.0%'],
    line = dict(
        color = ('rgb(5, 12, 240)'),
        width = 2,
        dash = 'dot'),
    name = '70.0%'
)
data = [trace,trace1,trace2,trace3]

layout = dict(title = '上證指數平均PE歷史曲線',#用繁体是因为简体有乱码
              xaxis = dict(title = '月份'),
              yaxis = dict(title = '平均PE'),
              )
fig= dict(data=data, layout=layout)

url = py.plot(fig,filename = 'index', auto_open=True)

根据返回的url 就可以打开一个页面,查看到自己绘制的图片了。
下一步该发送邮件了。

这一步主要是使用email的库给自己的邮箱发送一个html 的邮件,然后将图片加载过来,大致的代码如下:


template = (''
    '<a href="{graph_url}" target="_blank">' # Open the interactive graph when you click on the image
        '<img src="{graph_url}.png">'        # Use the ".png" magic url so that the latest, most-up-to-date image is included
    '</a>'
    '{caption}'                              # Optional caption to include below the graph
    '<br>'                                   # Line break
    '<a href="{graph_url}" style="color: rgb(190,190,190); text-decoration: none; font-weight: 200;" target="_blank">'
        '点击查看交互页面'  # Direct readers to Plotly for commenting, interactive graph
    '</a>'
    '<br>'
    '<hr>'                                   # horizontal line
'')

email_body.format(graph_url= url, caption='')

msg = MIMEMultipart('alternative')
msg['From'] = me
msg['To'] = recipient
msg['Subject'] = subject

msg.attach(MIMEText(email_body, 'html'))

server = smtplib.SMTP(email_server_host, port)
server.ehlo()
server.starttls()
server.login(email_username, email_password)
server.sendmail(me, recipient, msg.as_string())
server.close()

最后就可以收到自己的邮件了:

image

本篇文章由一文多发平台ArtiPub自动发布

上一篇下一篇

猜你喜欢

热点阅读