【 Python 量化交易】第6章:数据可视化

文章目录

  • [📊 一图胜千言](#📊 一图胜千言)
    • [🧱 Matplotlib 与 Seaborn](#🧱 Matplotlib 与 Seaborn)
    • [🦸 Seaborn](#🦸 Seaborn)
    • [🐮 实战:绘制贵州茅台收盘价走势图](#🐮 实战:绘制贵州茅台收盘价走势图)
    • [🗺️ 图表选型速查:面对不同数据,该画什么图?](#🗺️ 图表选型速查:面对不同数据,该画什么图?)
    • [✨ 总结](#✨ 总结)

📊 一图胜千言

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

在 Python 量化分析中,可视化不是"画漂亮图"那么简单,它是你探索数据、验证假设、甚至向他人传递交易逻辑的关键手段。

主要使用两个黄金组合:MatplotlibSeaborn


🧱 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 美观主题一键切换 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,那说明你的组合分散化程度很低,一旦市场回调,所有持仓都会一起下跌。热力图就是"分散度体检报告"。


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

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() 压平即可。
  • 手动加了 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 开始,它平缓的学习曲线会让你迅速爱上数据可视化。🎨

相关推荐
多多鼠17 分钟前
Tool Calling的信任边界:从协议校验到执行沙箱的完整链路设计
运维·开发语言·网络·人工智能·python·langchain
啊阿狸不会拉杆20 分钟前
《计算机网络-自顶向下方法》1.5 协议层次及其服务模型 读书笔记
开发语言·计算机网络·php
tryxr26 分钟前
Chat2Excel 项目通用服务开发
java·开发语言·excel·java项目开发
Jazz_z33 分钟前
使用 Python 合并与取消合并 Excel 单元格
开发语言·python·excel
Lenyiin34 分钟前
第6篇_Python高级语法与标准库精髓:从会用到达精通
java·python·html
ZGG00340 分钟前
真题拆解 05:ReAct 还是 Plan-and-Execute——规划范式怎么选
python·agent·react
斑马13941 分钟前
Linux软件编程学习笔记(十)——网络(二)——TCP通信
开发语言·网络·php