第四章 数据可视化基础:K线图、移动平均线、成交量与自相关图

做金融时间序列,第一步不是建模,而是「看数据」。

我见过太多人一上来就扔模型,结果跑出来的东西自己都看不懂。为什么?因为没先做可视化诊断。数据长什么样,有没有趋势,有没有周期,有没有异常点——这些信息,一张图就能告诉你。

这一章,我们就把金融可视化最核心的四个工具讲透:K线图、移动平均线、成交量图、ACF/PACF自相关图。嗯,都是实战里天天用的东西。

4.1 K线图:金融数据的「心电图」

K线图,说白了就是把一天(或一个周期)的股价浓缩成一根蜡烛。开盘价、收盘价、最高价、最低价,四个数字,一根柱子。

我个人习惯用 mplfinance 这个库,比 matplotlib 原生画K线方便太多。你想想看,如果自己用 bar 和 line 拼凑,代码得写几十行,还容易出错。

核心概念:

  • 阳线(红色/空心):收盘价 > 开盘价,表示上涨
  • 阴线(绿色/实心):收盘价 < 开盘价,表示下跌
  • 上影线:最高价到实体顶部的距离,代表冲高回落
  • 下影线:最低价到实体底部的距离,代表探底回升
import mplfinance as mpf
import yfinance as yf

# 下载数据
data = yf.download('AAPL', start='2024-01-01', end='2024-03-01')

# 画K线图
mpf.plot(data, type='candle', volume=True, style='charles',
         title='AAPL K线图', figsize=(12, 8))

我在项目中遇到过一个问题:数据里如果有空值,mplfinance 会直接报错。所以画图前,记得先 dropna() 一下。曾经有个同事没注意这个,调试了半小时才发现是数据缺了一天。

小技巧:K线图的周期可以灵活调整。日线看趋势,60分钟线找买卖点,5分钟线做高频交易。不同周期,看到的信号完全不同。

4.2 移动平均线:趋势的「平滑器」

K线图太「毛躁」了,一天涨一天跌的,看不清方向。这时候就需要移动平均线(MA)出场。

移动平均线,说白了就是把过去N天的收盘价取个平均值,然后连成一条线。它能帮你过滤掉短期的噪音,看到真正的趋势。

常用的几根均线:

均线 周期 用途
MA5 5日 短线趋势,超强势股的生命线
MA20 20日 中线趋势,月线级别支撑/压力
MA60 60日 长线趋势,季线级别牛熊分界线
MA120 120日 半年线,大周期趋势参考
# 计算移动平均线
data['MA5'] = data['Close'].rolling(window=5).mean()
data['MA20'] = data['Close'].rolling(window=20).mean()
data['MA60'] = data['Close'].rolling(window=60).mean()

# 画图
mpf.plot(data, type='candle', volume=True, style='charles',
         mav=(5, 20, 60),  # 直接传入均线周期
         title='AAPL with MA5/MA20/MA60', figsize=(12, 8))

避坑指南:我曾经犯过一个低级错误——用未来数据算均线。rolling 默认是中心窗口,如果你不设置 center=False,它会用前后各一半的数据算平均值。这在回测里是致命的,因为你会「看到」未来的价格。

均线的交叉信号也很经典:MA5 上穿 MA20 叫「金叉」,看涨;MA5 下穿 MA20 叫「死叉」,看跌。但别迷信这个,震荡市里金叉死叉来回切换,你会被反复打脸。

4.3 成交量图:价格的「燃料」

价格可以骗人,成交量不会。

你想想看,一只股票无量涨停,说明没人卖,但也没人买(除了封板的)。一旦放量,说明多空分歧加大,趋势可能要变了。

成交量图通常放在K线图下方,用柱状图表示。mplfinance 里设置 volume=True 就能自动画出来。

量价关系口诀(我自己的总结):

  • 价涨量增:健康上涨,趋势延续
  • 价涨量缩:上涨乏力,可能见顶
  • 价跌量增:恐慌抛售,可能见底
  • 价跌量缩:阴跌不止,没人接盘

我在做量化策略时,经常把成交量作为过滤条件。比如:只做成交量大于20日均量1.5倍的股票。为什么?因为没成交量的股票,流动性差,你买进去容易,卖出来难。

4.4 自相关图(ACF/PACF):时间序列的「记忆」

这是时间序列建模里最核心的可视化工具,没有之一。

ACF(自相关函数)衡量的是:当前值和过去第k个值之间的相关性。PACF(偏自相关函数)衡量的是:剔除中间变量影响后,当前值和过去第k个值的直接相关性。

说白了,ACF看的是「总的相关性」,PACF看的是「纯的相关性」。

import statsmodels.api as sm
import matplotlib.pyplot as plt

# 计算ACF和PACF
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
sm.graphics.tsa.plot_acf(data['Close'].dropna(), lags=30, ax=axes[0])
sm.graphics.tsa.plot_pacf(data['Close'].dropna(), lags=30, ax=axes[1])
plt.show()

怎么看这两张图?

  • 如果ACF拖尾(缓慢衰减),PACF在p阶后截尾(突然掉到置信区间内)→ 适合AR(p)模型
  • 如果ACF在q阶后截尾,PACF拖尾 → 适合MA(q)模型
  • 如果两者都拖尾 → 适合ARMA模型
  • 如果两者都截尾 → 可能是白噪声,别建模了

实战经验:我刚开始学的时候,总觉得ACF/PACF的「截尾」和「拖尾」很难判断。后来发现一个笨办法:看蓝色置信区间。如果某个滞后阶数的柱子明显超出蓝色区域,那就是显著的。超出几个,阶数就是几。

嗯,这里要注意:ACF/PACF对非平稳序列是无效的。如果序列有趋势或季节性,ACF会呈现缓慢衰减,看起来像拖尾,其实是假的。所以画ACF之前,先确认序列是否平稳。怎么确认?下一章讲单位根检验时会细说。

4.5 本章知识体系

下面这张图,是我自己梳理的可视化知识框架。你照着这个顺序学,不会乱。

金融时间序列可视化知识体系 数据可视化基础 K线图 移动平均线 成交量图 ACF/PACF 开盘/收盘/最高/最低 阳线/阴线 上影线/下影线 MA5/MA20/MA60 金叉/死叉 趋势判断 量价关系 放量/缩量 流动性过滤 自相关函数 偏自相关函数 截尾/拖尾判断 先看K线 + 成交量 → 再看均线 → 最后ACF/PACF定阶 这是我自己总结的「三步走」流程,实战中很管用

这张图里,我特意把「三步走」流程放在最下面。先看K线和成交量,了解价格和资金动向;再看均线,确认趋势方向;最后用ACF/PACF,为建模定阶。顺序别搞反了。

本章核心要点:

  1. K线图是基础,但别只看一根K线,要看组合形态
  2. 移动平均线有滞后性,别用它做短线预测
  3. 成交量是价格的先行指标,量在价先
  4. ACF/PACF是建模的「眼睛」,但前提是数据平稳

好了,这一章的内容就这些。可视化是基本功,但也是很多人容易忽略的环节。我见过太多人花几周调模型参数,却不愿意花10分钟画张图看看数据长什么样。嗯,希望你不是这样的人。


公众号:蓝海数据掘金营,微信deep3321