在前面的Python学习教程中,我们设置了系统的注册和登陆功能,已经基本满足了一个小型 Web 应用的需求。那么如果我们想通过这个网站来赚些小钱呢,就需要提供更高级的功能,当然这些高级功能不是免费开放的,设计一个权限系统,来控制高级应用的使用。
撰写高级功能
所谓的高级功能就是用户舍得花钱去购买的功能,像我这种喜欢薅羊毛的主,只配用用基础功能了。
我这里设计的高级功能,就是丰富 K 线图,在我们原来 K 线图的基础上添加移动平均线和成交量。
移动平均线
移动平均线是技术分析中非常普遍的一项指标,“平均”是指单位周期内的平均收盘价格,“移动”则是指将新的交易日收盘价纳入计算周期的同时,剔除最早的交易收盘价。
我们先来观察下通过 tushare 获取到的数据
可以看到,数据中的 Ma5、Ma10 和 Ma20 值可以用来制作移动平均线,可以通过折线图的方式来展现。
import pyecharts.options as opts from pyecharts.charts import Line def moving_average() -> Line: c = ( Line() .add_xaxis(df.index.tolist()) .add_yaxis("Ma5", df['ma5'].values.tolist(), is_smooth=True) .add_yaxis("Ma10", df['ma10'].values.tolist(), is_smooth=True) .add_yaxis("Ma20", df['ma20'].values.tolist(), is_smooth=True) .set_global_opts(title_opts=opts.TitleOpts(title="移动平均线")) .set_series_opts( label_opts=opts.LabelOpts(is_show=False), ) ) return c moving_average().render_notebook()
成交量
对于成交量,可以通过柱状图来展示,柱状图的高度,就是成交量的大小。把上涨时的成交量显示成红色,下跌时的成交量显示成绿色。
import pyecharts.options as opts from pyecharts.charts import Line, Bar volume_rise=[df.volume[x] if df.close[x] > df.open[x] else "0" for x in range(0, len(df.index))] volume_drop=[df.volume[x] if df.close[x] <= df.open[x] else "0" for x in range(0, len(df.index))] def volume() -> Bar: c = ( Bar() .add_xaxis(df.index.tolist()) .add_yaxis("volume_rise", volume_rise, stack=True, color=["#ec0000"]) .add_yaxis("volume_drop", volume_drop, stack=True, color=["#00da3c"]) .set_global_opts(title_opts=opts.TitleOpts(title="成交量"), datazoom_opts=[opts.DataZoomOpts()],) .set_series_opts( label_opts=opts.LabelOpts(is_show=False), ) ) return c volume().render_notebook()
集成三个图表
下面我们就把三个图标,K 线图,移动平均线图和成交量图合成到一起
首先把 K 线图和移动平均线图层叠到一起
def kline_base() -> Kline: kline = ( Kline() .add_xaxis(df.index.tolist()) .add_yaxis("日K图", df[['open', 'close', 'low', 'high']].values.tolist(), markpoint_opts=opts.MarkLineOpts( data=[opts.MarkLineItem(type_="max", value_dim="close")] ), markline_opts=opts.MarkLineOpts( data=[opts.MarkLineItem(type_="max", value_dim="close")] ), itemstyle_opts=opts.ItemStyleOpts( color="#ec0000", color0=