Python 量化股票 K 线图
Python 量化股票 K 线图 K 线图是金融领域最经典的图表,一根 K 线浓缩了一个周期的开盘价、收盘价、最高价、最低价。 我们可以通过 Python pyecharts 模块来绘制交互式股票 K 线图。 pyech
K 线图是金融领域最经典的图表,一根 K 线浓缩了一个周期的开盘价、收盘价、最高价、最低价。
我们可以通过 Python pyecharts 模块来绘制交互式股票 K 线图。
pyecharts 是一个基于 ECharts 的 Python 数据可视化库,生成的图表支持缩放、拖动、数据缩放等交互操作,特别适合展示行情数据。
K 线图的基本用法
先确保安装了 pyecharts 和数据获取库 yfinance:
pip install pyecharts yfinance
导入相关模块:
from pyecharts import options as opts from pyecharts.charts import Kline
Kline 图的数据是一个二维数组,每一根 K 线对应一个四元素子数组:
实例
from pyecharts.charts import Kline
# 每根 K 线的数据格式固定为 [开盘价, 收盘价, 最低价, 最高价]
data = [
[2320.26, 2320.26, 2287.3, 2362.94],
[2300.0, 2291.3, 2288.26, 2308.38],
[2295.35, 2346.5, 2295.35, 2345.92],
[2347.22, 2358.98, 2337.35, 2363.8],
]
# 配置 Kline 图
kline = (
Kline()
.add_xaxis(xaxis_data=["2017-10-24", "2017-10-25", "2017-10-26", "2017-10-27"])
.add_yaxis(series_name="Kline", y_axis=data)
.set_global_opts(
xaxis_opts=opts.AxisOpts(is_scale=True),
yaxis_opts=opts.AxisOpts(is_scale=True),
title_opts=opts.TitleOpts(title="Kline 示例"),
)
)
# 渲染图表到 HTML 文件
kline.render("kline_chart.html")
链式调用的结构很直观:add_xaxis 设置 x 轴(日期),add_yaxis 添加 K 线数据系列,set_global_opts 设置标题、坐标轴等全局配置。
当前目录会生成一个 kline_chart.html 文件,用浏览器打开,图表显示如下:

易错点:Kline 的数据顺序固定为 [开盘价, 收盘价, 最低价, 最高价],注意最低价和最高价的顺序,这是初学者最容易搞错的地方,顺序错了 K 线形态会全部失真。
实例:贵州茅台 K 线图
实际使用时,数据来自行情接口。下面的实例用 yfinance 获取贵州茅台的股票数据并生成 K 线图:
实例
from pyecharts import options as opts
from pyecharts.charts import Kline
# 获取贵州茅台近三年的股票数据
# 600519.SS 为贵州茅台在 Yahoo Finance 中的代码,.SS 表示上交所
symbol = "600519.SS"
start_date = "2021-01-01"
end_date = "2023-12-31"
# multi_level_index=False:单只股票返回单层列名
stock_data = yf.download(symbol, start=start_date, end=end_date,
progress=False, multi_level_index=False)
# 一次性提取四列并转为列表,每行顺序为 [开盘价, 收盘价, 最低价, 最高价]
kline_data = stock_data[["Open", "Close", "Low", "High"]].values.tolist()
# 配置 Kline 图
kline = (
Kline()
.add_xaxis(xaxis_data=stock_data.index.strftime("%Y-%m-%d").tolist())
.add_yaxis(series_name="Kline", y_axis=kline_data)
.set_global_opts(
xaxis_opts=opts.AxisOpts(is_scale=True),
yaxis_opts=opts.AxisOpts(is_scale=True),
title_opts=opts.TitleOpts(title="贵州茅台 Kline 图示例"),
datazoom_opts=[opts.DataZoomOpts()],
toolbox_opts=opts.ToolboxOpts(
feature={
"dataZoom": {"yAxisIndex": "none"},
"restore": {},
"saveAsImage": {},
}
),
)
)
# 渲染图表
kline.render("maotai_kline_chart.html")
代码中有两处细节值得注意:
一是 multi_level_index=False,新版 yfinance 下载单只股票默认返回多级列名,逐行取值时会导致类型错误,加这个参数直接得到单层列。
二是用 stock_data[["Open", "Close", "Low", "High"]].values.tolist() 一次性按列名提取并转成列表,既避免了逐行遍历的低效,也天然保证了 K 线要求的列顺序。
当前目录会生成一个 maotai_kline_chart.html 文件,打开该文件图表显示如下:

