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

修改NumPy数组列标题及mplfinance绘图适配问题求助

解决方案:MT5数据适配mplfinance绘制布林带

方案1:简化现有代码,避免重复操作

你当前代码里重复转换了日期列,其实可以一步到位,无需新建额外DataFrame:

import pandas as pd
import mt5
import mplfinance as mpf

# 初始化MT5连接
if not mt5.initialize():
    print("MT5初始化失败")
    mt5.shutdown()

from_date = pd.Timestamp.now() - pd.Timedelta(days=15)
# 获取EURUSD日线数据
rates = mt5.copy_rates_from("EURUSD", mt5.TIMEFRAME_D1, from_date, 15)
df_rates = pd.DataFrame(rates)

# 重命名时间列并转换格式,一步完成
df_rates.rename(columns={'time': 'date'}, inplace=True)
df_rates['date'] = pd.to_datetime(df_rates['date'], unit='s')

# 设置日期为索引(mplfinance推荐,可避免列名兼容问题)
df_rates.set_index('date', inplace=True)

# 保留mplfinance所需的核心列
df_candle = df_rates[['open', 'high', 'low', 'close']]

方案2:用mplfinance内置功能直接绘制布林带

mplfinance自带布林带绘制支持,无需手动计算后再添加,两种实现方式:

# 方式1:利用mplfinance内置的均线+布林带组合
mpf.plot(df_candle, type='candle', mav=(20), volume=False, title='EURUSD 日线布林带', figratio=(12,6))

# 方式2:手动计算布林带后,通过addplot添加自定义线条
df_candle['middle'] = df_candle['close'].rolling(window=20).mean()
df_candle['upper'] = df_candle['middle'] + 2*df_candle['close'].rolling(window=20).std()
df_candle['lower'] = df_candle['middle'] - 2*df_candle['close'].rolling(window=20).std()

add_plots = [
    mpf.make_addplot(df_candle['upper'], color='red', linestyle='--'),
    mpf.make_addplot(df_candle['middle'], color='blue'),
    mpf.make_addplot(df_candle['lower'], color='green', linestyle='--')
]
mpf.plot(df_candle, type='candle', addplot=add_plots, title='EURUSD 日线布林带', figratio=(12,6))

方案3:脱离mplfinance约束,用matplotlib手动绘制

如果不想受限于mplfinance的列规则,直接用matplotlib实现K线+布林带:

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

fig, ax = plt.subplots(figsize=(12,6))

# 绘制K线柱和影线
width = 0.8
up = df_candle[df_candle['close'] >= df_candle['open']]
down = df_candle[df_candle['close'] < df_candle['open']]

# 上涨K线
ax.bar(up.index, up['close'] - up['open'], width, bottom=up['open'], color='green')
ax.bar(up.index, up['high'] - up['close'], 0.1, bottom=up['close'], color='green')
ax.bar(up.index, up['open'] - up['low'], 0.1, bottom=up['low'], color='green')

# 下跌K线
ax.bar(down.index, down['close'] - down['open'], width, bottom=down['open'], color='red')
ax.bar(down.index, down['high'] - down['open'], 0.1, bottom=down['open'], color='red')
ax.bar(down.index, down['low'] - down['close'], 0.1, bottom=down['close'], color='red')

# 绘制布林带
ax.plot(df_candle.index, df_candle['upper'], color='red', linestyle='--', label='上轨')
ax.plot(df_candle.index, df_candle['middle'], color='blue', label='中轨')
ax.plot(df_candle.index, df_candle['lower'], color='green', linestyle='--', label='下轨')

# 格式化日期显示
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.xticks(rotation=45)
plt.title('EURUSD 日线布林带')
plt.legend()
plt.tight_layout()
plt.show()

关键注意事项

  • 确认MT5返回的time列是秒级Unix时间戳,若为毫秒级需把unit='s'改为unit='ms'
  • mplfinance要求日期列必须是datetime类型,设置为索引能避免大部分兼容问题
  • 布林带的窗口大小(示例中为20)和标准差倍数(示例中为2)可根据交易策略调整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:50:28