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

backtesting.py使用Trading View数据馈送回测遇DataFrame格式错误求助

解决backtesting.py的OHLC数据格式ValueError问题

核心问题分析

backtesting.py对输入数据的要求不止是包含指定列,还有两个容易被忽略的硬性规则:

  1. DataFrame的索引必须是datetime类型,不能将datetime作为普通列保留
  2. 列名必须严格匹配大小写与拼写:必须是'Open'、'High'、'Low'、'Close',可选包含'Volume',不能是小写open、Close Price这类变体

分步修复方案

1. 将Datetime列转为索引

如果你的datetime是普通列,先将其转为datetime类型并设置为索引:

import pandas as pd

# 假设你的datetime列名为'datetime'
df['datetime'] = pd.to_datetime(df['datetime'])
df = df.set_index('datetime').sort_index()  # 确保时间序列正序

2. 修正列名匹配要求

检查当前列名是否符合规范,用重命名统一格式:

# 根据你的实际列名调整映射关系
df = df.rename(columns={
    'open': 'Open',
    'high': 'High',
    'low': 'Low',
    'close': 'Close',
    'volume': 'Volume'
})

3. 清理无关列与缺失值

  • 移除OHLCV之外的冗余列:
df = df[['Open', 'High', 'Low', 'Close', 'Volume']]
  • 检查并删除OHLC列的缺失值(backtesting.py不允许核心列存在NaN):
df = df.dropna(subset=['Open', 'High', 'Low', 'Close'])

4. 验证数据格式

处理完成后,用以下代码确认是否符合要求:

print("索引类型:", df.index.dtype)  # 应显示datetime64[ns]类类型
print("有效列名:", df.columns.tolist())  # 应包含['Open','High','Low','Close'],可选含'Volume'

完整示例代码

import pandas as pd
from backtesting import Backtest, Strategy

# 读取Trading View导出数据(以CSV为例)
df = pd.read_csv('tradingview_export.csv')

# 处理时间索引
df['datetime'] = pd.to_datetime(df['datetime'])
df = df.set_index('datetime').sort_index()

# 统一列名格式
df = df.rename(columns={
    'open': 'Open',
    'high': 'High',
    'low': 'Low',
    'close': 'Close',
    'volume': 'Volume'
})

# 清理数据
df = df[['Open', 'High', 'Low', 'Close', 'Volume']].dropna(subset=['Open', 'High', 'Low', 'Close'])

# 初始化回测
class SimpleStrategy(Strategy):
    def next(self):
        if not self.position:
            self.buy()
        else:
            self.sell()

bt = Backtest(df, SimpleStrategy)
results = bt.run()
print(results)

内容的提问来源于stack exchange,提问作者Felipe Abrão Mariotti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:25:04