行情分析是量化策略落地的基础,而K线图则是行情分析的核心工具——通过红绿K线、上下影线,能直观呈现股价/期货价格的开盘、收盘、最高、最低点位,判断市场趋势和多空力量。传统绘制K线常用mplfinance,但操作繁琐、样式单一,且缺乏交互式体验;Plotly可轻松绘制专业K线图,支持红绿涨跌区分、叠加均线/布林带/成交量,还能优化时间轴、标注关键点位,操作更简洁、可视化效果更优,本篇将手把手教大家实操,所有代码可直接复制复用,新手也能快速上手,独立完成股票/期货行情分析和策略复盘。
📌 核心说明
本文适配Python 3.8+、Plotly 5.0+,无需额外配置环境(默认已完成中文、显示方式配置);学习前建议掌握Plotly基础语法及Pandas数据处理技巧,能通过AkShare、Tushare等工具获取行情数据(包含开盘价、收盘价、最高价、最低价、成交量)。
落地成果:学完能独立绘制专业交互式K线图,实现红绿涨跌区分、叠加均线/布林带/成交量,优化时间轴、标注关键点位,替代mplfinance简化操作,适配股票/期货行情分析、策略复盘需求。
📈 Plotly K线图核心原理(极简理解)
Plotly绘制K线图,核心依赖plotly.graph_objects(go)模块(区别于之前的px模块),通过Candlestick(烛台图)函数实现K线绘制,重点控制4个核心参数:开盘价(open)、收盘价(close)、最高价(high)、最低价(low),再通过自定义配置实现红绿涨跌区分、上下影线显示,后续可叠加其他指标(均线、布林带),形成完整的行情分析图表。
核心优势:无需手动拼接K线组件,一行代码即可生成专业K线;支持交互式操作(悬浮查看详细行情、缩放时间区间);可灵活叠加各类技术指标,操作比mplfinance更简洁,适配量化复盘场景。
🔧 实战场景1:基础K线图(红绿涨跌+上下影线)
基础K线图是行情分析的基础,重点实现“红绿涨跌区分”(收盘价>开盘价为涨,显示红色;收盘价<开盘价为跌,显示绿色)、清晰呈现上下影线,同时优化时间轴,适配A股/期货行情习惯。
import plotly.graph_objects as goimport pandas as pdimport numpy as np# 1. 准备行情数据(模拟A股日线数据,可替换为AkShare/Tushare真实数据)# 日期范围:2024年1-3月(60个交易日)date = pd.date_range(start="2024-01-01", periods=60, freq="D")np.random.seed(42)# 模拟开盘价、收盘价、最高价、最低价(贴合A股股价范围)open_price = np.round(np.random.uniform(30, 40, 60), 2)close_price = np.round(open_price + np.random.uniform(-1.5, 1.5, 60), 2)high_price = np.round(np.maximum(open_price, close_price) + np.random.uniform(0.1, 0.8, 60), 2)low_price = np.round(np.minimum(open_price, close_price) - np.random.uniform(0.1, 0.8, 60), 2)# 整理成DataFrame(Plotly K线图首选格式)df = pd.DataFrame({ "日期": date, "开盘价": open_price, "收盘价": close_price, "最高价": high_price, "最低价": low_price})# 2. 绘制基础K线图(核心代码)fig = go.Figure(data=[go.Candlestick( x=df["日期"], open=df["开盘价"], high=df["最高价"], low=df["最低价"], close=df["收盘价"], # 红绿涨跌区分(适配A股习惯:涨红跌绿) increasing_line_color="#FF6B6B", # 上涨K线颜色(红色) increasing_fillcolor="#FF6B6B", decreasing_line_color="#4ECDC4", # 下跌K线颜色(绿色) decreasing_fillcolor="#4ECDC4", line_width=1, # K线边框粗细 whiskerwidth=0.5 # 上下影线宽度)])# 3. 优化布局(适配行情分析,重点调整时间轴)fig.update_layout( title=dict(text="A股某股票日线K线图(2024年1-3月)", font=dict(size=14, weight="bold"), x=0.5), xaxis=dict( title="日期", title_font=dict(size=12), tickfont=dict(size=10), tickangle=45, # 时间轴优化:显示每月1号标记,避免日期过于密集 tickformat="%Y-%m-%d", rangeslider_visible=False # 隐藏时间范围滑块,避免冗余(按需开启) ), yaxis=dict( title="股价(元)", title_font=dict(size=12), tickfont=dict(size=10), # 股价轴优化:显示网格线,方便判断价格区间 gridcolor="#EEEEEE", zeroline=False ), margin=dict(l=50, r=50, t=50, b=80), plot_bgcolor="white", hovermode="x unified" # 悬浮时显示同一日期的所有行情数据)# 4. 显示并保存fig.show()fig.write_html("基础K线图.html") # 交互版,用于行情分析fig.write_image("基础K线图.png", scale=3) # 高清图片版,用于复盘报告

