如何阻止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参数传入非交易日列表,引擎会自动跳过这些日期的时段处理。
- 定义非交易日列表(示例为目标周末日期):
// 2025.06.21为周六,2025.06.22为周日 holidays = dates(2025.06.21, 2025.06.22)
- 创建引擎时添加
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函数控制填充行为:
- 定义交易日判断函数:
// 判断日期是否为交易日(排除周六周日) isTradingDay = def(date) { weekday = dayOfWeek(date) return weekday != 0 and weekday != 6 // 0代表周日,6代表周六 }
- 自定义填充函数,仅在交易日生成填充值:
customFill = def(time, sym) { date = date(time) if isTradingDay(date) { return [0] } else { return [] // 返回空列表表示不生成填充记录 } }
- 创建引擎时设置
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
相关产品推荐
相关产品推荐

