用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自动发布