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

我的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")

代码逻辑分析与修正建议

你的代码核心思路符合滚动向前测试的基本逻辑(用历史数据训练、紧邻的后续数据验证、按固定步长滚动窗口),但存在几个细节问题需要调整:

  1. 数据集越界问题
    当前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
    

    这样最后一次循环的验证集终点会控制在合理范围内。

  2. Warm_up数据的使用逻辑
    你当前把warm_up_bars作为训练集的起始点,相当于直接跳过了前50条数据。但交易策略中,warm_up数据通常是用来计算指标(如均线、ATR)的前置初始化数据,应该包含在训练集的前置区间内,而非直接跳过。比如可以把训练集起始点调整为i - warm_up_bars,让warm_up数据成为训练过程的一部分。

  3. 循环边界处理
    原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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:45:15