当前位置: 首页 > news >正文

Python与Plotly实现多维度数据的动态可视化——交互式股票价格

目录

  • 准备工作
    • 安装必要的库
    • 导入库
  • 获取数据
  • 数据预处理
  • 创建交互式图表
    • 方法一:基本多线图
    • 方法二:带有滚动和区间选择的交互式图表
    • 方法三:可视化股票每日回报率的箱线图
    • 方法四:添加注释和标记的交互式图表
  • 完整代码

在金融数据分析中,比较不同公司的股票价格走势是常见的需求。我们将使用Python和Plotly创建一个包含多个股票价格的交互式可视化图表,展示它们在一段时间内的表现。

准备工作

安装必要的库

首先,确保安装了以下Python库:

!pip install pandas
!pip install plotly
!pip install yfinance
  • pandas:用于数据处理和分析。
  • plotly:用于创建交互式可视化。
  • yfinance:用于从Yahoo Finance获取历史股票数据。

导入库

import pandas as pd
import plotly.graph_objs as go
import yfinance as yf
from datetime import datetime

获取数据

我们将选择几家著名的科技公司,获取它们过去一年的股票价格数据。

# 定义股票代码和时间范围
stocks = ['AAPL', 'GOOGL', 'MSFT', 'AMZN', 'TSLA']
start_date = '2023-01-01'
end_date = '2023-12-31'# 获取股票数据
stock_data = yf.download(stocks, start=start_date, end=end_date)['Close']

我们使用yfinance库从Yahoo Finance下载股票的收盘价数据,数据范围为2023年全年。

数据预处理

# 检查缺失值并进行填充
stock_data.fillna(method='ffill', inplace=True)# 计算每日回报率
returns = stock_data.pct_change().dropna()

使用前向填充方法处理数据中的缺失值,计算每日回报率以分析股票的波动性。

创建交互式图表

方法一:基本多线图

# 创建基本多线图
fig = go.Figure()for stock in stocks:fig.add_trace(go.Scatter(x=stock_data.index,y=stock_data[stock],mode='lines',name=stock))# 更新布局
fig.update_layout(title='2023年主要科技公司股票价格走势',xaxis_title='日期',yaxis_title='股票价格(美元)',template='plotly_dark',hovermode='x unified'
)# 显示图表
fig.show()

特点:

  • 展示多个股票的价格走势,便于比较。
  • 使用plotly_dark模板,提供深色背景,更加美观。
  • 启用hovermode=‘x unified’,在悬停时同时显示所有股票的价格,方便比较同一天的表现。

在这里插入图片描述

方法二:带有滚动和区间选择的交互式图表

# 创建带有滚动和区间选择的图表
fig = go.Figure()for stock in stocks:fig.add_trace(go.Scatter(x=stock_data.index,y=stock_data[stock],mode='lines',name=stock))# 添加区间滑块和按钮
fig.update_layout(title='2023年主要科技公司股票价格走势(带有区间选择)',xaxis=dict(rangeselector=dict(buttons=list([dict(count=1, label='1个月', step='month', stepmode='backward'),dict(count=3, label='3个月', step='month', stepmode='backward'),dict(count=6, label='6个月', step='month', stepmode='backward'),dict(step='all', label='全年')])),rangeslider=dict(visible=True),type='date'),yaxis_title='股票价格(美元)',template='seaborn'
)# 显示图表
fig.show()

特点:

  • 添加了时间区间选择器,用户可以快速查看特定时间段的股票走势。
  • 底部的范围滑块允许用户自由选择查看的时间范围。
  • 使用seaborn模板,提供简洁清新的视觉效果。

在这里插入图片描述

方法三:可视化股票每日回报率的箱线图

