解决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
相关产品推荐
相关产品推荐

