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

| 在金融中,股票的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从1开始,并计数到给定实体的总行数。我创建它是为了允许滚动窗口。 截至目前,拥有500个公司和1个索引,查询就像永远完成一样。 让我知道您想到的任何优化,例如视图,存储的proc,临时表,以及是否发现任何不一致的地方。 编辑:索引: stock_series具有PRIMARY KEY(permno,日期)和UNIQUE KEY(permno,seq), index_series具有主键(index_id,日期) 一家公司的EXPLAIN EXTENDED结果(通过在末尾添加WHERE s.permno = ...限制): 约有500家公司的EXPLAIN EXTENDED结果:
已邀请:
在这里,我是专业人士所做的事情:不要在数据库中计算出来。拉取数据,计算并重新插入。在我现在工作的地方,他们有一个庞大的网格,可以在一天结束时完成这些工作。是的,gris-就像很多机器一样。我们谈论产生千兆字节的csv文件,然后将其重新加载到数据库中。 Beta,Gamma,PnL交易有120.000个不同元素。尚未为此优化数据库。

要回复问题请先登录注册