4、数据可视化:K线图绘制、移动平均线绘制、成交量图绘制

数据可视化,说白了就是把枯燥的数字变成一眼就能看懂的图形。做量化交易,你每天面对的就是一堆价格、成交量、指标值。光看数字,脑子容易转不过弯来。但一张K线图摆在那,高开低走、趋势方向,一目了然。

我个人习惯用两个库:matplotlibplotly。matplotlib 是老牌选手,适合做静态图表,放在报告里、打印出来都行。plotly 是交互式新贵,鼠标悬停能看数据、能缩放、能拖动,适合做实时分析面板。两个我都会讲,你根据场景选。

核心知识点:

  • K线图(蜡烛图)的绘制原理
  • 移动平均线叠加到K线图上
  • 成交量图(柱状图)与K线图联动
  • matplotlib 与 plotly 两种实现方式
数据可视化核心逻辑 原始数据(OHLCV) K线图绘制 移动平均线 成交量图 matplotlib(静态图表) plotly(交互式图表) 双轴联动(成交量在下) 交易决策

4.1 准备数据:OHLCV 格式

做可视化之前,先得有数据。我一般从 Yahoo Finance 或者本地 CSV 文件读取。数据格式很简单:Open(开盘)、High(最高)、Low(最低)、Close(收盘)、Volume(成交量),再加上时间索引。

import pandas as pd
import yfinance as yf

# 下载纳斯达克指数数据
df = yf.download('^IXIC', start='2024-01-01', end='2024-12-31')
df = df[['Open', 'High', 'Low', 'Close', 'Volume']]
print(df.head())

小技巧: 如果你没有网络,可以用本地 CSV。我在项目中经常先下载好数据存成 CSV,避免每次跑代码都去拉接口,省时间也防断网。

4.2 用 matplotlib 绘制 K 线图

matplotlib 本身没有直接的 K 线图函数,得用 mplfinance 这个扩展库。它封装好了,一行代码就能画出漂亮的蜡烛图。

import mplfinance as mpf

# 绘制K线图 + 成交量
mpf.plot(df, type='candle', volume=True, style='charles',
         title='纳斯达克 K线图', ylabel='价格 (USD)',
         ylabel_lower='成交量', figsize=(12, 8))

嗯,这里要注意:volume=True 会自动在下方画成交量柱状图。颜色默认是涨绿跌红,但国内习惯是涨红跌绿,你可以通过 style 参数调整。

我曾经在给团队做日报时,直接用这个函数生成图片,贴到邮件里。老板说「这图看着舒服」。其实背后就一行代码,但数据清洗花了不少功夫。

4.3 叠加移动平均线

移动平均线是趋势跟踪的基础工具。说白了就是把过去 N 天的收盘价取个平均值,连成一条线。我常用 5日、20日、60日三条均线。

# 计算移动平均线
df['MA5'] = df['Close'].rolling(window=5).mean()
df['MA20'] = df['Close'].rolling(window=20).mean()
df['MA60'] = df['Close'].rolling(window=60).mean()

# 绘制K线图 + 均线
mpf.plot(df, type='candle', volume=True, style='charles',
         mav=(5, 20, 60),  # 传入均线周期
         title='纳斯达克 K线图 + 均线系统',
         ylabel='价格 (USD)', figsize=(12, 8))

避坑指南: 我曾经在回测时发现均线信号滞后严重,后来才意识到——均线是历史数据的平滑,天然有滞后性。别指望它能预测顶部底部,它只是帮你识别趋势方向。

4.4 用 plotly 做交互式图表

matplotlib 的图是静态的,plotly 就不一样了。鼠标悬停能看到具体数值,还能缩放、平移。做量化分析面板时,我首选 plotly。

import plotly.graph_objects as go
from plotly.subplots import make_subplots

# 创建子图:上面K线,下面成交量
fig = make_subplots(rows=2, cols=1, shared_xaxes=True,
                    vertical_spacing=0.05,
                    row_heights=[0.7, 0.3])

# 添加K线图
fig.add_trace(go.Candlestick(
    x=df.index,
    open=df['Open'], high=df['High'],
    low=df['Low'], close=df['Close'],
    name='K线'
), row=1, col=1)

# 添加移动平均线
fig.add_trace(go.Scatter(x=df.index, y=df['MA5'],
                         mode='lines', name='MA5',
                         line=dict(color='orange', width=1)), row=1, col=1)
fig.add_trace(go.Scatter(x=df.index, y=df['MA20'],
                         mode='lines', name='MA20',
                         line=dict(color='blue', width=1)), row=1, col=1)
fig.add_trace(go.Scatter(x=df.index, y=df['MA60'],
                         mode='lines', name='MA60',
                         line=dict(color='purple', width=1)), row=1, col=1)

# 添加成交量柱状图
fig.add_trace(go.Bar(x=df.index, y=df['Volume'],
                     name='成交量',
                     marker_color='rgba(0,150,136,0.6)'), row=2, col=1)

# 布局设置
fig.update_layout(title='纳斯达克 交互式K线图',
                  xaxis_title='日期',
                  yaxis_title='价格 (USD)',
                  template='plotly_white',
                  height=700)

fig.show()

你想想看,用 plotly 做出来的图,鼠标移到某根 K 线上,开盘价、最高价、最低价、收盘价全显示出来。做复盘分析时特别方便。

4.5 双轴联动:成交量与价格的关系

成交量是价格的「燃料」。价涨量增,说明上涨有支撑;价涨量缩,可能是虚涨。我习惯把成交量放在 K 线图下方,用不同颜色区分涨跌。

# 用颜色区分成交量:涨为红色,跌为绿色
colors = ['red' if close >= open else 'green'
          for close, open in zip(df['Close'], df['Open'])]

fig = make_subplots(rows=2, cols=1, shared_xaxes=True,
                    vertical_spacing=0.05,
                    row_heights=[0.7, 0.3])

# K线图(同上)
fig.add_trace(go.Candlestick(
    x=df.index, open=df['Open'], high=df['High'],
    low=df['Low'], close=df['Close'], name='K线'
), row=1, col=1)

# 成交量(带颜色)
fig.add_trace(go.Bar(x=df.index, y=df['Volume'],
                     name='成交量',
                     marker_color=colors), row=2, col=1)

fig.update_layout(title='价量关系图', height=700)
fig.show()

注意: 成交量数据有时会缺失,尤其是从某些免费接口获取的数据。我在项目中遇到过某天成交量突然为0的情况,其实是数据源的问题。建议先做数据清洗,把缺失值填充或删除。

4.6 我的个人经验总结

做数据可视化,有几点心得分享给你:

  • 先看整体,再看局部。 我习惯先看一年的 K 线图,了解大趋势,再放大看最近一个月。
  • 均线不是越多越好。 有人喜欢画七八条均线,图上一团乱麻。我个人觉得 3 条足够:短期、中期、长期。
  • 成交量是验证信号。 光看价格形态容易误判,配合成交量能过滤掉很多假突破。
  • 交互式 vs 静态: 做研究用 plotly,做报告用 matplotlib。各取所长。

好了,这一章的内容就这些。数据可视化是量化交易的眼睛,图看得明白,策略才能做得踏实。下一章我们会聊技术指标的计算与应用,到时候再细说。


专注资料整理