backtesting.py使用Trading View数据馈送回测遇DataFrame格式错误求助
解决backtesting.py的OHLC数据格式ValueError问题
核心问题分析
backtesting.py对输入数据的要求不止是包含指定列,还有两个容易被忽略的硬性规则:
- DataFrame的索引必须是datetime类型,不能将datetime作为普通列保留
- 列名必须严格匹配大小写与拼写:必须是
'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
相关产品推荐
相关产品推荐

