【Matplotlib学习日记】股票涨跌幅与交易量的多维可视化分析
创作时间:
作者:
@小白创作中心
【Matplotlib学习日记】股票涨跌幅与交易量的多维可视化分析
引用
CSDN
1.
https://blog.csdn.net/OAkic/article/details/146225364
一、背景与目标
最近在学习使用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. 调试中的发现
- 数据对齐陷阱:原始代码中
volume
和close
使用[:-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()
热门推荐
2025年全球及中国铬矿行业供需现状分析,全球铬矿供给形成了寡头垄断的市场格局
命名的艺术:探索创意与个性化的名字选择
提高法律意识可以带来哪些好处
CS2 皮肤历史:武器皮肤的演变
医生坦言:100多种病跟同一件事有关……
我用这10招,能减少了80%的BUG
饮食指南:番茄红素的健康益处有哪些?有什么副作用?
蜜蜂疾病观察诊断六个措施
探秘龙岩,一场文化与自然的视觉盛宴
龙珠:天津饭那些被边缘化的角色,正在慢慢被遗忘
内蒙古文科一本大学:人文底蕴与学术之光的交融
免疫治疗,让肺癌不再可怕?最新中国专家共识告诉你真相
2024美洲杯足球赛完整赛程及对阵表
电脑开启卓越性能:解锁硬件潜能的终极指南
机器学习四大任务:回归、分类、聚类与降维
陈胜吴广大起义
《魔兽世界》法师职业全解析:从泰坦到各族法师的起源与发展
力量训练的好处是哪些?
为什么要去专业医疗机构验配隐形眼镜?
从心理学角度看笑点背后的机制
7岁孩子每日癫痫发作六七次,上海专家用神经调控技术不开颅治疗
7代i5低压处理器的性能评估(解析7代i5低压处理器的主要特点及性能表现)
多面体:穿越时空的几何密码
特征值的和等于矩阵的迹:一个重要的线性代数结论
北京小吃店的变迁,京味儿美食正在走向世界
AI如何驱动可持续能源的未来
什么运动对心脏最健康?排名第一的竟然是它
AI赋能工业4.0:制造业变革更广、更快、更优
圣保罗大学研究:12副太阳镜仅1副符合安全标准
信用卡欠款超过十万还不起,后果会怎么样,要坐牢吗?