MySQL:优化查询以计算财务BETA

时间:2011-04-20 05:25:26

标签: mysql optimization

在金融领域,股票的beta是股票的每日回报与指数的每日回报之间的协方差,除以指数每日回报的方差。我尝试为一组股票和一组指数计算beta。

这是我对50个工作日滚动窗口的查询,我希望您帮我优化速度:

INSERT INTO betas (permno, index_id, DATE, beta) 
(SELECT 
  permno, index_id, s.date, IF(
    s.`seq` >= 50, 
    (SELECT 
 (AVG(s2.log_return*i2.log_return)-AVG(s2.log_return)*AVG(i2.log_return))/VAR_POP(i2.log_return) AS beta
    FROM
      stock_series s2
      INNER JOIN `index_series` i2 ON i2.date=s2.date 
      WHERE i2.index_id=i.index_id AND s2.permno = s.permno 
      AND s2.`seq` BETWEEN s.`seq` - 49 AND s.`seq` 
      GROUP BY index_id,permno), NULL)
   AS beta 
FROM
  stock_series s
  INNER JOIN `index_series` i ON i.index_id IN ('SP500') AND i.date=s.date
 ) 
ON DUPLICATE KEY 
UPDATE beta=  VALUES (beta)

两个主表已按实体和日期按升序排序,并且它们已包含日志返回日期以及“seq”列。 Seq顺序枚举公司 - (或索引 - )明智的所有每日行,即seq从表中的每个新库存或索引开始,并计数到给定实体的总行数。我创建它以允许滚动窗口。

截至目前,有500家公司和1个索引,查询需要永远完成。 让我知道你想到的任何优化,比如视图,存储过程,临时表,当然,如果你发现任何不一致的地方。

编辑:索引: stock_series有PRIMARY KEY(permno,date)和UNIQUE KEY(permno,seq), index_series具有PRIMARY KEY(index_id,date)

一家公司的EXPLAIN EXTENDED结果(最后包括WHERE s.permno = ...限制): EXPLAIN EXTENDED of above SELECT query

所有~500家公司的EXPLAIN EXTENDED结果: enter image description here

1 个答案:

答案 0 :(得分:-1)

这里我是专业人士所做的:不要在数据库中计算出来。拉数据,计算,重新插入。我现在在哪里工作,他们在白天结束时有一个休格格。是的,格里斯 - 就像很多机器一样。我们谈论生成数十亿字节的csv文件,然后重新加载到数据库中。 Beta,Gamma,PnL与120,000种不同元素的交易。数据库并未针对此进行优化。