☰
python:pyecharts 重新画基金净值周K线图
2026/10/28 10:16:06 网站建设 项目流程

请先阅读:python:生成基金净值周K线数据

pip install pyecharts==1.9.1
pip show pyecharts
pyecharts-1.9.1-py3-none-any.whl

我想在本地(PC) 画出 基金净值 周K线图,不想每次看图都需联网。
cd my_dir
mkdir echarts
cd echarts
curl -O https://assets.pyecharts.org/assets/echarts.min.js

修改一下开源代码

cd \Python38\Lib\site-packages \pyecharts\ 编辑 globals.py 第125行
class _OnlineHost:
DEFAULT_HOST = “https://assets.pyecharts.org/assets/”

改为 DEFAULT_HOST = “./echarts/”

kline_w.py 修改说明

原代码只有一条 mavg,现在新增 MA25(半年均线)、MA50(一年均线)两条移动均线。
逻辑:

  1. 原csv字段:ym,open,close,low,high,mavg,注意原文件没有ma25、ma50字段,这里采用收盘价滚动计算MA25、MA50;
  2. MA25:最近25根K线收盘价均值;MA50:最近50根K线收盘价均值;
  3. 均线不足周期时填None,pyecharts会自动断开线条;
  4. 增加两条Line叠加到K线图,区分颜色;
  5. 保持原有命令行参数、文件读写、输出逻辑不变,兼容 python3.7 + pyecharts==1.9.1。
# coding=utf-8importos,sysfrompyechartsimportoptionsasoptsfrompyecharts.chartsimportKline,Lineiflen(sys.argv)==2:fcode=sys.argv[1]file1='W'+fcode+'.csv'file2='W'+fcode+'.htm'eliflen(sys.argv)==3:fcode=sys.argv[1]file1='W'+fcode+'_'+sys.argv[2]+'.csv'file2='W'+fcode+'_'+sys.argv[2]+'.htm'else:print('usage: kline_w.py fcode ')sys.exit(1)iflen(fcode)!=6:print(' fcode is char(6)')sys.exit(2)path='./data/'ifnotos.path.exists(path+file1):print(file1+' is not exists.')sys.exit(3)# 数据项: [open,close,low,high,mavg]# (即:[开盘值,收盘值,最低值,最高值,平均值])clist=[]# 原mavgxlist=[]ylist=[]close_list=[]# 保存收盘价,用于计算MA25 MA50fr=open(path+file1,'r')fr.readline()# 跳过第1行表头: ym,open,close,low,high,mavgforlineinfr:line=line.strip()ifnotline:continueym,open,close,low,high,mavg=line.split(',')xlist.append(ym)clist.append(float(mavg))ylist.append([float(open),float(close),float(low),float(high)])close_list.append(float(close))fr.close()print(str(len(xlist)))# ========== 计算MA25 MA50 移动均线 ==========ma25_list=[]ma50_list=[]foriinrange(len(close_list)):# MA25ifi>=24:window25=close_list[i-24:i+1]ma25=sum(window25)/len(window25)ma25_list.append(round(ma25,4))else:ma25_list.append(None)# MA50ifi>=49:window50=close_list[i-49:i+1]ma50=sum(window50)/len(window50)ma50_list.append(round(ma50,4))else:ma50_list.append(None)# ===========================================iflen(sys.argv)==2:title=fcode+" 基金净值 周K线图"eliflen(sys.argv)==3:title=fcode+" 累计净值 周K线图"# 创建一个K线图实例kline=Kline(init_opts=opts.InitOpts(width="1200px",height="600px"))# 设置x轴的数据kline.add_xaxis(xlist)# 设置y轴的数据,这里的 "kline" 是系列名称,data 是K线图的数据kline.add_yaxis("kline",ylist)# 设置全局配置项,包括x轴、y轴、标题等配置kline.set_global_opts(xaxis_opts=opts.AxisOpts(is_scale=True),# 设置x轴的刻度是否自适应yaxis_opts=opts.AxisOpts(is_scale=True,splitarea_opts=opts.SplitAreaOpts(is_show=True,areastyle_opts=opts.AreaStyleOpts(opacity=1))),datazoom_opts=[opts.DataZoomOpts()],title_opts=opts.TitleOpts(title=title),# 设置标题)# 原平均线 mavgline1=Line().add_xaxis(xlist).add_yaxis('mavg',clist,yaxis_index=0)line1.set_series_opts(label_opts=opts.LabelOpts(is_show=False),linestyle_opts=opts.LineStyleOpts(width=1),)kline.overlap(line1)# 新增 MA25line_ma25=Line().add_xaxis(xlist).add_yaxis("MA25",ma25_list,yaxis_index=0)line_ma25.set_series_opts(label_opts=opts.LabelOpts(is_show=False),linestyle_opts=opts.LineStyleOpts(width=1.5,color="#ff4444"))kline.overlap(line_ma25)# 新增 MA50line_ma50=Line().add_xaxis(xlist).add_yaxis("MA50",ma50_list,yaxis_index=0)line_ma50.set_series_opts(label_opts=opts.LabelOpts(is_show=False),linestyle_opts=opts.LineStyleOpts(width=1.5,color="#22bb22"))kline.overlap(line_ma50)kline.render(path='./html/'+file2)

关键点说明

  1. 周期说明:周K,MA25=25周均线;MA50=50周均线;
  2. 不足25/50根数据时,值为None,图表线条会自动断开,这是pyecharts正常行为;
  3. 均线是用收盘价滚动窗口计算;
  4. 兼容 pyecharts 1.9.1、python3.7+;
  5. 原有mavg保留,颜色:
    • mavg:默认蓝色
    • MA25:红色#ff4444
    • MA50:绿色#22bb22

