☰
【Python量化数据可视化 #01】还在用表格看K线?Python 手把手画出专业蜡烛图
2026/10/14 11:40:03 网站建设 项目流程

数据拿到手,你却还在 Excel 里一列一列翻?这篇文章带你用 30 行核心代码,把行情数据画成券商软件同款的专业K线图——蜡烛实体、影线、成交量副图,一样不少。

一、为什么你画不出一张像样的K线图

很多刚接触量化分析的朋友都有这样的经历:

  • 用接口拿到了行情数据,打开一看是一长串 JSON,瞬间劝退;
  • 转存到 Excel 里看,滚动半天只有数字,涨跌全靠脑补;
  • 想找现成的画图库,要么依赖复杂、要么样式不符合A股看图习惯。

其实K线图本质上只有三种元素:影线(最高价到最低价)、实体(开盘价到收盘价)、颜色(涨红跌绿)。用 matplotlib 手绘这三样,不到 30 行代码就能画出专业水准的K线图,还能顺手把成交量副图拼上去。

本文你将得到:

  1. 一段可直接复制运行的完整代码:从行情 API 取数到输出K线图 PNG,全流程不超过 60 行;
  2. 蜡烛图的标准画法(影线 + 实体 + 红涨绿跌),并能举一反三调整配色与布局;
  3. 成交量副图的叠加方式(共享 x 轴,主副图联动);
  4. 中文标注变方框、红绿配错方向这两个高频坑的解法。

二、准备环境

只需要三样东西,一条命令装齐:

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"]=FalseLICENCE="LICENCE-66D8-9F96-0C7F0FBCD073"# 演示证书,请换成你自己的正式证书UP,DOWN="#d43f3a","#3a9d5d"# A股惯例:红涨绿跌defperturb(bars,seed=20260916):# 演示证书返回的是固定样例数据(50 条),这里做确定性 ±5% 扰动让图形有起伏。# 换成正式证书后直接删掉本函数调用即可,真实行情无需任何改动。rng=random.Random(seed)out=[]forbinbars:k=1.0+(rng.random()-0.5)*0.10nb=dict(b)forfin("o","c","h","l"):iffinnbandnb[f]isnotNone:nb[f]=round(float(nb[f])*k,2)out.append(nb)returnoutdeffetch_bars(code="600519"):client=Client(LICENCE)bars=client.stock_history(code=code,st="",et="",period="d",dividend="f")ifnotbars:raiseRuntimeError("未获取到数据,请检查证书是否有效")returnperturb(bars)defplot_candles(bars,title="600519 日K线",out="kline.png"):n=len(bars)fig,(ax1,ax2)=plt.subplots(2,1,figsize=(12,7),sharex=True,gridspec_kw={"height_ratios":[3,1]},# 主图:副图 = 3:1)fori,binenumerate(bars):o,c=float(b["o"]),float(b["c"])h,l=float(b["h"]),float(b["l"])color=UPifc>=oelseDOWN# 收盘 >= 开盘为阳线,画红ax1.vlines(i,l,h,color=color,linewidth=1)# 影线body_low,body_h=min(o,c),max(abs(c-o),0.01)# 实体ax1.add_patch(Rectangle((i-0.3,body_low),0.6,body_h,facecolor=color,edgecolor=color))v=float(b.get("v",0)or0)ax2.bar(i,v,width=0.6,color=color)# 成交量同色ax1.set_title(title,fontsize=14)ax1.set_ylabel("价格(元)")ax2.set_ylabel("成交量")step=max(n//8,1)ticks=range(0,n,step)ax2.set_xticks(ticks)ax2.set_xticklabels([str(b.get("t",""))[5:]forbinbars[::step]])ax1.grid(alpha=0.25)ax2.grid(alpha=0.25)plt.tight_layout()plt.savefig(out,dpi=120)plt.close(fig)print(f"图表已保存:{out}")if__name__=="__main__":bars=fetch_bars("600519")print(f"条数:{len(bars)}| 区间:{bars[0].get('t')}~{bars[-1].get('t')}")ups=sum(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那一行,画出来的就是真实行情,其余代码零改动。

五、三个高频坑(都替你踩过了)

  1. 中文变方框:matplotlib 默认的 DejaVu Sans 字体没有中文字形,标题和坐标轴的汉字会渲染成空心方块。解法就是开头那两行rcParams:把字体换成 SimHei(黑体)或微软雅黑,并把axes.unicode_minus关掉(否则负号也显示异常)。
  2. 红绿配反:欧美软件习惯绿涨红跌,A股正好相反——涨用红、跌用绿。代码里用UP="#d43f3a"(红)、DOWN="#3a9d5d"(绿)明确标注,避免看错方向。
  3. 实体高度为 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

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

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

立即咨询