Python+Pyecharts重画基金净值曲线(全)
投资基金之后,发现基金曲线太简陋。
于是想用Pthone把基金曲线丰富一下,加上大盘走势,加上基金近四个季度持仓变化、基金持仓行业饼图和基金涨跌日历。
Python画曲线的库很多,比如Matplotlib、Pandas、Pyecharts和Plotly等等。个人习惯Pyecharts。
1,基金净值曲线
一条曲线主要包括以下参数:名称,x轴,y轴,颜色,宽度,年线,标签,XY名称,标题,背景色,位置,备注等等。
#画曲线
#输入:名称,x轴,y轴,颜色,宽度,年线显示,标签显示,XY显示,标题,背景色,位置,备注
def one_line(sname,x,y,clr_line,wtd,yr_ava,hid_label,hid_xy,top_title,bg_clr,ad_text,ad_pos,title_pos,label_pos,tip_flag):
pass
....
line = Line()
line.add_xaxis(x)
line.add_yaxis(sname,y,is_selected=select,is_smooth=smooth,is_connect_nones=True,
#背景色
areastyle_opts=opts.AreaStyleOpts(opacity=0.2,color=bg_clr),
label_opts=opts.LabelOpts(is_show=False),
#曲线粗细和颜色
linestyle_opts=opts.LineStyleOpts(width=wtd,color=clr_line),
#显示年线
markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_='average')]),
)
设置global参数
line.set_global_opts(xaxis_opts = opts.AxisOpts(is_show = False,),#缩放is_scale=True,
yaxis_opts = opts.AxisOpts(is_show = True,
#is_scale=True,#坐标轴缩放
#splitarea_opts=opts.SplitAreaOpts(is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=0.8)),
),
#datazoom_opts=[opts.DataZoomOpts(pos_bottom="-2%")],
tooltip_opts=opts.TooltipOpts(is_show = tooltip,axis_pointer_type= "cross",trigger=label_pos[2]),#axis
#标题和位置
title_opts=opts.TitleOpts(top_title, pos_left="10%", pos_top=title_pos[1],subtitle = _sbtitle),
legend_opts=opts.LegendOpts(pos_left=label_pos[0], pos_top=label_pos[1]),
graphic_opts=[opts.GraphicGroup(
graphic_item=opts.GraphicItem(left=ad_pos[0],top=ad_pos[1], ),
children=[opts.GraphicText( graphic_textstyle_opts=opts.GraphicTextStyleOpts(
text=ad_text, font=ad_pos[2],#基金净值K线显示
graphic_basicstyle_opts=opts.GraphicBasicStyleOpts(fill='black')))])],)
确定了这些参数,加上XY轴数据,就可以画线。如果有多条曲线,用line.overlap(line)叠加。如图:
如果想看其它基金的曲线,替换链接中的基金代码:http://aitouzi.vip/c/基金代码
2,基金季度持仓
下面画基金四个季度的持仓。先看效果图,X轴是季度,Y轴是股票名称,长柱是持股占净值比例。
画图不难,代码如下:
#时间线轮播多图
def one_timeline(name_y1,name_y2,x,y1,y2,top_title):
bar = Bar()
bar.add_xaxis(x)
bar.add_yaxis(name_y1,y1,label_opts=opts.LabelOpts(position="right",formatter="{c}%"),
itemstyle_opts = opts.ItemStyleOpts(color='#2E8B57'))
bar.add_yaxis(name_y2,y2,label_opts=opts.LabelOpts(position="right",formatter="{c}%"),
itemstyle_opts = opts.ItemStyleOpts(color=JsCode(clr_tc)))
bar.reversal_axis() # 转置
bar.set_global_opts(title_opts=opts.TitleOpts(top_title, pos_left="30%", pos_top="1%"),
legend_opts=opts.LegendOpts(pos_left="40%", pos_top="6%"),
graphic_opts=[opts.GraphicGroup(
graphic_item=opts.GraphicItem(
rotation=JsCode("Math.PI / 4"),bounding="raw",right=100,bottom=110,z=100,),
children=[opts.GraphicRect(
graphic_item=opts.GraphicItem(left="center", top="center", z=100),
graphic_shape_opts=opts.GraphicShapeOpts(width=400, height=50),
graphic_basicstyle_opts=opts.GraphicBasicStyleOpts(fill="rgba(0,0,0,0)"),),
opts.GraphicText(
graphic_item=opts.GraphicItem(left="center", top="center", z=100),
graphic_textstyle_opts=opts.GraphicTextStyleOpts(
text='WX:toberishes',font="bold 16px Microsoft YaHei",
graphic_basicstyle_opts=opts.GraphicBasicStyleOpts(fill="#00868B"
),),)],)],)
return bar
这里关键是准备每个季度的持仓数据,每个季度画一个图,再叠加。
for q in the_qts:
try:y2 = add_zero_st(x,qts[q[1]])
except:continue
bar = one_timeline('','',x,[],y2,top_name,0)
tl.add(bar,"{} 年{}季度".format(q[0],q[1]))
3,基金持仓行业
有时看到基金重仓股,不知道属于什么行业。现在有了基金、股票数据,可以用饼图显示基金持仓行业比例:
画饼图简单,难点是准备数据:
#基金持仓饼图
def fund_field_pie(code):
code = completeCodes(code)
#基金行业持仓数据
hy = fund_stock_fd(code,0,3)
if hy == 'na':return 0
name = fund_names[code][:6]
title_name = "{}{}持仓行业.html".format(name,code)
isub = '\n\n\n\n\n\n\n\n\n\n\n '+name_fun
file = down_dir+title_name
c = Pie()
c.add("", hy,center=["50%", "60%"],)
c.set_global_opts(title_opts=opts.TitleOpts(title=title_name[:-5],pos_left="35%",pos_top="5%",subtitle = isub),
legend_opts=opts.LegendOpts(orient="horizontal", pos_bottom="5%", pos_left="10%",is_show=False),)
c.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}%"))
return c
4,基金涨跌日历
A股有两大魔咒,黑四、黑五。是不是这样呢?看下基金日涨跌数据:
只能说,每周四、周五,都有板块下跌,不同板块表现不同。其它基金在链接上修改代码:基金曲线
实现较为简单:
##画股票涨跌日历图
#info = [[日期,涨跌幅度]]
#_height:背景高度, label_top,颜色标签底部位置
def draw_fund_calr(code,N,_height):
code = completeCodes(code)
nvs = get_fund_nvs_newgu(code)[1:N]
info = [[i[0],round(100*i[3],1)] for i in nvs ]
name = fund_names[code][:6]
file = down_dir + name+code+'.html'
_title = name + '涨跌'
start = info[0][0];end = info[-1][0]
calr = one_calr(info,name,_title,_height,file)
del info
return calr
这就是个人开发的基金曲线,包括净值曲线、大盘走势、持仓变化、持仓行业和涨跌日历。
喜欢就关注,有问题请留言。