如果你希望csv里直接读取ma25、ma50字段(而不是程序计算)

如果你的csv表头变成:ym,open,close,low,high,mavg,ma25,ma50
把计算MA的整块代码删掉,读取时直接解析字段:

ym,open,close,low,high,mavg,ma25,ma50=line.strip().split(',')xlist.append(ym)clist.append(float(mavg))ma25_list.append(float(ma25))ma50_list.append(float(ma50))ylist.append([float(open),float(close),float(low),float(high)])

运行方式不变

python kline_w.py660008

如果采用 mavg 数值滚动计算 MA25、MA50,如何改写脚本?

需求变更:不再用close收盘价计算MA25/MA50,改用原始字段mavg做滚动窗口计算MA25、MA50。

  • 窗口:MA25取最近25个mavg值求平均;MA50取最近50个mavg值求平均
  • 数据不足周期填None,pyecharts线条自动断开
  • 其他全部逻辑不变:命令行、文件读写、pyecharts1.9.1 / python3.7兼容,保留原有mavg均线。
# coding=utf-8importos,sysfrompyechartsimportoptionsasoptsfrompyecharts.chartsimportKline,Lineiflen(sys.argv)==2:fcode=sys.argv[1]file1='W'+fcode+'.csv'file2='W'+fcode+'.htm'eliflen(sys.argv)==3:fcode=sys.argv[1]file1='W'+fcode+'_'+sys.argv[2]+'.csv'file2='W'+fcode+'_'+sys.argv[2]+'.htm'else:print('usage: kline_w.py fcode ')sys.exit(1)iflen(fcode)!=6:print(' fcode is char(6)')sys.exit(2)path='./data/'ifnotos.path.exists(path+file1):print(file1+' is not exists.')sys.exit(3)# 数据项: [open,close,low,high,mavg]# (即:[开盘值,收盘值,最低值,最高值,平均值])clist=[]# 原始mavg 序列,用于绘图+计算MA25 MA50xlist=[]ylist=[]fr=open(path+file1,'r')fr.readline()# 跳过第1行表头: ym,open,close,low,high,mavgforlineinfr:line=line.strip()ifnotline:continueym,open,close,low,high,mavg=line.split(',')xlist.append(ym)mavg_val=float(mavg)clist.append(mavg_val)ylist.append([float(open),float(close),float(low),float(high)])fr.close()print(str(len(xlist)))# ========== 使用 mavg 滚动计算 MA25、MA50 ==========ma25_list=[]ma50_list=[]total_cnt=len(clist)foriinrange(total_cnt):# MA25:取当前以及前面共25个mavgifi>=24:win25=clist[i-24:i+1]ma25=sum(win25)/len(win25)ma25_list.append(round(ma25,4))else:ma25_list.append(None)# MA50:取当前以及前面共50个mavgifi>=49:win50=clist[i-49:i+1]ma50=sum(win50)/len(win50)ma50_list.append(round(ma50,4))else:ma50_list.append(None)# ===================================================iflen(sys.argv)==2:title=fcode+" 基金净值 周K线图"eliflen(sys.argv)==3:title=fcode+" 累计净值 周K线图"# 创建一个K线图实例kline=Kline(init_opts=opts.InitOpts(width="1200px",height="600px"))# 设置x轴的数据kline.add_xaxis(xlist)# 设置y轴的数据,这里的 "kline" 是系列名称,data 是K线图的数据kline.add_yaxis("kline",ylist)# 设置全局配置项,包括x轴、y轴、标题等配置kline.set_global_opts(xaxis_opts=opts.AxisOpts(is_scale=True),# 设置x轴的刻度是否自适应yaxis_opts=opts.AxisOpts(is_scale=True,splitarea_opts=opts.SplitAreaOpts(is_show=True,areastyle_opts=opts.AreaStyleOpts(opacity=1))),datazoom_opts=[opts.DataZoomOpts()],title_opts=opts.TitleOpts(title=title),# 设置标题)# 原始mavg均线line1=Line().add_xaxis(xlist).add_yaxis('mavg',clist,yaxis_index=0)line1.set_series_opts(label_opts=opts.LabelOpts(is_show=False),linestyle_opts=opts.LineStyleOpts(width=1),)kline.overlap(line1)# MA25(基于mavg滚动)红色line_ma25=Line().add_xaxis(xlist).add_yaxis("MA25",ma25_list,yaxis_index=0)line_ma25.set_series_opts(label_opts=opts.LabelOpts(is_show=False),linestyle_opts=opts.LineStyleOpts(width=1.5,color="#ff4444"))kline.overlap(line_ma25)# MA50(基于mavg滚动)绿色line_ma50=Line().add_xaxis(xlist).add_yaxis("MA50",ma50_list,yaxis_index=0)line_ma50.set_series_opts(label_opts=opts.LabelOpts(is_show=False),linestyle_opts=opts.LineStyleOpts(width=1.5,color="#22bb22"))kline.overlap(line_ma50)kline.render(path='./html/'+file2)

关键改动点说明

  1. 不再读取close_list收盘价数组;直接拿clist(全部mavg数值序列)作为滚动计算数据源。
  2. 窗口逻辑:
    • i >=24:下标从0开始,第25条数据下标24,取切片clist[i‑24:i+1]共25个mavg求平均得到MA25
    • i >=49:取切片clist[i‑49:i+1]共50个mavg求平均得到MA50
  3. 前面不足周期的位置填充None,pyecharts渲染时线条自动断开。
  4. 图表上一共三条线:
    • mavg:原始均线
    • MA25:基于mavg的25周期均线(红色)
    • MA50:基于mavg的50周期均线(绿色)

运行命令不变:

python kline_w.py660008

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询