关键说明:
✅ 涨跌颜色配置:通过increasing(上涨)、decreasing(下跌)参数设置颜色,贴合A股“涨红跌绿”习惯,也可根据需求调整为美股“涨绿跌红”;
✅ 时间轴优化:rangeslider_visible=False 隐藏底部时间滑块,避免冗余;tickformat设置日期格式,避免标签重叠;
✅ 交互式体验:悬浮时可清晰查看当日开盘价、收盘价、最高价、最低价,无需手动标注,适配行情复盘。
🔧 实战场景2:K线图叠加均线/布林带(技术分析必备)
行情分析中,仅看K线不够,需叠加均线(MA)、布林带(BOLL)等技术指标,辅助判断趋势和支撑压力位。Plotly可通过“多图表叠加”实现,将K线与均线、布林带同屏显示,操作简洁,无需额外拼接代码。
import plotly.graph_objects as goimport pandas as pdimport numpy as np# 1. 准备行情数据+技术指标数据date = pd.date_range(start="2024-01-01", periods=60, freq="D")np.random.seed(42)open_price = np.round(np.random.uniform(30, 40, 60), 2)close_price = np.round(open_price + np.random.uniform(-1.5, 1.5, 60), 2)high_price = np.round(np.maximum(open_price, close_price) + np.random.uniform(0.1, 0.8, 60), 2)low_price = np.round(np.minimum(open_price, close_price) - np.random.uniform(0.1, 0.8, 60), 2)# 计算均线(MA5:5日均线,MA10:10日均线,MA20:20日均线)df = pd.DataFrame({ "日期": date, "开盘价": open_price, "收盘价": close_price, "最高价": high_price, "最低价": low_price})df["MA5"] = df["收盘价"].rolling(window=5).mean() # 5日均线df["MA10"] = df["收盘价"].rolling(window=10).mean() # 10日均线df["MA20"] = df["收盘价"].rolling(window=20).mean() # 20日均线# 计算布林带(BOLL:中轨=MA20,上轨=MA20+2*标准差,下轨=MA20-2*标准差)df["中轨"] = df["收盘价"].rolling(window=20).mean()df["标准差"] = df["收盘价"].rolling(window=20).std()df["上轨"] = df["中轨"] + 2 * df["标准差"]df["下轨"] = df["中轨"] - 2 * df["标准差"]# 2. 绘制K线图+均线+布林带(核心:多图表叠加)fig = go.Figure()# 第一步:添加K线图(基础层)fig.add_trace(go.Candlestick( x=df["日期"], open=df["开盘价"], high=df["最高价"], low=df["最低价"], close=df["收盘价"], increasing_line_color="#FF6B6B", increasing_fillcolor="#FF6B6B", decreasing_line_color="#4ECDC4", decreasing_fillcolor="#4ECDC4", line_width=1, whiskerwidth=0.5, name="K线"))# 第二步:添加均线(中层)fig.add_trace(go.Scatter( x=df["日期"], y=df["MA5"], mode="lines", line=dict(color="#F9C74F", width=1.5), name="MA5(5日均线)"))fig.add_trace(go.Scatter( x=df["日期"], y=df["MA10"], mode="lines", line=dict(color="#1E88E5", width=1.5), name="MA10(10日均线)"))fig.add_trace(go.Scatter( x=df["日期"], y=df["MA20"], mode="lines", line=dict(color="#9C27B0", width=1.5), name="MA20(20日均线)"))# 第三步:添加布林带(顶层,填充效果)fig.add_trace(go.Scatter( x=df["日期"], y=df["上轨"], mode="lines", line=dict(color="#90EE90", width=1, dash="dash"), name="上轨(BOLL)"))fig.add_trace(go.Scatter( x=df["日期"], y=df["下轨"], mode="lines", line=dict(color="#90EE90", width=1, dash="dash"), fill="tonexty", # 填充上轨和下轨之间的区域 fillcolor="rgba(144, 238, 144, 0.2)", # 半透明绿色填充 name="布林带区间"))fig.add_trace(go.Scatter( x=df["日期"], y=df["中轨"], mode="lines", line=dict(color="#90EE90", width=1), name="中轨(BOLL)"))# 3. 布局优化(突出技术指标,适配分析)fig.update_layout( title=dict(text="K线图+均线+布林带(技术分析版)", font=dict(size=14, weight="bold"), x=0.5), xaxis=dict( title="日期", title_font=dict(size=12), tickfont=dict(size=10), tickangle=45, rangeslider_visible=False ), yaxis=dict( title="股价(元)", title_font=dict(size=12), tickfont=dict(size=10), gridcolor="#EEEEEE" ), legend=dict( font=dict(size=10), x=0.02, y=0.98, align="left", bgcolor="white", bordercolor="gray", borderwidth=1 ), margin=dict(l=50, r=50, t=50, b=80), plot_bgcolor="white", hovermode="x unified")# 4. 显示并保存fig.show()fig.write_html("K线+均线+布林带.html")fig.write_image("K线+均线+布林带.png", dpi=300)

