大体积OHLCV日内数据高效Exit标记方案求助(KDB+)
大OHLCV数据集下KDB+高效生成Exit标记的需求
数据集与核心需求
我有一个约2.3GB的ohlcv数据集,包含15分钟粒度的日内数据,结构示例如下:
date ticker open close high low volume exchange time sma50 sma25 atr14 relVol10 entry exits ------------------------------------------------------------------------------------------------------------------------------------------------- 2024.06.20 IBM 2963.25 2964 2965.7 2960.4 400564 NASDAQ 2024.06.20D13:30:00.000000000 2943.033 2940.838 8.835116 2.619959 0 0 2024.06.20 IBM 2963.95 2948.1 2964.6 2947.3 333112 NASDAQ 2024.06.20D13:45:00.000000000 2943.034 2941.708 9.43975 1.827534 0 0 2024.06.20 IBM 2948.5 2952.9 2955.35 2946.55 220532 NASDAQ 2024.06.20D14:00:00.000000000 2943.085 2943.05 9.394054 1.090741 0 0 2024.06.20 IBM 2953.15 2958.5 2960 2952.5 288016 NASDAQ 2024.06.20D14:15:00.000000000 2943.261 2944.386 9.258764 1.352764 1 0 2024.06.20 IBM 2958.55 2952 2962.9 2950.1 343157 NASDAQ 2024.06.20D14:30:00.000000000 2943.208 2945.4 9.51171 1.49124 0 0 2024.06.20 IBM 2951.7 2951.35 2952.9 2943.05 429613 NASDAQ 2024.06.20D14:45:00.000000000 2943.145 2946.594 9.535873 1.675764 0 0 2024.06.20 IBM 2951.15 2946.6 2953 2940.9 937451 NASDAQ 2024.06.20D15:00:00.000000000 2942.802 2947.832 9.719025 3.195037 0 0 2024.06.20 IBM 2947.7 2949 2950.55 2943 565435 NASDAQ 2024.06.20D15:15:00.000000000 2942.585 2949.112 9.564095 1.546279 0 0
需要基于布尔类型的entry字段生成exits标记,规则如下:
- 当某根K线的
close≥对应entry开仓K线的close×1.02时,标记该K线为对应entry的exit; - 若未触发止盈条件,则在当日最后一根K线标记所有未平仓entry的exit。
现有方案的问题
我尝试过两种功能正确的方案,但针对当前2.3GB的数据集,效率极低——计算始终无法完成,内存占用持续攀升直至系统无法使用:
@cillianmurphy 实现方案
o:select close, index:i, ticker, date from ohlcv where entry; f:{[x;y] index:?[x; ((>;`close;1.02 * y`close);(>;`i;y`index);(not;`exits)); (); (first;`i)]; if[null index; index:-1 + count x]; / 若未找到止盈K线,取当日最后一根K线索引 update exits:1b from x where i=index } r: f/[ohlcv; o];
@Maurice Lim 实现方案
/ @MauriceLim f2:{ { x[0],:$[y`entry; y`close; ()]; if[x[1]:any exits:1.02*x<y[`close] 0; x[0] _: first where exits]; x } \ [`float$();0b); x][; 1]}; r:update exits:f2 ohlcv by ticker, date from ohlcv;
补充规则说明
- 开仓标记
entry不会出现在当日最后一根K线;所有未平仓头寸必须在当日结束时平仓,或在指定数量K线后平仓(止盈条件优先)。 - 原布尔类型的entry/exits存在歧义,建议为每个有效entry分配唯一非零索引,exit标记明确对应entry索引,采用FIFO规则匹配。示例如下:
原数据:
ticker date close entry exits ----------------------------------- CSCO 2024.03.15 64 1 0 CSCO 2024.03.15 20 1 0 CSCO 2024.03.15 96 0 1 CSCO 2024.03.15 34 1 1 CSCO 2024.03.15 97 1 1 CSCO 2024.03.15 50 1 0 CSCO 2024.03.15 54 0 1 CSCO 2024.03.15 51 1 0
转换后数据:
ticker date close entry exits ----------------------------------- CSCO 2024.03.15 64 1 0 CSCO 2024.03.15 20 2 0 CSCO 2024.03.15 96 0 1 CSCO 2024.03.15 34 3 2 CSCO 2024.03.15 97 4 3 CSCO 2024.03.15 50 5 0 CSCO 2024.03.15 54 0 4 CSCO 2024.03.15 51 6 5 6
寻求针对大数据集的高效KDB+实现方案。
内容的提问来源于stack exchange,提问作者marital_weeping
相关产品推荐
相关产品推荐

