单表上的MySQL协方差计算

时间:2013-06-19 16:38:49

标签: mysql sql covariance

我有一个表格金融交易的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 :(得分: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