核心技巧:
✅ 多图表叠加:按“K线→均线→布林带”的顺序添加,确保底层图表不被遮挡;
✅ 布林带填充:通过fill="tonexty"填充上轨和下轨之间的区域,半透明效果既突出区间,又不遮挡K线和均线;
✅ 均线区分:不同均线用不同颜色和粗细区分,方便快速识别,贴合技术分析习惯。
🔧 实战场景3:K线图叠加成交量(完整行情分析)
成交量是行情分析的重要辅助指标,能反映市场活跃度,判断趋势的有效性。Plotly可通过“子图布局”实现K线图与成交量图同屏显示,上半部分展示K线+技术指标,下半部分展示成交量,形成完整的行情分析图表,替代mplfinance的复杂操作。
import plotly.graph_objects as gofrom plotly.subplots import make_subplotsimport pandas as pdimport numpy as np# 1. 准备行情数据+成交量数据date = pd.date_range(start="2024-01-01", periods=60, freq="D")np.random.seed(42)open_price = np.round(np.random.uniform(30, 40, 60), 2)close_price = np.round(open_price + np.random.uniform(-1.5, 1.5, 60), 2)high_price = np.round(np.maximum(open_price, close_price) + np.random.uniform(0.1, 0.8, 60), 2)low_price = np.round(np.minimum(open_price, close_price) - np.random.uniform(0.1, 0.8, 60), 2)# 模拟成交量(与涨跌正相关,贴合真实行情)volume = np.round(np.random.randint(5000, 20000, 60) * (1 + (close_price - open_price) / open_price), 0)# 计算5日均线df = pd.DataFrame({ "日期": date, "开盘价": open_price, "收盘价": close_price, "最高价": high_price, "最低价": low_price, "成交量": volume})df["MA5"] = df["收盘价"].rolling(window=5).mean()# 2. 创建子图布局(上:K线+均线,下:成交量,比例3:1)fig = make_subplots( rows=2, cols=1, shared_xaxes=True, # 共享x轴(日期),避免重复 vertical_spacing=0.05, # 子图之间的间距 row_heights=[0.7, 0.3] # 上子图占70%,下子图占30%)# 3. 上子图:添加K线+均线fig.add_trace(go.Candlestick( x=df["日期"], open=df["开盘价"], high=df["最高价"], low=df["最低价"], close=df["收盘价"], increasing_line_color="#FF6B6B", increasing_fillcolor="#FF6B6B", decreasing_line_color="#4ECDC4", decreasing_fillcolor="#4ECDC4", line_width=1, whiskerwidth=0.5, name="K线"), row=1, col=1)fig.add_trace(go.Scatter( x=df["日期"], y=df["MA5"], mode="lines", line=dict(color="#F9C74F", width=1.5), name="MA5(5日均线)"), row=1, col=1)# 4. 下子图:添加成交量(柱状图,涨跌颜色区分)fig.add_trace(go.Bar( x=df["日期"], y=df["成交量"], # 成交量颜色与K线一致:涨红跌绿 marker_color=np.where(df["收盘价"] > df["开盘价"], "#FF6B6B", "#4ECDC4"), name="成交量"), row=2, col=1)# 5. 布局优化(适配完整行情分析)fig.update_layout( title=dict(text="K线图+均线+成交量(完整行情版)", font=dict(size=14, weight="bold"), x=0.5), xaxis=dict( title="日期", title_font=dict(size=12), tickfont=dict(size=10), tickangle=45, rangeslider_visible=False ), yaxis=dict( title="股价(元)", title_font=dict(size=12), tickfont=dict(size=10), gridcolor="#EEEEEE" ), yaxis2=dict( title="成交量(手)", title_font=dict(size=12), tickfont=dict(size=10), gridcolor="#EEEEEE" ), legend=dict( font=dict(size=10), x=0.02, y=0.98, xanchor="left", bgcolor="white", bordercolor="gray", borderwidth=1 ), margin=dict(l=50, r=50, t=50, b=80), plot_bgcolor="white", hovermode="x unified")# 6. 显示并保存fig.show()fig.write_html("K线+成交量.html")fig.write_image("K线+成交量.png", scale=3)

