📊 一图胜千言

“一图胜千言” —— 尤其当你要面对成百上千只股票的时序数据时,一张精心设计的图表,往往比十张统计表格更能揭示规律。

在 Python 量化分析中,可视化不是“画漂亮图”那么简单,它是你探索数据、验证假设、甚至向他人传递交易逻辑的关键手段。
主要使用两个黄金组合:MatplotlibSeaborn


🧱 Matplotlib 与 Seaborn

在这里插入图片描述

  • Matplotlib 是 Python 最底层的绘图库,它提供了完整的画布、坐标轴、图例等基础元素,灵活度极高,但做一张好看的统计图往往需要几十行配置代码。
  • Seaborn 是建立在 Matplotlib 之上的高级接口,它把散点图、箱线图、热力图等统计图表封装成一行函数,同时自带优雅的颜色主题和分组处理能力。

Python 环境

Matplotlib
万能地基

Seaborn
统计图形精装房

一行代码绘制
散点/箱线/热力…

内置漂亮主题
及配色方案

自动处理分类
与分组数据

自定义任意元素
(坐标轴/图例/标注)

简单说:先用 Seaborn 快速出图,再用 Matplotlib 微调细节 —— 推荐的实战套路。


🦸 Seaborn

下表清晰归纳了 Seaborn 最常用的能力。

序号能力分类具体说明一行代码示例
1统计图形开箱即用散点图、折线图、直方图、箱线图、小提琴图等,无需手动组装sns.scatterplot(x='列1', y='列2', data=df)
2美观主题一键切换darkgridwhitegriddarkwhiteticks 五种风格,瞬间改变图表气质sns.set_style("whitegrid")
3内置经典数据集tips(小费)、iris(鸢尾花)、flights(航班)等,便于练手和演示tips = sns.load_dataset("tips")
4分类数据自动分组根据类别变量自动分配颜色、分组绘制柱状图/箱线图,并生成图例sns.barplot(x='day', y='total_bill', hue='sex', data=tips)
5矩阵数据热力图将相关性矩阵可视化为“温度图”,颜色越深代表相关性越强,量化分析中的神器sns.heatmap(df.corr(), annot=True, cmap='coolwarm')
6分面网格绘图按一个或两个类别变量生成子图矩阵,轻松对比不同子集的数据分布sns.relplot(x='x', y='y', col='category', data=df)

在这里插入图片描述

⭐ 热力图在量化中的经典场景:
持有一个股票池,想检查它们是否“同涨同跌”。计算每日收益率矩阵的相关系数,然后画一张热力图——颜色越深(正相关)表示两只股票走势越同步。如果你发现大部分股票之间相关系数都接近 +0.8,那说明你的组合分散化程度很低,一旦市场回调,所有持仓都会一起下跌。热力图就是“分散度体检报告”。


🐮 实战:绘制贵州茅台收盘价走势图

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

# 1️⃣ 下载贵州茅台(A股代码 600519.SS)的历史数据
maotai_data = yf.download("600519.SS", start="2020-01-01", end="2023-01-01")

# 2️⃣ 提取收盘价列 —— 注意 yfinance 返回的是 MultiIndex 列(含 'Close' 层级)
#    直接用 maotai_data['Close'] 得到一个 Series,索引是日期,值就是收盘价
closing_prices = maotai_data['Close']

# 3️⃣ 检查数据:closing_prices 是一个 Pandas Series,索引为日期,值是一维数组
#    不再需要 .values.flatten(),因为 Series 本身就是一维的。
#    如果直接用 maotai_data[('Close', '600519.SS')] 也可以,但更推荐上述写法。

# 4️⃣ 用 Seaborn 绘制折线图,美观且省心
plt.figure(figsize=(12, 6))                     # 设置画布大小(宽12英寸,高6英寸)
sns.lineplot(
    x=closing_prices.index,                     # x轴为日期索引
    y=closing_prices.values,                    # y轴为收盘价数值(一维)
    label='茅台收盘价',
    color='#2E86C1'                             # 自定义一种沉稳的蓝色
)

# 5️⃣ 添加标题和轴标签(Seaborn 不会自动生成中文标题,需手动设置)
plt.title('贵州茅台 (600519.SS) 收盘价走势 (2020-2022)', fontsize=16)
plt.xlabel('日期', fontsize=12)
plt.ylabel('收盘价 (人民币元)', fontsize=12)
plt.legend()
plt.grid(True, linestyle='--', alpha=0.5)      # 添加网格,辅助读数
plt.tight_layout()                              # 自动调整边距,防止标签被裁剪
plt.show()

🔍 关键细节解读

  • 新版 yfinance(>=0.2.0)默认返回的 DataFrame 列是 MultiIndex,例如 ('Close', '600519.SS')。但当我们直接取 maotai_data['Close'] 时,Pandas 会自动降维成一个普通的 Series,索引不变,值就是收盘价。
  • 如果遇到报错 ValueError: y must be a 1D array,多半是因为你传入了二维 DataFrame,此时用 .squeeze().values.ravel() 压平即可。
  • 手动加了 gridtight_layout,这是 Matplotlib 的补充修饰,体现了“Seaborn 出图 + Matplotlib 微调”。

在这里插入图片描述


🗺️ 图表选型速查:面对不同数据,该画什么图?

很多同学拿到数据后第一反应是“我该画什么图”?下面这张速查表覆盖了量化分析中最常见的场景,并附上选择理由和典型应用。

你想要揭示的信息推荐图表类型Seaborn / Matplotlib 函数量化场景举例
📈 价格/净值随时间的变化趋势折线图sns.lineplotplt.plot展示某只股票或策略的累计收益曲线
🔥 多只股票收益率之间的相关性热力图sns.heatmap(df.corr())检查股票池内联动性,优化分散化配置
📊 收益率分布形态(是否对称、肥尾)直方图 + KDE 密度曲线sns.histplotsns.kdeplot判断收益是否近似正态,识别极端风险
📦 分组数据的分布对比(如行业、月份)箱线图 / 小提琴图sns.boxplotsns.violinplot对比不同行业板块的月度收益率中位数和离散度
🔗 两个变量之间的关系(如个股 vs 大盘)散点图 + 回归线sns.scatterplotsns.regplot计算 Beta 系数(个股收益与市场收益的线性关系)
🧮 成交量与价格配合情况柱状图(成交量)+ 折线图(价格)plt.bar + plt.twinx()量价配合分析,观察放量上涨或缩量下跌等形态
🕯️ 每日开盘/收盘/最高/最低四价信息K 线图(蜡烛图)pyecharts.Klinemplfinance日内多空力量博弈,识别支撑/阻力位
🧩 多个子集的对比(如不同市场、不同策略)分面网格图sns.relplotsns.catplotcol/row 参数同时对比 A 股、港股、美股在同一时期的走势差异

💡 选型小贴士

  • 先问自己“我想从数据中看到什么”——是趋势、分布、还是关系?
  • 再问“我的数据有几个维度”(比如时间、类别、数值),匹配上表即可。

✨ 总结

Seaborn 用更少的代码,得到更专业的统计图表。在量化研究中,它能帮你快速完成探索性数据分析(EDA),让你把更多精力放在策略逻辑上,而不是调色板和刻度线。

如果你已经熟悉 Matplotlib,那么 Seaborn 会让你如虎添翼;如果你是新手,那就从 Seaborn 开始,它平缓的学习曲线会让你迅速爱上数据可视化。🎨

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