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

使用backtrader加载CSV文件遇FileNotFoundError求助

解决backtrader GenericCSVData加载CSV文件的FileNotFoundError问题

核心排查与解决步骤

  • 修正路径转义问题:Windows下的反斜杠\在Python字符串中是转义符,直接写会导致路径解析错误。两种修正方式:
    • 使用原始字符串:r"D:\Programme\Visual Studio Code\Projekte\D_Candles.csv"
    • 用双斜杠替代单斜杠:"D:\\Programme\\Visual Studio Code\\Projekte\\D_Candles.csv"
  • 验证当前工作目录:在代码开头加入以下代码,确认脚本运行时的工作目录是否和文件所在目录一致:
    import os
    print(os.getcwd())
    
    如果不一致,要么切换工作目录(os.chdir("文件所在目录路径")),要么使用完整绝对路径。
  • 检查文件权限:确保Python进程有权限访问目标文件及所在目录,尤其是VS Code以非管理员身份运行时可能存在权限限制。

替代加载方案

如果GenericCSVData仍无法正常工作,可以尝试以下两种替代方式:

1. 用PandasData加载(推荐)

借助pandas读取CSV后转成backtrader兼容格式:

import backtrader as bt
import pandas as pd

# 读取CSV,指定日期列解析为datetime类型
df = pd.read_csv(
    r"D:\Programme\Visual Studio Code\Projekte\D_Candles.csv",
    parse_dates=['datetime']  # 替换成你实际的日期列名
)
# 确保DataFrame列名符合backtrader默认要求:datetime, open, high, low, close, volume
# 列名不符的话可以用df.rename()重命名
data = bt.feeds.PandasData(dataname=df)

# 加入回测引擎
cerebro = bt.Cerebro()
cerebro.adddata(data)

2. 自定义DataFeed类

如果不想依赖pandas,可基于backtrader的DataBase类实现自定义加载逻辑:

import backtrader as bt
import csv
from datetime import datetime

class CustomCSVData(bt.feed.DataBase):
    params = (
        ('date_col', 0),  # 日期列的索引(从0开始)
        ('open_col', 1),
        ('high_col', 2),
        ('low_col', 3),
        ('close_col', 4),
        ('volume_col', 5),
        ('date_format', '%Y-%m-%d'),  # 替换成你实际的日期格式
    )

    def start(self):
        self.f = open(self.p.dataname, 'r')
        self.reader = csv.reader(self.f)
        # 跳过表头行
        next(self.reader)

    def _load(self):
        try:
            row = next(self.reader)
        except StopIteration:
            self.f.close()
            return False
        
        # 解析日期并转换为backtrader格式
        dt = datetime.strptime(row[self.p.date_col], self.p.date_format)
        self.lines.datetime[0] = bt.date2num(dt)
        
        # 加载行情数据
        self.lines.open[0] = float(row[self.p.open_col])
        self.lines.high[0] = float(row[self.p.high_col])
        self.lines.low[0] = float(row[self.p.low_col])
        self.lines.close[0] = float(row[self.p.close_col])
        self.lines.volume[0] = float(row[self.p.volume_col])
        
        return True

# 使用自定义数据源
cerebro = bt.Cerebro()
data = CustomCSVData(
    dataname=r"D:\Programme\Visual Studio Code\Projekte\D_Candles.csv"
)
cerebro.adddata(data)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:25:54