)
Backtrader 数据质量回测好不好先看数据靠不靠谱很多人以为回测最重要的是策略代码。其实更常见的情况是策略没有问题但数据有问题。如果数据错了后面算出的收益、回撤和胜率都可能失真。一、金融数据不只是几列价格一份常见的行情数据通常包含datetime时间 open开盘价 high最高价 low最低价 close收盘价 volume成交量但真正研究时还要知道数据来自哪里是实时数据还是历史数据是否复权使用什么时区价格和成交量的单位是什么是否包含停牌和分红信息。二、第一步检查日期读取数据后先做这几件事dfpd.read_csv(data.csv,parse_dates[datetime])dfdf.sort_values(datetime)dfdf.drop_duplicates(datetime)dfdf.set_index(datetime)检查日期是否正常assertdf.index.is_monotonic_increasingassertdf.index.is_unique如果日期乱了指标和交易顺序都会出问题。三、第二步检查价格逻辑一根正常 K 线应该满足assert(df[high]df[[open,close]].max(axis1)).all()assert(df[low]df[[open,close]].min(axis1)).all()assert(df[high]df[low]).all()如果最高价比开盘价和收盘价都低或者最低价比它们都高数据大概率有问题。还要检查价格是否小于等于 0成交量是否为负数是否突然出现极端跳变是否有整段时间缺失。四、第三步处理缺失值检查缺失值print(df.isna().sum())不要看到 NaN 就直接全部填 0。不同字段的处理方式不同价格缺失通常需要查原始数据成交量缺失不能随便当成 0指标预热期的 NaN可能是正常现象交易日没有数据可能是节假日不一定要补。金融时间序列最好先弄清楚“为什么缺失”再决定怎么处理。五、复权到底是什么股票分红、拆股后历史价格会出现跳变。例如一只股票从 100 元拆成 50 元图上像是暴跌 50%但投资者未必真的亏了这么多。复权数据会调整历史价格使收益计算更合理。常见选择前复权更适合观察当前价格下的历史走势后复权更适合观察长期持有收益不复权更接近当时实际成交价格。重点不是哪一个绝对正确而是研究、信号、收益计算和实盘价格必须保持一致。六、时区和交易日不能忽略不同市场的交易时间不同A 股、美股、港股、期货和加密资产都不一样。如果时间没有统一可能出现用美股当天收盘价配对 A 股第二天价格把尚未收盘的数据当成已经完成多资产之间出现隐形未来函数。多资产研究时要明确哪个市场先开盘 哪个市场先收盘 信号形成后下一次可交易时间是什么七、数据质量的最小检查模板required[open,high,low,close,volume]missing[cforcinrequiredifcnotindf.columns]ifmissing:raiseValueError(f缺少列{missing})ifdf[required].isna().any().any():raiseValueError(行情数据存在缺失值)if(df[close]0).any():raiseValueError(收盘价存在非正数)建议把这些检查放在正式回测之前。八、最常见的 7 个数据坑日期没有排序日期重复OHLC 列名映射错误复权方式前后不一致成交量单位不一致用未来数据填补缺失值数据源更新后历史结果发生变化却没有记录。最后总结数据质量可以记成四句话先查日期再查价格 先问缺失原因再决定填不填 先确认复权再计算收益 先统一时间再做多资产回测。数据是回测的地基。地基不稳策略代码写得越复杂错误只会被藏得越深。