文章目录
- [📊 一图胜千言](#📊 一图胜千言)
-
- [🧱 Matplotlib 与 Seaborn](#🧱 Matplotlib 与 Seaborn)
- [🦸 Seaborn](#🦸 Seaborn)
- [🐮 实战:绘制贵州茅台收盘价走势图](#🐮 实战:绘制贵州茅台收盘价走势图)
- [🗺️ 图表选型速查:面对不同数据,该画什么图?](#🗺️ 图表选型速查:面对不同数据,该画什么图?)
- [✨ 总结](#✨ 总结)
📊 一图胜千言
"一图胜千言" ------ 尤其当你要面对成百上千只股票的时序数据时,一张精心设计的图表,往往比十张统计表格更能揭示规律。
在 Python 量化分析中,可视化不是"画漂亮图"那么简单,它是你探索数据、验证假设、甚至向他人传递交易逻辑的关键手段。
主要使用两个黄金组合:Matplotlib 与 Seaborn。
🧱 Matplotlib 与 Seaborn

- Matplotlib 是 Python 最底层的绘图库,它提供了完整的画布、坐标轴、图例等基础元素,灵活度极高,但做一张好看的统计图往往需要几十行配置代码。
- Seaborn 是建立在 Matplotlib 之上的高级接口,它把散点图、箱线图、热力图等统计图表封装成一行函数,同时自带优雅的颜色主题和分组处理能力。
#mermaid-svg-TwwewNlziji94hmY{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-TwwewNlziji94hmY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-TwwewNlziji94hmY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-TwwewNlziji94hmY .error-icon{fill:#552222;}#mermaid-svg-TwwewNlziji94hmY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-TwwewNlziji94hmY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-TwwewNlziji94hmY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-TwwewNlziji94hmY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-TwwewNlziji94hmY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-TwwewNlziji94hmY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-TwwewNlziji94hmY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-TwwewNlziji94hmY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-TwwewNlziji94hmY .marker.cross{stroke:#333333;}#mermaid-svg-TwwewNlziji94hmY svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-TwwewNlziji94hmY p{margin:0;}#mermaid-svg-TwwewNlziji94hmY .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-TwwewNlziji94hmY .cluster-label text{fill:#333;}#mermaid-svg-TwwewNlziji94hmY .cluster-label span{color:#333;}#mermaid-svg-TwwewNlziji94hmY .cluster-label span p{background-color:transparent;}#mermaid-svg-TwwewNlziji94hmY .label text,#mermaid-svg-TwwewNlziji94hmY span{fill:#333;color:#333;}#mermaid-svg-TwwewNlziji94hmY .node rect,#mermaid-svg-TwwewNlziji94hmY .node circle,#mermaid-svg-TwwewNlziji94hmY .node ellipse,#mermaid-svg-TwwewNlziji94hmY .node polygon,#mermaid-svg-TwwewNlziji94hmY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-TwwewNlziji94hmY .rough-node .label text,#mermaid-svg-TwwewNlziji94hmY .node .label text,#mermaid-svg-TwwewNlziji94hmY .image-shape .label,#mermaid-svg-TwwewNlziji94hmY .icon-shape .label{text-anchor:middle;}#mermaid-svg-TwwewNlziji94hmY .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-TwwewNlziji94hmY .rough-node .label,#mermaid-svg-TwwewNlziji94hmY .node .label,#mermaid-svg-TwwewNlziji94hmY .image-shape .label,#mermaid-svg-TwwewNlziji94hmY .icon-shape .label{text-align:center;}#mermaid-svg-TwwewNlziji94hmY .node.clickable{cursor:pointer;}#mermaid-svg-TwwewNlziji94hmY .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-TwwewNlziji94hmY .arrowheadPath{fill:#333333;}#mermaid-svg-TwwewNlziji94hmY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-TwwewNlziji94hmY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-TwwewNlziji94hmY .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TwwewNlziji94hmY .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-TwwewNlziji94hmY .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TwwewNlziji94hmY .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-TwwewNlziji94hmY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-TwwewNlziji94hmY .cluster text{fill:#333;}#mermaid-svg-TwwewNlziji94hmY .cluster span{color:#333;}#mermaid-svg-TwwewNlziji94hmY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-TwwewNlziji94hmY .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-TwwewNlziji94hmY rect.text{fill:none;stroke-width:0;}#mermaid-svg-TwwewNlziji94hmY .icon-shape,#mermaid-svg-TwwewNlziji94hmY .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TwwewNlziji94hmY .icon-shape p,#mermaid-svg-TwwewNlziji94hmY .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-TwwewNlziji94hmY .icon-shape .label rect,#mermaid-svg-TwwewNlziji94hmY .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TwwewNlziji94hmY .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-TwwewNlziji94hmY .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-TwwewNlziji94hmY :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Python 环境
Matplotlib
万能地基
Seaborn
统计图形精装房
一行代码绘制
散点/箱线/热力...
内置漂亮主题
及配色方案
自动处理分类
与分组数据
自定义任意元素
(坐标轴/图例/标注)
简单说:先用 Seaborn 快速出图,再用 Matplotlib 微调细节 ------ 推荐的实战套路。
🦸 Seaborn
下表清晰归纳了 Seaborn 最常用的能力。
| 序号 | 能力分类 | 具体说明 | 一行代码示例 |
|---|---|---|---|
| 1 | 统计图形开箱即用 | 散点图、折线图、直方图、箱线图、小提琴图等,无需手动组装 | sns.scatterplot(x='列1', y='列2', data=df) |
| 2 | 美观主题一键切换 | darkgrid、whitegrid、dark、white、ticks 五种风格,瞬间改变图表气质 |
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,那说明你的组合分散化程度很低,一旦市场回调,所有持仓都会一起下跌。热力图就是"分散度体检报告"。
🐮 实战:绘制贵州茅台收盘价走势图
python
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()压平即可。 - 手动加了
grid和tight_layout,这是 Matplotlib 的补充修饰,体现了"Seaborn 出图 + Matplotlib 微调"。

🗺️ 图表选型速查:面对不同数据,该画什么图?
很多同学拿到数据后第一反应是"我该画什么图"?下面这张速查表覆盖了量化分析中最常见的场景,并附上选择理由和典型应用。
| 你想要揭示的信息 | 推荐图表类型 | Seaborn / Matplotlib 函数 | 量化场景举例 |
|---|---|---|---|
| 📈 价格/净值随时间的变化趋势 | 折线图 | sns.lineplot 或 plt.plot |
展示某只股票或策略的累计收益曲线 |
| 🔥 多只股票收益率之间的相关性 | 热力图 | sns.heatmap(df.corr()) |
检查股票池内联动性,优化分散化配置 |
| 📊 收益率分布形态(是否对称、肥尾) | 直方图 + KDE 密度曲线 | sns.histplot 或 sns.kdeplot |
判断收益是否近似正态,识别极端风险 |
| 📦 分组数据的分布对比(如行业、月份) | 箱线图 / 小提琴图 | sns.boxplot 或 sns.violinplot |
对比不同行业板块的月度收益率中位数和离散度 |
| 🔗 两个变量之间的关系(如个股 vs 大盘) | 散点图 + 回归线 | sns.scatterplot 或 sns.regplot |
计算 Beta 系数(个股收益与市场收益的线性关系) |
| 🧮 成交量与价格配合情况 | 柱状图(成交量)+ 折线图(价格) | plt.bar + plt.twinx() |
量价配合分析,观察放量上涨或缩量下跌等形态 |
| 🕯️ 每日开盘/收盘/最高/最低四价信息 | K 线图(蜡烛图) | pyecharts.Kline 或 mplfinance |
日内多空力量博弈,识别支撑/阻力位 |
| 🧩 多个子集的对比(如不同市场、不同策略) | 分面网格图 | sns.relplot 或 sns.catplot 的 col/row 参数 |
同时对比 A 股、港股、美股在同一时期的走势差异 |
💡 选型小贴士:
- 先问自己"我想从数据中看到什么"------是趋势、分布、还是关系?
- 再问"我的数据有几个维度"(比如时间、类别、数值),匹配上表即可。
✨ 总结
Seaborn 用更少的代码,得到更专业的统计图表。在量化研究中,它能帮你快速完成探索性数据分析(EDA),让你把更多精力放在策略逻辑上,而不是调色板和刻度线。
如果你已经熟悉 Matplotlib,那么 Seaborn 会让你如虎添翼;如果你是新手,那就从 Seaborn 开始,它平缓的学习曲线会让你迅速爱上数据可视化。🎨