使用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
相关产品推荐
相关产品推荐

