You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为含Ticker的DataFrame生成独立Matplotlib图表及报错解决

多股票交易信号图表绘制报错修复及独立图表实现

问题背景

现有包含5家纳斯达克上市公司数据的多层索引DataFrame(索引为Ticker和Date),结构如下:

signal  short_mavg   long_mavg  positions
Ticker Date                                                 
AAPL   2020-01-02     0.0   75.087502   75.087502        NaN
       2020-01-03     0.0   74.722500   74.722500        0.0
       2020-01-06     0.0   74.798332   74.798332        0.0
       2020-01-07     0.0   74.748125   74.748125        0.0
       2020-01-08     0.0   74.958000   74.958000        0.0

运行绘图代码时,在绘制买卖信号的行抛出错误:TypeError: 'value' must be an instance of str or bytes, not a tuple,同时需要实现每个股票的独立图表绘制。

原报错代码片段:

ax1.plot(signals.loc[signals.positions == 1.0].index, 
         signals.short_mavg[signals.positions == 1.0],
         '^', markersize=10, color='m')

报错原因

DataFrame采用多层索引(Ticker + Date),signals.loc[...].index返回的是包含(Ticker, Date)的元组对象,matplotlib的plot函数无法直接解析这种元组作为x轴数据,因此抛出类型错误。

解决方案

按Ticker分组,为每个股票单独生成图表,同时提取Date作为x轴的有效数据:

完整修复代码

import matplotlib.pyplot as plt

# 按Ticker分组遍历每个股票的数据
for ticker, group in signals.groupby(level='Ticker'):
    # 创建新的图表画布
    fig = plt.figure(figsize=(12,6))
    ax1 = fig.add_subplot(111, ylabel='Price in $')
    
    # 提取当前股票的收盘价数据
    close_data = all_data.xs(ticker, level='Ticker')['Close']
    # 绘制收盘价曲线
    close_data.plot(ax=ax1, color='r', lw=2., label='Close Price')
    
    # 绘制短期/长期均线
    group[['short_mavg', 'long_mavg']].plot(ax=ax1, lw=2., label=['Short MA', 'Long MA'])
    
    # 筛选买入信号并绘制
    buy_signals = group[group.positions == 1.0]
    ax1.plot(buy_signals.index.get_level_values('Date'), 
             buy_signals['short_mavg'],
             '^', markersize=10, color='m', label='Buy Signal')
    
    # 筛选卖出信号并绘制
    sell_signals = group[group.positions == -1.0]
    ax1.plot(sell_signals.index.get_level_values('Date'), 
             sell_signals['short_mavg'],
             'v', markersize=10, color='k', label='Sell Signal')
    
    # 添加图表标题和图例
    ax1.set_title(f'Trading Signals for {ticker}')
    ax1.legend()
    
    # 显示当前股票的独立图表
    plt.show()

关键修复点

  • 使用groupby(level='Ticker')拆分每个股票的数据组,实现独立图表生成
  • 用index.get_level_values('Date')从多层索引中提取单独的日期作为x轴数据,避免元组类型错误
  • 通过xs(ticker, level='Ticker')从all_data中精准提取对应股票的收盘价数据
  • 为每个图表添加标题和图例,提升可读性

内容的提问来源于stack exchange,提问作者Aayush Kaushal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 05:42:54