关键说明:
✅ 子图布局:用make_subplots创建上下子图,shared_xaxes=True实现x轴共享,避免日期重复,提升可读性;
✅ 成交量颜色:与K线涨跌颜色一致,直观反映“量价配合”情况(上涨放量、下跌缩量等);
✅ 比例调整:row_heights=[0.7, 0.3] 合理分配上下子图比例,重点突出K线行情,同时清晰展示成交量。
🔧 实战场景4:关键点位标注(策略复盘必备)
策略复盘时,需要在K线图上标注关键点位(如买入点、卖出点、支撑位、压力位),Plotly可通过add_annotation函数实现,自定义标注样式、颜色和文字,清晰呈现策略的交易逻辑和行情关键节点。
import plotly.graph_objects as goimport pandas as pdimport numpy as np# 1. 准备行情数据+关键点位数据date = pd.date_range(start="2024-01-01", periods=60, freq="D")np.random.seed(42)open_price = np.round(np.random.uniform(30, 40, 60), 2)close_price = np.round(open_price + np.random.uniform(-1.5, 1.5, 60), 2)high_price = np.round(np.maximum(open_price, close_price) + np.random.uniform(0.1, 0.8, 60), 2)low_price = np.round(np.minimum(open_price, close_price) - np.random.uniform(0.1, 0.8, 60), 2)df = pd.DataFrame({ "日期": date, "开盘价": open_price, "收盘价": close_price, "最高价": high_price, "最低价": low_price})# 模拟关键点位(买入点、卖出点、支撑位、压力位)buy_date = df.iloc[15]["日期"] # 第15个交易日为买入点buy_price = df.iloc[15]["收盘价"]sell_date = df.iloc[45]["日期"] # 第45个交易日为卖出点sell_price = df.iloc[45]["收盘价"]support_price = 32.5 # 支撑位resistance_price = 38.5 # 压力位# 2. 绘制K线图+关键点位标注fig = go.Figure(data=[go.Candlestick( x=df["日期"], open=df["开盘价"], high=df["最高价"], low=df["最低价"], close=df["收盘价"], increasing_line_color="#FF6B6B", increasing_fillcolor="#FF6B6B", decreasing_line_color="#4ECDC4", decreasing_fillcolor="#4ECDC4", line_width=1, whiskerwidth=0.5)])# 3. 添加关键点位标注# 买入点标注(绿色三角形,标注文字)fig.add_annotation( x=buy_date, y=buy_price, text="买入点", font=dict(size=10, color="white", weight="bold"), bgcolor="#4ECDC4", # 标注背景色(绿色) bordercolor="black", borderwidth=1, arrowhead=2, # 箭头样式 arrowsize=1, arrowcolor="#4ECDC4", ax=0, ay=-30 # 标注位置偏移,避免遮挡K线)# 卖出点标注(红色三角形,标注文字)fig.add_annotation( x=sell_date, y=sell_price, text="卖出点", font=dict(size=10, color="white", weight="bold"), bgcolor="#FF6B6B", # 标注背景色(红色) bordercolor="black", borderwidth=1, arrowhead=2, arrowsize=1, arrowcolor="#FF6B6B", ax=0, ay=30)# 支撑位标注(水平直线+文字)fig.add_hline( y=support_price, line_color="#9C27B0", line_width=1, line_dash="dash", annotation_text="支撑位:32.5元", annotation_position="right", annotation_font=dict(size=10, color="#9C27B0"))# 压力位标注(水平直线+文字)fig.add_hline( y=resistance_price, line_color="#F9C74F", line_width=1, line_dash="dash", annotation_text="压力位:38.5元", annotation_position="right", annotation_font=dict(size=10, color="#F9C74F"))# 4. 布局优化fig.update_layout( title=dict(text="K线图+关键点位标注(策略复盘版)", font=dict(size=14, weight="bold"), x=0.5), xaxis=dict( title="日期", title_font=dict(size=12), tickfont=dict(size=10), tickangle=45, rangeslider_visible=False ), yaxis=dict( title="股价(元)", title_font=dict(size=12), tickfont=dict(size=10), gridcolor="#EEEEEE" ), margin=dict(l=50, r=100, t=50, b=80), # 右侧留足空间,避免标注被截断 plot_bgcolor="white", hovermode="x unified")# 5. 显示并保存fig.show()fig.write_html("K线+关键点位标注.html")fig.write_image("K线+关键点位标注.png", scale=3)

