前几天有用户建议果仁函数,例如 MA(x,n), ref(x,n),支持 n 是变量的用法。熟悉果仁自定义公式的人,都知道 n 是往回看的日期。

听起来是个不错的建议。但是果仁服务器在算 MA 和 ref 时,根据用户的定义,可能需要对所有股票,所有日期进行扫描计算。n 是常数时,可以进行优化,大致会进行 3000 * 2500 = 7500000 次计算。而如果 n 是变量,优化不能进行,则需要最多 3000 * 2500 * 2500 = 18750000000 次计算。

平方级的算法和立方级的算法,对稍大的数字来说,是不可逾越的鸿沟。

为了保障其他用户的使用体验,平台无法加入这种函数 :-(

我打听了一下这位用户想实现的逻辑,实际上他想利用 ref 函数,在回测中找到每一天、每个股票的最近的一次局部最高价。举个例子,收盘价是前后各四天局部最高可以这么定义:

IsLocalHigh = if (ref(收盘价,4)>= Max(收盘价,9),1,0)

本来用户想先通过 DaysLast 函数找出什么时候发生上次局部最高价,然后通过 ref 函数去取那天的值。但这样就要求前面提到的ref 中的 n 是变量。因为会带来立方级的计算,我遗憾地告诉用户,果仁暂时不会考虑支持这样的用法。。。

然而故事并没有到此结束。聪明的果仁工程师很快实现了 LastValue 函数。用户的需求,可以这么实现:

LastHigh = LastValue(收盘价,IsLocalHigh=1)

这样就会为每天取到前面最近一次的局部最高值了。并且这个新函数也是平方级的计算。两次 7500000 级别的函数调用,代替了 18750000000 级别的计算!

当然,这些都是果仁平台后面的故事,用户其实不用操心果仁是怎么算的。

不过我们很感激用户提出了这个需求,这是果仁工程师们最爱做的事。Keep it coming!