# 创建每日回报率箱线图
fig = go.Figure()for stock in stocks:fig.add_trace(go.Box(y=returns[stock],name=stock,boxmean='sd'  # 显示均值和标准差))# 更新布局
fig.update_layout(title='2023年主要科技公司股票每日回报率分布',yaxis_title='每日回报率',template='ggplot2'
)# 显示图表
fig.show()

特点:

  • 使用箱线图展示每日回报率的分布,直观体现股票的波动性和风险。
  • 显示每个股票的均值和标准差,帮助分析其稳定性。
  • 使用ggplot2模板,提供专业且美观的外观。

在这里插入图片描述

方法四:添加注释和标记的交互式图表

# 选取特定日期进行标记
events = [{'date': '2023-03-15', 'event': '美联储加息'},{'date': '2023-07-10', 'event': '新产品发布'},{'date': '2023-10-25', 'event': '季度财报公布'}
]# 创建图表
fig = go.Figure()for stock in stocks:fig.add_trace(go.Scatter(x=stock_data.index,y=stock_data[stock],mode='lines',name=stock))# 添加事件标记
for event in events:fig.add_vline(x=event['date'], line_width=2, line_dash="dash", line_color="red")fig.add_annotation(x=event['date'],y=stock_data.max().max(),text=event['event'],showarrow=True,arrowhead=1,ax=0,ay=-40)# 更新布局
fig.update_layout(title='2023年主要科技公司股票价格走势(带有重要事件标记)',xaxis_title='日期',yaxis_title='股票价格(美元)',template='plotly_white',hovermode='x unified'
)# 显示图表
fig.show()

特点:

  • 在图表中添加了重要事件的垂直线和注释,帮助用户理解特定日期对股票价格的影响。
  • 事件标记使得图表更加信息丰富,适合用于报告和展示。
  • 使用plotly_white模板,提供简洁专业的外观。

在这里插入图片描述

完整代码

import pandas as pd
import plotly.graph_objs as go
import yfinance as yf
from datetime import datetime# 定义股票代码和时间范围
stocks = ['AAPL', 'GOOGL', 'MSFT', 'AMZN', 'TSLA']
start_date = '2023-01-01'
end_date = '2023-12-31'# 获取股票数据
stock_data = yf.download(stocks, start=start_date, end=end_date)['Close']# 检查缺失值并进行填充
stock_data.fillna(method='ffill', inplace=True)# 计算每日回报率
returns = stock_data.pct_change().dropna()# 创建基本多线图
fig1 = go.Figure()for stock in stocks:fig1.add_trace(go.Scatter(x=stock_data.index,y=stock_data[stock],mode='lines',name=stock))# 更新布局
fig1.update_layout(title='2023年主要科技公司股票价格走势',xaxis_title='日期',yaxis_title='股票价格(美元)',template='plotly_dark',hovermode='x unified'
)# 显示图表
fig1.show()# 创建带有滚动和区间选择的图表
fig2 = go.Figure()for stock in stocks:fig2.add_trace(go.Scatter(x=stock_data.index,y=stock_data[stock],mode='lines',name=stock))# 添加区间滑块和按钮
fig2.update_layout(title='2023年主要科技公司股票价格走势(带有区间选择)',xaxis=dict(rangeselector=dict(buttons=list([dict(count=1, label='1个月', step='month', stepmode='backward'),dict(count=3, label='3个月', step='month', stepmode='backward'),dict(count=6, label='6个月', step='month', stepmode='backward'),dict(step='all', label='全年')])),rangeslider=dict(visible=True),type='date'),yaxis_title='股票价格(美元)',template='seaborn'
)# 显示图表
fig2.show()# 创建每日回报率箱线图
fig3 = go.Figure()for stock in stocks:fig3.add_trace(go.Box(y=returns[stock],name=stock,boxmean='sd'  # 显示均值和标准差))# 更新布局
fig3.update_layout(title='2023年主要科技公司股票每日回报率分布',yaxis_title='每日回报率',template='ggplot2'
)# 显示图表
fig3.show()# 选取特定日期进行标记
events = [{'date': '2023-03-15', 'event': '美联储加息'},{'date': '2023-07-10', 'event': '新产品发布'},{'date': '2023-10-25', 'event': '季度财报公布'}
]# 创建图表
fig4 = go.Figure()for stock in stocks:fig4.add_trace(go.Scatter(x=stock_data.index,y=stock_data[stock],mode='lines',name=stock))# 添加事件标记
for event in events:fig4.add_vline(x=event['date'], line_width=2, line_dash="dash", line_color="red")fig4.add_annotation(x=event['date'],y=stock_data.max().max(),text=event['event'],showarrow=True,arrowhead=1,ax=0,ay=-40)# 更新布局
fig4.update_layout(title='2023年主要科技公司股票价格走势(带有重要事件标记)',xaxis_title='日期',yaxis_title='股票价格(美元)',template='plotly_white',hovermode='x unified'
)# 显示图表
fig4.show()

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • java-集合框架
  • 【AI绘画】Midjourney前置指令/settings设置详解
  • pdf解密软件哪个好用?掌握3个方法,轻松解锁PDF自由查看!
  • Python 爬虫 示例
  • Python测试框架之—— pytest介绍与示例
  • 02 vue3之ref全局桶
  • iOS工程:获取手机相册权限,iOS原生系统弹窗, Privacy隐私政策选择,如何添加系统弹出并修改描述文字
  • -- 数据结构 顺序表 --Java
  • TCP并发服务器多线程和多进程方式以及几种IO模型
  • 【Python】copy()浅拷贝与深拷贝
  • 【牛客_c++_string】HJ1字符串最后一个单词的长度
  • Spring Boot使用拦截器(Interceptor)
  • mysql中group by语句使用
  • 结果一。6.will,begoingto,betodo,beabouttodo结构的区别
  • 在CentOS 7上安装MongoDB的方法
  • hexo+github搭建个人博客
  • [case10]使用RSQL实现端到端的动态查询
  • Angular 响应式表单 基础例子
  • C学习-枚举(九)
  • hadoop集群管理系统搭建规划说明
  • Javascript Math对象和Date对象常用方法详解
  • Javascript基础之Array数组API
  • JAVA之继承和多态
  • 面试遇到的一些题
  • 实战|智能家居行业移动应用性能分析
  • 学习使用ExpressJS 4.0中的新Router
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 原生js练习题---第五课
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • const的用法,特别是用在函数前面与后面的区别
  • 从如何停掉 Promise 链说起
  • 带你开发类似Pokemon Go的AR游戏
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​zookeeper集群配置与启动
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • (27)4.8 习题课
  • (二)Linux——Linux常用指令
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (十三)Flask之特殊装饰器详解
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .JPG图片,各种压缩率下的文件尺寸
  • .net dataexcel winform控件 更新 日志
  • .net 中viewstate的原理和使用
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .Net小白的大学四年,内含面经
  • .NET中 MVC 工厂模式浅析
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [ 物联网 ]拟合模型解决传感器数据获取中数据与实际值的误差的补偿方法
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [《百万宝贝》观后]To be or not to be?