配置中的 DataZoomOpts 提供了底部缩放滑块,可以拖动查看任意时间窗口的 K 线;ToolboxOpts 则提供框选缩放、还原和导出图片按钮。
绘制股价曲线图
除了 K 线图,pyecharts 也可以绘制普通曲线图。以茅台(600519.SS)为例绘制收盘价走势:
实例
from pyecharts import options as opts
from pyecharts.charts import Line
from datetime import datetime, timedelta
# 设置茅台股票代码
stock_code = "600519.SS"
# 数据范围:近三年
end_date = datetime.now().strftime("%Y-%m-%d")
start_date = (datetime.now() - timedelta(days=3 * 365)).strftime("%Y-%m-%d")
# 使用 yfinance 获取股票数据
df = yf.download(stock_code, start=start_date, end=end_date,
progress=False, multi_level_index=False)
# 提取数据中的日期和收盘价
dates = df.index.strftime("%Y-%m-%d").tolist()
closing_prices = df["Close"].tolist()
# 创建 Line 图表,并添加平均值标线
line_chart = Line()
line_chart.add_xaxis(xaxis_data=dates)
line_chart.add_yaxis(
series_name="茅台股价走势",
y_axis=closing_prices,
markline_opts=opts.MarkLineOpts(
data=[opts.MarkLineItem(type_="average", name="平均值")]
),
)
line_chart.set_global_opts(
title_opts=opts.TitleOpts(title="茅台股价走势图(近三年)"),
xaxis_opts=opts.AxisOpts(type_="category"),
yaxis_opts=opts.AxisOpts(is_scale=True),
datazoom_opts=[opts.DataZoomOpts(pos_bottom="-2%")],
)
# 渲染图表
line_chart.render("maotai_stock_trend_chart.html")
当前目录会生成一个 maotai_stock_trend_chart.html 文件,打开该文件图表显示如下:

增加交互体验
在此基础上可以叠加更多交互工具,比如内嵌缩放(鼠标滚轮缩放)加滑块缩放的组合:
实例
from pyecharts import options as opts
from pyecharts.charts import Line
from datetime import datetime, timedelta
stock_code = "600519.SS"
end_date = datetime.now().strftime("%Y-%m-%d")
start_date = (datetime.now() - timedelta(days=3 * 365)).strftime("%Y-%m-%d")
df = yf.download(stock_code, start=start_date, end=end_date,
progress=False, multi_level_index=False)
dates = df.index.strftime("%Y-%m-%d").tolist()
closing_prices = df["Close"].tolist()
line_chart = Line()
line_chart.add_xaxis(xaxis_data=dates)
line_chart.add_yaxis(
series_name="茅台股价走势",
y_axis=closing_prices,
markline_opts=opts.MarkLineOpts(
data=[opts.MarkLineItem(type_="average", name="平均值")]
),
)
line_chart.set_global_opts(
title_opts=opts.TitleOpts(title="茅台股价走势图(近三年)"),
xaxis_opts=opts.AxisOpts(type_="category"),
yaxis_opts=opts.AxisOpts(is_scale=True),
# inside:鼠标滚轮缩放;slider:底部滑块缩放,两种同时启用
datazoom_opts=[
opts.DataZoomOpts(type_="inside", pos_bottom="-2%"),
opts.DataZoomOpts(type_="slider", pos_bottom="-2%"),
],
toolbox_opts=opts.ToolboxOpts(
feature={
"dataZoom": {"yAxisIndex": "none"},
"restore": {},
"saveAsImage": {},
}
),
)
# 渲染图表
line_chart.render("maotai_stock_trend_chart2.html")
当前目录会生成一个 maotai_stock_trend_chart2.html 文件,打开该文件图表显示如下:

交互式图表不只是好看:研究行情时可以快速缩放到任意区间,检查策略信号在细节处的表现,这比静态图高效得多。
