【问题标题】:MySQL: Optimizing query for calculation of financial BETAMySQL:优化查询以计算金融 BETA
【发布时间】:2011-04-22 09:15:32
【问题描述】:

在金融领域,股票的贝塔系数是股票每日收益与指数每日收益之间的协方差除以指数每日收益的方差。我尝试计算一组股票和一组指数的 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 个索引,查询需要很长时间才能完成。 让我知道您想到的任何优化,例如视图、存储过程、临时表,当然,如果您发现任何不一致之处。

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

解释 ONE 公司的扩展结果(通过在末尾包含 WHERE s.permno=... 限制):

解释所有约 500 家公司的扩展结果:

【问题讨论】:

  • 'seq' 列有索引吗?此表的所有索引都有哪些。
  • 刚刚在主帖中发布了索引
  • 尝试在 date、index_id、permno 和 seq 上创建索引。从数据看来它是“一天结束”的数据,是这样吗?如果此索引没有帮助,请发布此查询的执行计划。我们可以从计划中找出瓶颈。
  • 这是一天结束的数据!我可以试试你的索引,然后报告它做了什么。执行计划到底是什么意思?
  • 使用“EXPLAIN”运行查询。这将显示 MySQL 执行查询将采取的步骤。示例:mysqlperformanceblog.com/2006/07/24/extended-explain 这可能会突出瓶颈。

标签: mysql optimization


【解决方案1】:

这是专业人士所做的:不要在数据库中计算。提取数据,计算,重新插入。我现在工作的地方,他们有一个巨大的网格在一天结束时做这些事情。是的,gris - 就像在大量机器中一样。我们谈论生成千兆字节的 csv 文件,然后将其重新加载到数据库中。包含 120.000 种不同元素的交易的 Beta、Gamma、PnL。数据库没有为此优化。

【讨论】:

  • 我知道这一点,我也知道如何在 Excel VBA 或任何语言中自己做。问题是这样的解决方案需要做很多工作,而且我不需要经常运行我的 beta 计算。这就是为什么我想尝试将它保存在纯 MySQL 中。也可以是遍历每一行的存储过程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 2013-04-16
  • 2020-05-21
  • 2014-10-17
  • 2017-07-16
  • 2022-01-14
  • 1970-01-01
相关资源
最近更新 更多