计算持仓成本,有没有高效的方法

发布于 2022-09-12 02:24:45 字数 900 浏览 23 评论 0

如下代码所示,order表的字段id是订单号,price是价格,amount下单数量(+买入,-卖出),当amount为正时,持仓成本=cumsum(amount*price)/cumsum(amount),当amount为负(卖出时),引用之前计算好的持仓成本。当全卖出即空仓后,持仓成本需要重新算。下面是我的DolphinDB database代码:

id = take(1..9,1000000)
price = take(101..109,1000000)
amount =take( 1 2 3 -2 -1 -3 1 2 3,1000000)
order = table(id, price, amount)

def avg_price(price, amount){
 hold = 0.0;
 cost = 0.0;
 avg_price = 0.0;
 avg_prices = array(double);
 for ( r in table(price,amount) ) {
  hold += r.amount;
  if ( r.amount > 0 ) {
   cost += r.amount * r.price;
   avg_price = iif(hold > 0, cost/hold, 0);
  } else {
   cost += r.amount * avg_price;
  }
  avg_prices.push!(avg_price)
 }
 return avg_prices;
}

select *, iif (amount < 0, amount*(avg_price - price), 0) as profit 
from (
 select *, avg_price(price, amount) as avg_price
 from order
) 

这个方法效率比较低,100万行数据,执行一次要3-4秒,请问有什么办法改进?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

丿*梦醉红颜 2022-09-19 02:24:45

DolphinDB database 从1.01版本开始支持即时编译JIT(https://github.com/dolphindb/... )。JIT又译及时编译或实时编译,是动态编译的一种形式,可提高程序运行效率。上面函数可写成JIT函数如下:

@jit
def avg_price(price, amount){
    hold = 0.0;
    cost = 0.0;
    avgPrice = 0.0;
    n = size(price)
    avgPrices = array(DOUBLE, n, n, 0)
    for ( i in 0..(n-1))  {
        hold =hold + amount[i];
        if ( amount[i] > 0 ) {
            cost = cost + amount[i] * price[i];
            if(hold > 0) {
                avgPrice = cost/hold;
            }else{  
                avgPrice = 0.0;
            }
        } else {
             cost += amount[i] * avgPrice;; 
        }
        avgPrices[i]=avgPrice
    }
    return avgPrices;
}

对上述函数进行测试,用JIT版本比非JIT大约快200倍。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文