Python 量化数据可视化

Python 量化数据可视化主要使用 Matplotlib 和 Seaborn 两个库。

安装可以在终端或命令提示符中运行:

pip install matplotlib seaborn

Matplotlib 的系统用法可以参考:Matplotlib 教程。

本篇重点介绍 Seaborn 在量化数据分析中的应用。


Seaborn 库

Seaborn 是一个基于 Matplotlib 的数据可视化库,专注于统计图形的绘制。

它在 Matplotlib 之上提供了更高层次的接口和更美观的默认主题,用更少的代码画出更好看的统计图表。

快速绘制统计图形

Seaborn 内置了一批经典数据集,配合内置绘图函数,一行代码就能画出统计图形:

实例

import seaborn as sns
import matplotlib.pyplot as plt

# 加载内置的 tips 数据集(餐厅小费数据)
tips = sns.load_dataset("tips")

# 绘制消费金额与小费的散点图,按用餐时间着色
sns.scatterplot(x="total_bill", y="tip", hue="time", data=tips)
plt.title("Total Bill vs Tip")
plt.show()

函数名即图形类型:scatterplot 散点图、lineplot 折线图、barplot 柱状图、histplot 直方图,对初学者非常友好。

主题与样式

Seaborn 提供内置主题,一行代码改变图表外观:

实例

import seaborn as sns

# 使用白色网格主题,还有 darkgrid、white、dark、ticks 可选
sns.set(style="whitegrid")

分类数据的可视化

对于带分类维度的数据,Seaborn 可以轻松创建分组柱状图、箱线图等:

实例

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset("tips")

# 按星期分组绘制消费金额柱状图,hue 参数按性别再分一组
sns.barplot(x="day", y="total_bill", hue="sex", data=tips)
plt.title("Average Bill by Day and Gender")
plt.show()

矩阵数据的可视化

Seaborn 提供专门可视化矩阵数据的函数,最常用的是热力图(heatmap),量化中常用来展示相关性矩阵:

实例

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# 生成一个 5x5 的随机矩阵
matrix = np.random.rand(5, 5)

# 绘制热力图,annot=True 在格子里显示数值
sns.heatmap(matrix, annot=True, cmap="coolwarm")
plt.show()

分面绘图

分面绘图可以根据数据的子集创建多个小图,全面展示数据在不同维度下的表现:

实例

import seaborn as sns

tips = sns.load_dataset("tips")

# col="time" 按用餐时间拆成左右两张子图
sns.relplot(x="total_bill", y="tip", hue="day", col="time", data=tips)

量化实例:股价走势图

进入量化场景,结合 yfinance 获取贵州茅台(600519.SS)的股票数据,然后用 Seaborn 绘制收盘价走势图:

实例

import yfinance as yf
import seaborn as sns
import matplotlib.pyplot as plt

# 获取贵州茅台的股票数据
maotai_data = yf.download("600519.SS", start="2020-01-01", end="2023-01-01",
                          progress=False, multi_level_index=False)

# 选取收盘价数据
closing_prices = maotai_data["Close"]

# 使用 seaborn 绘制走势图
plt.figure(figsize=(12, 6))
sns.lineplot(x=closing_prices.index, y=closing_prices.values,
             label="Maotai Closing Prices")
plt.title("Maotai Stock Closing Prices Over Time")
plt.xlabel("Date")
plt.ylabel("Closing Price (CNY)")
plt.legend()
plt.show()

执行以上代码,输出结果为:

相比直接用 Matplotlib,Seaborn 的默认配色与网格让图表质感明显更好,且代码量几乎相同。


量化实例:多股票相关性热力图

相关性分析是组合研究的起点:如果两只股票涨跌高度同步,同时持有它们起不到分散风险的作用。

下面的实例计算白酒板块三只龙头股(贵州茅台、五粮液、泸州老窖)日收益率之间的相关性,并用热力图展示:

实例

import yfinance as yf
import seaborn as sns
import matplotlib.pyplot as plt

# 三只白酒龙头股:贵州茅台、五粮液、泸州老窖
symbols = ["600519.SS", "000858.SZ", "000568.SZ"]

# 下载 2023 年全年收盘价
close = yf.download(symbols, start="2023-01-01", end="2023-12-31",
                    progress=False, multi_level_index=False)["Close"]

# 计算日收益率,再计算相关性矩阵
corr = close.pct_change().corr()
print(corr.round(3))

# 绘制相关性热力图
plt.figure(figsize=(8, 6))
sns.heatmap(corr, annot=True, cmap="coolwarm", vmin=-1, vmax=1, square=True)
plt.title("Correlation of Daily Returns (Baijiu Stocks 2023)")
plt.show()

先看输出的相关性矩阵:

Ticker     000568.SZ  000858.SZ  600519.SS
Ticker
000568.SZ      1.000      0.842      0.773
000858.SZ      0.842      1.000      0.770
600519.SS      0.773      0.770      1.000

三只股票两两相关性在 0.77 到 0.84 之间,属于高度相关。

这说明同行业股票往往同涨同跌,构建投资组合时应避免资金过度集中在单一行业,否则"分散"只是形式上的。

执行代码后还会弹出热力图,效果如下图所示(颜色越红代表相关性越强):

泸州老窖 五粮液 贵州茅台 泸州老窖 五粮液 贵州茅台 1.00 0.84 0.77 0.84 1.00 0.77 0.77 0.77 1.00 -1 0 +1

注意:vmin=-1, vmax=1 把色条范围固定在相关性的理论区间,让不同图表之间可以直接对比;不加这个参数时,色条范围会随数据自动伸缩。


选型建议

Matplotlib 和 Seaborn 不是二选一的关系,实践中通常配合使用:

场景 推荐工具
快速探索数据、统计图表 Seaborn,代码少、默认样式好
精细控制图表每个细节 Matplotlib,自由度最高
量化专属图形(K 线图等) 需要专门库,见 股票 K 线图
网页交互式图表 pyecharts、Plotly