如何解决mplfinance散点图中错误绘制箭头

问题描述 投票:0回答:1

虽然我不认为自己是新手,但我会认为自己对Python缺乏经验。我是 MPLFinance 的新手。

我正在尝试在外汇金融图表上绘制交易入场点。我的基本图表运行正常。我的数据来自 DataFrame,它是通过 CSV 导入填充的。其中一列名为“Golden_Cross”的列包含单词“long”,这是我想用箭头绘制的信号。

我正在尝试模拟 mplfinance

documentation
中的 percentB_belowzero 函数。我了解该函数的主要功能,但我不知道一些细节。例如
price[date]
的意义是什么,
previous
的用途是什么?这可能并不重要。下面的代码是我到目前为止所拥有的:

import pandas as pd
import mplfinance as mpf
import math

def go_long(df):
    signal   = [math.nan] * len(df)
    print("len(df) = " + str(len(df)))
    print("len(signal) = " + str(len(signal)))
    for i in range(1, len(df)):
        if df['Golden_Cross'].iloc[i] == "long":
            signal.append(df['close'].iloc[i] * 0.99)
        else:
            signal.append(math.nan)
    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='^')
            ]
    mpf.plot(df, type= 'candle', tight_layout=True, datetime_format='%Y-%m-%d', volume=False, show_nontrading=False, addplot=apds)

当我运行上面的代码时,我得到以下堆栈跟踪(对格式感到抱歉):

> len(df) = 381 len(signal) = 381 
> Traceback (most recent call last):  
> File "/data/stuart/Projects/Python/BackTesting/Scratches/charting1.py",
> line 25, in <module>
>     mpf.plot(df, type= 'candle', tight_layout=True, datetime_format='%Y-%m-%d', volume=False, show_nontrading=False,
> addplot=apds)   
File
> "/data/stuart/Projects/Python/Env/lib/python3.12/site-packages/mplfinance/plotting.py",
> line 808, in plot
>     ax = _addplot_columns(panid,panels,ydata,apdict,xdates,config,colcount)
>          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
> File "/data/stuart/Projects/Python/Env/lib/python3.12/site-packages/mplfinance/plotting.py",
> line 1139, in _addplot_columns
>     ax.scatter(xdates, ydata, s=size, marker=mark, color=color, alpha=alpha, edgecolors=edgecolors, linewidths=linewidths,label=label)
> 
>     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> File
> "/data/stuart/Projects/Python/Env/lib/python3.12/site-packages/matplotlib/__init__.py",
> line 1473, in inner
>     return func(
>            ^^^^^   File "/data/stuart/Projects/Python/Env/lib/python3.12/site-packages/matplotlib/axes/_axes.py",
> line 4787, in scatter
>     raise ValueError("x and y must be the same size") ValueError: x and y must be the same size

我不明白

ValueError: x and y must be the same size
的引用。我的
signal
列表和
df
数据框大小相同(请参阅打印语句输出)。

有人可以帮我让这段代码正确运行吗?

最诚挚的问候,斯图尔特M

python matplotlib scatter-plot mplfinance
1个回答
0
投票

我无法测试它,但我认为所有问题都在于你如何创建

signal

您应该创建空列表,然后在末尾附加新值。

signal = []

for i in range(...):

    signal.append(...)

或者您必须创建具有预期大小的列表并使用索引来替换值

signal = [math.nan] * len(df)

for i in range(...):

    signal[i] = ...

但是您将新值附加到现有项目中,以便您的列表有大小

2 * 381

© www.soinside.com 2019 - 2024. All rights reserved.