美文网首页
用plotly搭建自己的A股指数估值监控系统

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

作者: 吴玉海 | 来源:发表于2020-04-22 21:18 被阅读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自动发布

    相关文章

      网友评论

          本文标题:用plotly搭建自己的A股指数估值监控系统

          本文链接:https://www.haomeiwen.com/subject/dwrgihtx.html