资讯动态

【Python量化数据可视化 #01】还在用表格看K线?Python 手把手画出专业蜡烛图

发布时间:2026/10/14 11:40:07 来源:尧图企业网站定制
数据拿到手你却还在 Excel 里一列一列翻这篇文章带你用 30 行核心代码把行情数据画成券商软件同款的专业K线图——蜡烛实体、影线、成交量副图一样不少。一、为什么你画不出一张像样的K线图很多刚接触量化分析的朋友都有这样的经历用接口拿到了行情数据打开一看是一长串 JSON瞬间劝退转存到 Excel 里看滚动半天只有数字涨跌全靠脑补想找现成的画图库要么依赖复杂、要么样式不符合A股看图习惯。其实K线图本质上只有三种元素影线最高价到最低价、实体开盘价到收盘价、颜色涨红跌绿。用 matplotlib 手绘这三样不到 30 行代码就能画出专业水准的K线图还能顺手把成交量副图拼上去。本文你将得到一段可直接复制运行的完整代码从行情 API 取数到输出K线图 PNG全流程不超过 60 行蜡烛图的标准画法影线 实体 红涨绿跌并能举一反三调整配色与布局成交量副图的叠加方式共享 x 轴主副图联动中文标注变方框、红绿配错方向这两个高频坑的解法。二、准备环境只需要三样东西一条命令装齐pipinstallmairui matplotlib pandas行情数据通过行情数据 API 获取用 SDK 里的Client传入你的证书licence即可。本文示例用演示证书跑通全流程正式使用时换成你自己的证书就能拿到真实行情。三、完整代码已实测跑通frommairuiimportClientimportrandomimportmatplotlib matplotlib.use(Agg)# 无界面环境直接出图到文件importmatplotlib.pyplotaspltfrommatplotlib.patchesimportRectangle# 中文标注必设matplotlib 默认字体没有中文字形不设的话汉字全变方框plt.rcParams[font.sans-serif][SimHei,Microsoft YaHei]plt.rcParams[axes.unicode_minus]FalseLICENCELICENCE-66D8-9F96-0C7F0FBCD073# 演示证书请换成你自己的正式证书UP,DOWN#d43f3a,#3a9d5d# A股惯例红涨绿跌defperturb(bars,seed20260916):# 演示证书返回的是固定样例数据50 条这里做确定性 ±5% 扰动让图形有起伏。# 换成正式证书后直接删掉本函数调用即可真实行情无需任何改动。rngrandom.Random(seed)out[]forbinbars:k1.0(rng.random()-0.5)*0.10nbdict(b)forfin(o,c,h,l):iffinnbandnb[f]isnotNone:nb[f]round(float(nb[f])*k,2)out.append(nb)returnoutdeffetch_bars(code600519):clientClient(LICENCE)barsclient.stock_history(codecode,st,et,periodd,dividendf)ifnotbars:raiseRuntimeError(未获取到数据请检查证书是否有效)returnperturb(bars)defplot_candles(bars,title600519 日K线,outkline.png):nlen(bars)fig,(ax1,ax2)plt.subplots(2,1,figsize(12,7),sharexTrue,gridspec_kw{height_ratios:[3,1]},# 主图:副图 3:1)fori,binenumerate(bars):o,cfloat(b[o]),float(b[c])h,lfloat(b[h]),float(b[l])colorUPifcoelseDOWN# 收盘 开盘为阳线画红ax1.vlines(i,l,h,colorcolor,linewidth1)# 影线body_low,body_hmin(o,c),max(abs(c-o),0.01)# 实体ax1.add_patch(Rectangle((i-0.3,body_low),0.6,body_h,facecolorcolor,edgecolorcolor))vfloat(b.get(v,0)or0)ax2.bar(i,v,width0.6,colorcolor)# 成交量同色ax1.set_title(title,fontsize14)ax1.set_ylabel(价格元)ax2.set_ylabel(成交量)stepmax(n//8,1)ticksrange(0,n,step)ax2.set_xticks(ticks)ax2.set_xticklabels([str(b.get(t,))[5:]forbinbars[::step]])ax1.grid(alpha0.25)ax2.grid(alpha0.25)plt.tight_layout()plt.savefig(out,dpi120)plt.close(fig)print(f图表已保存:{out})if__name____main__:barsfetch_bars(600519)print(f条数:{len(bars)}| 区间:{bars[0].get(t)}~{bars[-1].get(t)})upssum(1forbinbarsiffloat(b[c])float(b[o]))print(f阳线{ups}天 / 阴线{len(bars)-ups}天 | 最新收盘{bars[-1][c]}元)plot_candles(bars)四、真实运行结果在 Python 3.9 环境实测运行控制台输出条数: 50 | 区间: 2025-09-15 ~ 2025-12-01 阳线 28 天 / 阴线 22 天 | 最新收盘 11.15 元 图表已保存: kline.png生成的kline.png是一张上下双面板的图上面板是标准蜡烛图——红色实体代表当天收盘价高于开盘价上涨绿色代表下跌细线是从最高价到最低价的影线下面板是成交量柱状图颜色与当日涨跌对应涨跌放量一眼可辨。说明演示证书返回的是固定样例数据代码里做了确定性的小幅扰动让图形有起伏换成你自己的正式证书后删掉perturb那一行画出来的就是真实行情其余代码零改动。五、三个高频坑都替你踩过了中文变方框matplotlib 默认的 DejaVu Sans 字体没有中文字形标题和坐标轴的汉字会渲染成空心方块。解法就是开头那两行rcParams把字体换成 SimHei黑体或微软雅黑并把axes.unicode_minus关掉否则负号也显示异常。红绿配反欧美软件习惯绿涨红跌A股正好相反——涨用红、跌用绿。代码里用UP#d43f3a红、DOWN#3a9d5d绿明确标注避免看错方向。实体高度为 0 画不出矩形一字板或十字星当天开盘价等于收盘价Rectangle高度为 0 会看不见。代码里用max(abs(c - o), 0.01)兜底保证至少有 1 分钱的可见高度。六、小结与下篇预告一张图里我们完成了取数1 个接口调用、K线主图影线 实体 红涨绿跌、成交量副图共享 x 轴。这套手绘蜡烛图是所有行情可视化的地基——后面的均线、MACD、KDJ全都画在这张图的主图和副图上。下篇预告《【Python量化数据可视化 #02】均线 MACD 看不清主副图叠加才是专业打开方式》——在同一张图上叠加 MA5/10/20 三条均线再挂上 MACD 和 KDJ 两个副图做成券商软件同款的一图看全部三面板布局。免责声明本文所有代码与数据仅用于技术学习与演示不构成任何投资建议。股市有风险投资需谨慎。代码与文档SDK 与更多语言版本https://github.com/MaiRuiApi

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