目录
在金融数据分析中,比较不同公司的股票价格走势是常见的需求。我们将使用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()