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()