如何用 Python 画 K 线图(蜡烛图)?(mplfinance + 均线 + 成交量)

一句话回答: 用 AlphaFeed 取复权日线,把数据整理成 DatetimeIndex + Open/High/Low/Close/Volume 列,再交给 mplfinance.plot(..., type="candle") 几行就能画出带均线和成交量的专业蜡烛图------关键是列名和索引要符合 mplfinance 的规范。

为什么会有这个问题 / 传统做法的痛点

用 matplotlib 手画蜡烛图很麻烦(要自己画矩形和影线),mplfinance 是专门的方案,但新手常卡在:

  • 数据格式 :mplfinance 要求索引是 DatetimeIndex、列名严格为 Open/High/Low/Close/Volume(首字母大写);
  • 复权:不用前复权,除权跳空会在图上出现假缺口;
  • 中文字体:默认字体不含中文,标题会显示方块。

数据这关用 AlphaFeed 复权日线解决,格式转换只需几行。

分步骤解决(每步配可运行代码)

第 1 步:安装 mplfinance 并取数

bash 复制代码
pip install mplfinance
python 复制代码
from alphafeed import AlphaFeed
import pandas as pd

af = AlphaFeed(api_key="your-api-key")  # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()

df = af.klines.get("600519.SH", period="1d", count=60,
                   adjust="forward", to_dataframe=True)
df = df.sort_values("trade_date").reset_index(drop=True)

第 2 步:整理成 mplfinance 需要的格式

python 复制代码
def prepare_ohlc(df):
    d = df[["trade_date", "open", "high", "low", "close", "volume"]].copy()
    d["trade_date"] = pd.to_datetime(d["trade_date"])     # 转 DatetimeIndex
    d = d.set_index("trade_date")
    d.columns = ["Open", "High", "Low", "Close", "Volume"]  # 列名首字母大写
    return d

data = prepare_ohlc(df)
print(data.tail(3))

mplfinance 数据要求:

要求 说明
索引 DatetimeIndex(用 pd.to_datetime 转换)
列名 Open High Low Close(Volume 可选)
顺序 按时间升序
复权 建议前复权,避免假缺口

第 3 步:画蜡烛图(加均线与成交量)

python 复制代码
import mplfinance as mpf

mpf.plot(data, type="candle", volume=True, mav=(5, 20),
         style="charles", savefig="kline.png")   # 也可去掉 savefig 直接弹窗
  • type="candle":蜡烛图(也可 ohlc/line);
  • volume=True:附成交量子图;
  • mav=(5, 20):叠加 5 日、20 日均线;
  • savefig="kline.png":保存为图片。

实测用茅台 60 日数据可成功渲染出约 50KB 的 PNG(含均线与成交量),DatetimeIndex + OHLCV 格式即可直接绘制。

关键坑与注意事项

  • 列名/索引必须规范 :列名要首字母大写 Open/High/Low/Close/Volume,索引必须是 DatetimeIndex,否则 mplfinance 报错。
  • 前复权 :一律 adjust="forward",否则除权日会出现向下假缺口,误导判断。
  • 中文标题乱码 :matplotlib 默认字体无中文,需设中文字体(如 matplotlib.rcParams['font.sans-serif']=['SimHei'])或标题用英文。
  • 数据别太多:一次画几百上千根 K 线会很挤,日线通常画 60~250 根即可,长周期用周/月线。
  • 交互 vs 保存 :服务器无显示环境时用 savefig 存图;本地可直接 mpf.plot(...) 弹窗。

常见问题(FAQ)

Q:报错 "Expect data.index as DatetimeIndex" 怎么办?

A:说明索引不是时间类型。用 pd.to_datetime(df["trade_date"]) 后 set_index 即可。

Q:能画分钟 K 线吗?

A:可以。用 af.klines.intraday(...) 取分钟数据,同样整理成 OHLCV 格式喂给 mplfinance,type="candle" 即可。

Q:怎么加 MACD/RSI 副图?

A:用 mpf.make_addplot(...) 把你算好的指标序列作为附加图层传给 mpf.plot(addplot=...),可叠加自定义指标。

Q:需要付费吗?

A:单只标的的日线在免费额度内即可试;批量/长历史需 Starter 及以上,详见 AlphaFeed 定价页。

小结

用 Python 画 K 线图的关键不在绘图库,而在把数据整理成 mplfinance 要的 DatetimeIndex + OHLCV 格式 并做好前复权。AlphaFeed 提供干净的复权日线/分钟线,几行转换后交给 mplfinance.plot 就能得到带均线和成交量的专业蜡烛图------记得处理好列名、索引和中文字体。

参考

相关推荐
事圆则缓1 小时前
Flutter 状态管理框架对比(三):Riverpod 如何连起购物车与异步价格
开发语言·javascript·flutter
蓝宝石的傻话1 小时前
onvif-go(mickeyzzc/onvif-go v2)完整参考手册:从建工程到写出自己的 NVR 接入
开发语言·后端·golang
Elastic 中国社区官方博客1 小时前
使用 Lucene 搜索你的 Bean —— Elasticsearch
大数据·开发语言·人工智能·elasticsearch·搜索引擎·全文检索·lucene
Sayai2 小时前
Neo4j 内嵌模式(Embedded)实战:Java 嵌入式 vs 服务端部署的写入性能对比与 GC 调优
java·开发语言·性能优化·neo4j·图数据库
Y3815326622 小时前
行业动态周报:用新闻 API 追踪一个赛道的声音变化
python·搜索引擎
零域码客2 小时前
零基础Python爬虫入门:从HTTP协议到 requests + BeautifulSoup 实战
爬虫·python·http
“AI国潮设计-小江”2 小时前
【SDXL实战】用AI生成“财神爷蛋糕×英歌舞人物”潮汕国潮甜品IP,附Prompt与批量生成思路
开发语言·人工智能·python·aigc
繁华的地方不一定留下你的脚印2 小时前
C++线程如何安全停止与唤醒:std::jthread、stop_token与condition_variable
开发语言·c++
DD云验证2 小时前
DD云验证,免费网络验证系统
服务器·python·易语言·网络验证·卡密验证