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

解决mplfinance散点图绘制箭头的x/y尺寸不匹配报错

在mplfinance K线图标记交易信号的代码修正

问题背景

非Python新手但刚接触mplfinance,需在外汇K线图上标记Golden_Cross列值为long的入场信号(向上箭头)。基础图表正常运行,但编写的代码报错ValueError: x and y must be the same size,虽打印显示signal列表与df长度一致,仍无法解决。

错误原因

go_long函数中存在逻辑错误:初始化signal为长度等于df的列表后,使用append()方法添加元素,导致最终signal长度变为2*len(df)-1(初始长度len(df) + 循环len(df)-1次的新增元素),与df的日期序列长度不匹配,触发绘图时x、y维度不一致的错误。

修正方案

方案一:使用pandas向量化操作(推荐)

利用pandas的apply方法直接生成信号列,更高效且避免长度问题:

import pandas as pd
import mplfinance as mpf
import math

def go_long(df):
    # 条件赋值:符合long信号时取close*0.99,否则为NaN
    signal = df.apply(lambda row: row['close'] * 0.99 if row['Golden_Cross'] == 'long' else math.nan, axis=1)
    print(f"len(df) = {len(df)}, len(signal) = {len(signal)}")
    return signal

if __name__ == '__main__':
    df = pd.read_csv('GBPUSD_MA_Crossover2.csv', index_col=0, parse_dates=True)
    df.index.name = 'date'
    
    long_signal = go_long(df)
    apds =  [ 
        mpf.make_addplot(df[['fast_ma', 'slow_ma']], panel=0, title='GBPUSD'),
        # mpf.make_addplot((df['dmi']),panel=1, title='DMI'),
        mpf.make_addplot(long_signal, type='scatter', panel=0, markersize=200, marker='^', color='green')
    ]
    mpf.plot(df, type='candle', tight_layout=True, datetime_format='%Y-%m-%d', volume=False, show_nontrading=False, addplot=apds)

方案二:修正循环逻辑

如果坚持使用循环,需直接修改列表对应索引的元素,而非append:

def go_long(df):
    signal = [math.nan] * len(df)
    print(f"len(df) = {len(df)}, len(signal) = {len(signal)}")
    for i in range(len(df)):
        if df['Golden_Cross'].iloc[i] == "long":
            signal[i] = df['close'].iloc[i] * 0.99  # 修改索引i的元素,不新增元素
    return signal

额外优化

给箭头标记添加颜色(如示例中的绿色),可让信号在K线图上更醒目。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 02:37:04