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

如何阻止createDailyTimeSeriesEngine生成非交易日(周末)填充值?

问题:阻止createDailyTimeSeriesEngine生成周末填充K线

问题背景

我正在使用createDailyTimeSeriesEngine对1分钟K线进行聚合,并为空白时段填充值。交易时段配置如下:

  • sessionBegin: [21:00, 09:00, 13:00]
  • sessionEnd: [02:30, 11:30, 15:00]

周五夜盘结束后,周一早上收到第一个tick时,引擎会立即生成大量周六、周日指定时段内的填充K线,导致输出表迅速膨胀,还触发了流处理管道中大量后续计算。

可复现示例

// 清理环境
trt{unsubscribeTable(tableName="trades", actionName="engine1")}catch(ex){print ex}
trt{dropStreamEngine("engine1")}catch(ex){print ex}

// 定义输入输出表
share streamTable(1000:0, `date`second`sym`volume, [DATE, SECOND, SYMBOL, INT]) as trades
share keyedTable(`time`sym, 10000:0, `time`sym`sumVolume, [DATETIME, SYMBOL, INT]) as output1
go

// 定义流引擎
engine1 = createDailyTimeSeriesEngine(name="engine1", windowSize=60, step=60,
metrics=<[sum(volume)]>, dummyTable=trades, outputTable=output1, timeColumn=`date`second,
useSystemTime=false, keyColumn=`sym, garbageSize=50, useWindowStartTime=true, closed='left',
sessionBegin=[21:00:00, 09:00:00, 13:00:00], sessionEnd=[02:30:00, 11:30:00, 15:00:00],mergeSessionEnd=false, updateTime=0, fill=[0])

subscribeTable(tableName="trades", actionName="engine1", offset=0, handler=append!{engine1}, msgAsTable=true);

// 周五夜盘数据
insert into trades values(2025.06.20,21:25:31,`A,8)
insert into trades values(2025.06.20,21:26:01,`B,10)
insert into trades values(2025.06.20,22:30:02,`A,26)
insert into trades values(2025.06.20,22:30:10,`B,14)
insert into trades values(2025.06.20,23:29:46,`A,30)
insert into trades values(2025.06.21,00:29:50,`B,11)
insert into trades values(2025.06.21,00:30:00,`B,14)
insert into trades values(2025.06.21,01:30:01,`A,4)
insert into trades values(2025.06.21,02:29:00,`A,4)
insert into trades values(2025.06.21,02:29:00,`B,4)

// 周一数据
insert into trades values(2025.06.23,09:00:00,`A,8)

select * from output1

当前输出情况

输出截图

可以看到在2025.06.23 09:00:00之前有大量填充记录,输出表总共有1810条。我期望仅在2025.06.20T02:30:00之前和2025.06.23T09:00:00之后的时段填充0。

解决方案

要解决这个问题,核心是让引擎识别非交易日(周末)并跳过这些日期的时段填充,同时保留正常交易日的填充逻辑,以下是两种可行方法:

方法1:指定交易日历(推荐)

createDailyTimeSeriesEngine支持通过holiday参数传入非交易日列表,引擎会自动跳过这些日期的时段处理。

  1. 定义非交易日列表(示例为目标周末日期):
// 2025.06.21为周六,2025.06.22为周日
holidays = dates(2025.06.21, 2025.06.22)
  1. 创建引擎时添加holiday参数:
engine1 = createDailyTimeSeriesEngine(name="engine1", windowSize=60, step=60,
metrics=<[sum(volume)]>, dummyTable=trades, outputTable=output1, timeColumn=`date`second,
useSystemTime=false, keyColumn=`sym, garbageSize=50, useWindowStartTime=true, closed='left',
sessionBegin=[21:00:00, 09:00:00, 13:00:00], sessionEnd=[02:30:00, 11:30:00, 15:00:00],
mergeSessionEnd=false, updateTime=0, fill=[0], holiday=holidays)

长期使用可维护完整交易日历表,动态传入holiday参数即可覆盖所有非交易日。

方法2:自定义填充逻辑(灵活扩展)

若需自定义交易日规则(如包含法定节假日),可通过自定义fill函数控制填充行为:

  1. 定义交易日判断函数:
// 判断日期是否为交易日(排除周六周日)
isTradingDay = def(date) {
    weekday = dayOfWeek(date)
    return weekday != 0 and weekday != 6  // 0代表周日,6代表周六
}
  1. 自定义填充函数,仅在交易日生成填充值:
customFill = def(time, sym) {
    date = date(time)
    if isTradingDay(date) {
        return [0]
    } else {
        return []  // 返回空列表表示不生成填充记录
    }
}
  1. 创建引擎时设置fill为自定义函数:
engine1 = createDailyTimeSeriesEngine(name="engine1", windowSize=60, step=60,
metrics=<[sum(volume)]>, dummyTable=trades, outputTable=output1, timeColumn=`date`second,
useSystemTime=false, keyColumn=`sym, garbageSize=50, useWindowStartTime=true, closed='left',
sessionBegin=[21:00:00, 09:00:00, 13:00:00], sessionEnd=[02:30:00, 11:30:00, 15:00:00],
mergeSessionEnd=false, updateTime=0, fill=customFill)

内容的提问来源于stack exchange,提问作者Stella.W

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:35:02