我的Python Rolling Walk Forward代码是否符合滚动向前测试要求?
我自己写了一个经过微调的滚动向前测试函数,用来测试交易策略。数据集形状为(1000,1),设置warm_up_bars=50、training_bars=200、validation_bars=100,通过循环划分训练集与验证集,每次按验证集大小滚动。测试后看似可用,但作为新手不确定是否符合滚动向前测试的预期逻辑,想咨询这段代码是否正确:
data_shape = (1000,1) validation_bars = 100 warm_up_bars = 50 training_bars = 200 endpoint = data_shape[0]-validation_bars-warm_up_bars print(f"Endpoint is at {endpoint} ") for i in range(warm_up_bars, endpoint, validation_bars): print("Index is "+str(i)) train_start_idx = i train_end_idx = train_start_idx + training_bars validation_start_idx = train_end_idx validation_end_idx = validation_start_idx +validation_bars print(f"Training Set Index is from {train_start_idx} to {train_end_idx}") print(f"Validation Set Index is from {validation_start_idx} to {validation_end_idx}") print("\n")
代码逻辑分析与修正建议
你的代码核心思路符合滚动向前测试的基本逻辑(用历史数据训练、紧邻的后续数据验证、按固定步长滚动窗口),但存在几个细节问题需要调整:
数据集越界问题
当前endpoint的计算方式会导致最后一次循环的验证集超出数据集范围:
原计算endpoint = 1000-100-50=850,循环最后一次i=800时,validation_end_idx=800+200+100=1100,远大于数据集总长度1000(索引范围0-999)。
正确的endpoint应该设为:endpoint = data_shape[0] - validation_bars - training_bars这样最后一次循环的验证集终点会控制在合理范围内。
Warm_up数据的使用逻辑
你当前把warm_up_bars作为训练集的起始点,相当于直接跳过了前50条数据。但交易策略中,warm_up数据通常是用来计算指标(如均线、ATR)的前置初始化数据,应该包含在训练集的前置区间内,而非直接跳过。比如可以把训练集起始点调整为i - warm_up_bars,让warm_up数据成为训练过程的一部分。循环边界处理
原range的终点不包含endpoint,可能会漏掉最后一个有效的窗口。可以把循环改为range(warm_up_bars, endpoint + 1, validation_bars),确保所有有效窗口都被覆盖。
修正后的代码示例
data_shape = (1000,1) validation_bars = 100 warm_up_bars = 50 training_bars = 200 # 修正endpoint,确保最后一次验证集不越界 endpoint = data_shape[0] - validation_bars - training_bars print(f"Endpoint is at {endpoint} ") for i in range(warm_up_bars, endpoint + 1, validation_bars): print(f"Index is {i}") # 将warm_up数据纳入训练前置区间 train_start_idx = i - warm_up_bars train_end_idx = train_start_idx + training_bars validation_start_idx = train_end_idx validation_end_idx = validation_start_idx + validation_bars # 兜底处理,避免极端情况越界 if validation_end_idx > data_shape[0]: validation_end_idx = data_shape[0] print(f"Training Set Index is from {train_start_idx} to {train_end_idx} (含{warm_up_bars}条预热数据)") print(f"Validation Set Index is from {validation_start_idx} to {validation_end_idx}") print("\n")
内容的提问来源于stack exchange,提问作者Raider32

