如何在KDB+中生成带区间约束的随机价格时间序列
生成符合波动限制的KDB+价格列
要实现每个标的后续价格基于上一次价格在±(N*delta_unit)范围内波动,且支持自定义起始价格映射,可以利用KDB+的fby分组处理能力,按标的逐组生成价格序列。
步骤1:准备初始表与参数
首先定义初始表、起始价格映射表及波动参数:
// 初始表 sym:`aapl`tsla`aapl`msft`tsla`qcom`msft`tsla`aapl`qcom t:([] ts:.z.p+til count sym;sym) // 自定义标的起始价格映射 startPrices:`aapl`tsla`msft`qcom!200.0 180.0 380.0 120.0 // 波动单位与范围系数 delta_unit:0.01 N:2 maxDelta:N*delta_unit // 单次最大波动幅度
步骤2:生成价格列
使用update结合fby,为每个标的分组生成符合规则的价格序列:
t:update price:{[start;maxD] // 取当前标的的起始价格 firstPrice:first start; // 生成分组内除首行外的随机波动值,范围[-maxD, maxD] deltas:(count x)-1?(-maxD;maxD); // 累加波动值得到完整价格序列 firstPrice + 0, sums deltas }[startPrices[sym];maxDelta] fby sym from t
步骤3:(可选)保留两位小数
如果需要像示例一样保留两位小数,用round函数格式化:
t:update price:round[price;0.01] from t
最终效果示例
执行后表结构如下:
q)t ts sym price ---------------------------------------- 2025.02.09D14:43:43.054056807 aapl 200.00 2025.02.09D14:43:43.054056808 tsla 180.00 2025.02.09D14:43:43.054056809 aapl 199.98 2025.02.09D14:43:43.054056810 msft 380.00 2025.02.09D14:43:43.054056811 tsla 180.02 2025.02.09D14:43:43.054056812 qcom 120.00 2025.02.09D14:43:43.054056813 msft 379.99 2025.02.09D14:43:43.054056814 tsla 180.01 2025.02.09D14:43:43.054056815 aapl 199.99 2025.02.09D14:43:43.054056816 qcom 120.02
代码说明
fby sym确保函数按每个标的独立分组执行,避免不同标的价格互相干扰- 随机波动值通过
?(-maxD;maxD)生成,确保每次波动严格限制在指定范围内 sums deltas实现基于前一次价格的累加波动,保证价格序列的连续性
内容的提问来源于stack exchange,提问作者Alexandros
相关产品推荐
相关产品推荐

