我需要在图表上绘制 vwap 和股票购买信号。到目前为止,我在导出应用了 vwap 计算的 .csv 时没有遇到任何问题,但绘制它是另一个问题。我不断收到这个持续错误,即 x 和 y 必须具有相同的大小。
这是我的绘图仪代码:
import pandas as pd
import mplfinance as mpf
import os
def plot_data_with_signals(csv_file):
try:
# Check if file exists
if not os.path.exists(csv_file):
raise FileNotFoundError(f"File not found: {csv_file}")
# Load the data from the CSV
df = pd.read_csv(csv_file, parse_dates=True, index_col="Date")
if df.empty:
print("No data to plot.")
return
# Ensure data columns are named correctly for mplfinance
df.rename(columns={
'Open': 'Open',
'High': 'High',
'Low': 'Low',
'Close': 'Close',
'Volume': 'Volume'
}, inplace=True)
# Ensure the index is properly set to 'Date'
df.index.name = 'Date'
# Create additional plot elements for VWAP, bands, and buy signals
apds = []
if 'vwap' in df.columns:
apds.append(mpf.make_addplot(df['vwap'], color='blue', linestyle='--', secondary_y=False))
if 'upper_band' in df.columns and 'lower_band' in df.columns:
apds.append(mpf.make_addplot(df['upper_band'], color='red', linestyle='--', secondary_y=False))
apds.append(mpf.make_addplot(df['lower_band'], color='green', linestyle='--', secondary_y=False))
if 'buy_signal' in df.columns:
# Create scatter plot for buy signals
buy_signals = df[df['buy_signal'] == 1]
if not buy_signals.empty:
apds.append(mpf.make_addplot(buy_signals['Close'], type='scatter', markersize=100, color='magenta',
secondary_y=False))
# Plotting data using mplfinance
mpf.plot(df, type='candle', style='charles', title='SPY 5-Minute Interval Candlestick Chart',
ylabel='Price', volume=True, addplot=apds)
except Exception as e:
print(f"Error plotting data. Something went wrong: {e}")
# Example usage
plot_data_with_signals("spy_data/spy_data_5m_vwap_bands_signals.csv") # Update with the path to CSV file
我多次尝试检查缺失值和其他内容。
如有任何帮助,我们将不胜感激
您的
mpf.makeaddplot()
调用中的数据长度必须与您的mpf.plot()
调用中的数据长度相同,即:
无论
len(df)
的值是什么,以下值应该相同:
len(df['vwap'])
len(df['upper_band'])
len(df['lower_band'])
len(buy_signals['Close'])
添加一些打印语句,或者在调试器中查看一下罪魁祸首。 您没有提供数据或确切的错误消息,因此很难说哪一个是问题所在。
(如果让我猜的话,我会说
buy_signals
,因为这是人们很容易搞砸的情况。通常购买信号并不在每个点,这意味着,为了使数据具有相同的长度作为 len(df)
那么您必须在没有信号的地方用 buy_signals
值填充 float('nan')
您可以在此处的 addplot 笔记本示例中的 cell In [7]:
和 **cell In [12]:
中看到此操作。 :https://github.com/matplotlib/mplfinance/blob/master/examples/addplot.ipynb)