【Matplotlib学习日记】股票涨跌幅与交易量的多维可视化分析

一、背景与目标

最近在学习使用Matplotlib进行金融数据的可视化分析,尝试通过一个实际案例理解如何将多个维度的数据(价格涨跌、交易量、开盘-收盘价关系)融合在一张图中。本文基于Matplotlib官方示例代码,解析其实现逻辑,并分享调试过程中的心得体会。

二、代码解析

1. 数据加载与处理

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cbook as cbook

# 加载Google股票数据
price_data = cbook.get_sample_data('goog.npz')['price_data']
price_data = price_data[-250:]  # 取最近250个交易日数据
  • 关键点:使用matplotlib.cbook内置的示例数据,截取最近250天数据,保证分析的时效性。

2. 计算涨跌幅(Delta)

delta1 = np.diff(price_data["adj_close"]) / price_data["adj_close"][:-1]
  • 公式: 
  • 解释:计算每日调整后收盘价的百分比变化,反映股价波动。

3. 定义散点图参数

volume = (15 * price_data["volume"][:-2] / pricec_data["volume"][0])**2  # 点的大小(交易量)
close = price_data["close"][:-2] / price_data["open"][:-2]  # 修正后的颜色参数(收盘价/开盘价)
  • 问题修复:原始代码中close的计算有误(实际为close * open),修正为收盘价与开盘价的比率,反映当日价格趋势。

4. 绘制多维散点图

fig, ax = plt.subplots()
ax.scatter(delta1[:-1], delta1[1:], c=close, s=volume, alpha=0.5, cmap='coolwarm')

# 添加标签和样式
ax.set_xlabel(r'$\Delta_i$', fontsize=15)
ax.set_ylabel(r'$\Delta_{i+1}$', fontsize=15)
ax.set_title('Volume and Percent Change (Color: Close/Open Ratio)')
ax.grid(True)
plt.colorbar(ax.collections[0], label='Close/Open Ratio')
fig.tight_layout()
plt.show()
  • 参数说明
    • c=close:颜色映射为收盘价/开盘价比率(>1为红色,表示当日上涨;<1为蓝色,表示下跌)。
    • s=volume:点的大小反映交易量。
    • alpha=0.5:半透明效果避免重叠遮挡。

三、结果与可视化

1. 输出图表

2. 图表解读

  • 横纵轴:相邻两日的涨跌幅(Δ_i 和 Δ_{i+1}),用于分析价格变化的连续性或反转性。
  • 点大小:交易量越大,点面积越大。图中右下方的大点表示某日大跌后次日反弹,且伴随高交易量。
  • 颜色:红色点(收盘价 > 开盘价)多集中在右上象限,说明上涨日次日继续上涨的概率较高。

四、心得体会

1. 调试中的发现

  • 数据对齐陷阱:原始代码中volumeclose使用[:-2]切片,而delta1长度为249(因为np.diff减少1个元素)。最终通过delta1[:-1]delta1[1:]对齐到248个点,需特别注意数组长度的匹配。
  • 颜色映射优化:将cmap改为coolwarm并添加颜色条,使图表更直观。

2. 多维数据可视化的价值

  • 信息密度:通过点位置、大小、颜色三个维度,单图传递了价格趋势、交易量、开盘-收盘关系三种信息。
  • 模式识别:观察点的分布,可推测该股票可能存在短期动量效应(连续上涨/下跌)。

3. 改进方向

  • 添加趋势线:用np.polyfit拟合一条回归线,分析Δ_i与Δ_{i+1}的相关性。
  • 交互式探索:结合Plotly库生成可交互图表,方便查看每个点的具体数值。

五、完整代码

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cbook as cbook

# 加载Google股票数据
price_data = cbook.get_sample_data('goog.npz')['price_data']
price_data = price_data[-250:]  # 取最近250个交易日数据

delta1 = np.diff(price_data["adj_close"]) / price_data["adj_close"][:-1]

volume = (15 * price_data["volume"][:-2] / pricec_data["volume"][0])**2  # 点的大小(交易量)
close = price_data["close"][:-2] / price_data["open"][:-2]  # 修正后的颜色参数(收盘价/开盘价)

fig, ax = plt.subplots()
ax.scatter(delta1[:-1], delta1[1:], c=close, s=volume, alpha=0.5, cmap='coolwarm')

# 添加标签和样式
ax.set_xlabel(r'$\Delta_i$', fontsize=15)
ax.set_ylabel(r'$\Delta_{i+1}$', fontsize=15)
ax.set_title('Volume and Percent Change (Color: Close/Open Ratio)')
ax.grid(True)
plt.colorbar(ax.collections[0], label='Close/Open Ratio')
fig.tight_layout()
plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值