如何用Plotly在同一页面垂直展示多只股票K线分析图?
解决方案:用Plotly子图垂直排列多只股票的K线+VWAP图
要实现多只股票的K线图(带VWAP)垂直排列在同一页面,核心是使用Plotly的make_subplots创建垂直子图布局,然后在循环中为每个子图添加蜡烛图和VWAP线。以下是完整可运行的代码示例:
步骤说明
- 导入必要库,包括
make_subplots用于创建子图 - 定义股票列表(模拟从CSV读取的股票名称、起止日期)
- 创建对应数量的垂直子图
- 循环处理每只股票,计算VWAP并在对应子图中添加蜡烛图和VWAP线
- 调整布局细节,优化显示效果
完整代码
import yfinance as yf import plotly.graph_objects as go from plotly.subplots import make_subplots # 模拟从CSV读取的股票数据:列表中每个元素是(股票代码, 起始日期, 结束日期) stocks_info = [ ("AAPL", "2022-04-15", "2022-07-15"), ("MSFT", "2022-04-15", "2022-07-15"), ("TSLA", "2022-04-15", "2022-07-15") ] # 创建垂直子图:行数等于股票数量,列数为1 fig = make_subplots( rows=len(stocks_info), cols=1, subplot_titles=[stock[0] for stock in stocks_info], # 每个子图的标题为股票代码 vertical_spacing=0.05 # 子图之间的垂直间距,可根据需求调整 ) for idx, (stock, start_date, end_date) in enumerate(stocks_info, start=1): # 下载股票数据 df = yf.download(stock, start=start_date, end=end_date, interval="1h") # 计算VWAP tp = (df['Low'] + df['Close'] + df['High']) / 3 df['vwap'] = (tp * df['Volume']).cumsum() / df['Volume'].cumsum() # 添加蜡烛图到对应子图 fig.add_trace( go.Candlestick( x=df.index, open=df['Open'], high=df['High'], low=df['Low'], close=df['Close'], name=f"{stock} K线" ), row=idx, col=1 ) # 添加VWAP线到对应子图 fig.add_trace( go.Scatter( x=df.index, y=df['vwap'], mode='lines', name=f"{stock} VWAP", line=dict(color='royalblue', width=2) ), row=idx, col=1 ) # 调整布局:隐藏重复的图例,设置整体标题,优化x轴显示 fig.update_layout( height=300 * len(stocks_info), # 整体高度:每个子图分配300px高度 title_text="多只股票K线图(带VWAP分析)", showlegend=False # 关闭图例,避免重复显示 ) # 调整每个子图的x轴为时间格式 fig.update_xaxes( type='date', tickformat='%Y-%m-%d %H:%M', row='all', col=1 ) # 显示图表 fig.show()
关键注意点
make_subplots的rows参数必须与股票数量一致,确保每个股票对应一个子图- 每次添加
trace时必须指定row和col,否则会默认添加到第一个子图 - 通过
vertical_spacing调整子图之间的间距,避免图表重叠 - 整体高度可以根据子图数量动态设置,保证每个图表有足够的显示空间
内容的提问来源于stack exchange,提问作者Fchpro01
相关产品推荐
相关产品推荐

