在单个表中计算MySQL协方差

4

我有一个MySQL的单表财务交易数据库,具有以下模式:

+-----------------+---------------------+------+-----+---------+-------+
| Field           | Type                | Null | Key | Default | Extra |
+-----------------+---------------------+------+-----+---------+-------+
| symbol_id       | tinyint(3) unsigned | YES  | MUL | NULL    |       |
| timestamp       | timestamp(6)        | YES  | MUL | NULL    |       |
| buy_sell        | char(1)             | YES  |     | NULL    |       |
| price           | decimal(10,6)       | YES  | MUL | NULL    |       |
+-----------------+---------------------+------+-----+---------+-------+

有200个独特的“symbol_id”。最终,我想能够计算所有这些货币对价格的运行(随时间变化)协方差。 最初,我可以先计算单个货币对的协方差,然后再进行迭代。
为了计算协方差,我需要两个等长的数组(在本例中是“price”)。我正在努力将其写成一个查询,并避免返回所有记录以便本地计算协方差。
以下是我尝试用两个伪SQL查询实现的内容:
SELECT
(AVG(price1*price2) - AVG(price1)*AVG(price2)) as covar
FROM data

并且

SELECT price AS price1 WHERE HOUR(timestamp)=1 AND symbol_id=1 LIMIT(MIN(COUNT(price1,price2)))
SELECT price AS price2 WHERE HOUR(timestamp)=1 AND symbol_id=2 LIMIT(MIN(COUNT(price1,price2)))

第一个语句接收两个等长的 price1price2 数组并计算它们之间的协方差。 第二个语句是在选择两种不同类型的交易,且这些交易都发生在第一小时内,并且限制返回值具有相同的长度。

在我有限的SQL知识中,我难以理解如何将这些查询合并。非常感谢任何帮助。最终能够运行一个查询来计算特定时间段内成对协方差将是美妙的。

1个回答

0

我有点困惑。协方差是在同时收集的数据上计算的。(比如在同一时间进行的两次测量。)(例如,请参见http://www.mathworks.com/matlabcentral/newsreader/view_thread/134856中的答案。)

使用LIMIT子句会丢失有价值的数据,这会影响准确性。此外,我不确定,但我认为LIMIT可能会在不同的时间返回不同的行,因此您的计算可能不是确定的。

如果您按小时制作协方差,这意味着您认为在一个小时内发生的价格是相同的测量值,因此建议您在该小时内的价格平均值上计算协方差。

如果您不将每小时内的价格视为同一测量的一部分,那么您就会面临缺失数据问题,这意味着当出现价格1时,您会缺少price2的数据,反之亦然。(例如请参阅https://stats.stackexchange.com/questions/20457/is-it-possible-to-compute-a-covariance-matrix-with-unequal-sample-sizes)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接