3 如何补全停牌期间股票数据?

问题如图:原始数据表A有所有股票的全部有效交易数据(也就是说没有股票停牌日期的数据),有什么方法可以通过与交易日期的关联,将停牌期间的数据补回来,缺失值用0填充。

现在有效的办法是通过对所有股票代码进行循环遍历,在循环内对交易日期与股票依次做lj,最后汇总所有结果。

问题:有没有更加高效优雅的写法来实现这个功能(也就是不用循环实现)。

attachments-2023-11-yHqEYMXi655c3256a1440.png

请先 登录 后评论

最佳答案 2023-11-22 16:27

先用 interval 把所有缺失的天填上,再过滤掉不在 marketDay 的数据

st = take(`a, 7) join take(`b, 6)
date = 2023.08.01 + 0 1 3 6 7 8 9 0 1 2 3 8 9
val = 35 34 35.79 33.26 32.88 33.73 31 25 24 22 25.79 21 31
t = table(st, date, val)
marketDay = 2023.08.01 + 0 1 2 3 6 7 8 9
re = select last(val) from t group by st, interval(date, 1d, 0) as date 
re1 = select * from re where date in marketDay
请先 登录 后评论

其它 1 个回答

Boye

resample 函数支持交易日历。所以可以考虑,先将 t 展成宽表,再对宽表使用 resample 函数补充停牌日期数据。最后将宽表转成窄表。参考脚本如下:

// 模拟数据
code = take(`a, 7) join take(`b, 6)
date = 2023.08.01 + 0 1 3 6 7 8 9 0 1 2 3 8 9
val = 35 34 35.79 33.26 32.88 33.73 31 25 24 22 25.79 21 31
t = table(code, date, val)
// 交易日
marketDay = getMarketCalendar("SSE", 2023.08.01, 2023.08.10)

// 代码实现
tmp = panel(t.date, t.code, t.val).resample("SSE", last).nullFill(0)
res = unpivot(table(tmp.rowNames() as date, tmp), `date, tmp.colNames()).rename!(`date`code`val)
请先 登录 后评论
  • 2 关注
  • 0 收藏,753 浏览
  • henry989 提出于 2023-11-21 12:32

相似问题