核心技巧:
✅ 标注样式:买入/卖出点用带箭头的标注框,支撑/压力位用水平虚线+文字,清晰区分不同类型的关键点位;
✅ 位置偏移:通过ax、ay参数调整标注位置,避免遮挡K线,提升图表可读性;
✅ 颜色统一:标注颜色与图表整体风格一致,贴合量化复盘报告的专业感。
🔄 与mplfinance对比(核心优势,简化操作)
很多人用mplfinance绘制K线图,但操作繁琐、样式单一,对比Plotly,两者核心差异如下,帮你快速选择合适的工具:
# 【mplfinance 绘制K线图(简化版)】import matplotlib.pyplot as pltimport mplfinance as mpfimport pandas as pdimport numpy as np# 配置 matplotlib 中文字体,解决乱码问题plt.rcParams["font.sans-serif"] = ["SimHei", "Microsoft YaHei"]plt.rcParams["axes.unicode_minus"] = Falsedate = pd.date_range(start="2024-01-01", periods=60, freq="D")open_price = np.round(np.random.uniform(30, 40, 60), 2)close_price = np.round(open_price + np.random.uniform(-1.5, 1.5, 60), 2)high_price = np.round(np.maximum(open_price, close_price) + np.random.uniform(0.1, 0.8, 60), 2)low_price = np.round(np.minimum(open_price, close_price) - np.random.uniform(0.1, 0.8, 60), 2)df = pd.DataFrame({ "Open": open_price, "High": high_price, "Low": low_price, "Close": close_price}, index=date)# 创建支持中文的自定义样式custom_style = mpf.make_mpf_style( base_mpf_style="yahoo", rc={"font.family": "SimHei", "axes.unicode_minus": False})# 绘制K线图(需手动配置样式,叠加指标繁琐)mpf.plot( df, type="candle", style=custom_style, title="mplfinance K线图", ylabel="股价(元)", figratio=(12,6))# 【Plotly 绘制K线图(简化版)】import plotly.graph_objects as gofig = go.Figure(data=[go.Candlestick( x=df.index, open=df["Open"], high=df["High"], low=df["Low"], close=df["Close"])])fig.update_layout(title="Plotly K线图", xaxis_title="日期", yaxis_title="股价(元)")fig.show()


核心差异总结:
✅ mplfinance:样式固定,叠加均线、成交量需额外配置,图表静态,无交互式体验,操作繁琐;
✅ Plotly:语法简洁,无需手动配置基础样式,支持交互式操作,可灵活叠加均线、布林带、成交量,标注关键点位,适配量化复盘和报告展示,完全可替代mplfinance。
💡 新手避坑提醒
1. 绘制K线图需使用plotly.graph_objects(go)模块,而非之前的px模块,注意导入方式正确;
2. 行情数据必须包含“开盘价、收盘价、最高价、最低价”四个核心字段,缺失会导致K线无法正常显示;
3. 叠加多个指标(均线、布林带)时,注意添加顺序,避免底层图表被遮挡,同时合理设置颜色和粗细,确保清晰可辨;
4. 时间轴优化时,rangeslider_visible参数可根据需求开启/关闭,避免冗余;标注关键点位时,注意位置偏移,避免遮挡K线。