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的 s。最终,我希望能够计算所有这些货币对价格的运行(随时间)协方差。最初我可以满足于只计算一对的协方差,然后我可以迭代。

为了计算协方差,我需要两个长度相等的数组(在这种情况下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 知识中,我无法理解如何组合这些查询。任何帮助深表感谢。最终能够运行一个计算特定时间块的成对协方差的查询会很可爱。

4

1 回答 1

0

我在这里有点困惑。协方差旨在根据同时收集的数据进行计算。(就像同时进行两次测量一样。)(参见例如在http://www.mathworks.com/matlabcentral/newsreader/view_thread/134856阅读答案)

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

如果您按小时计算协方差,这意味着您将一小时内发生的价格视为相同的度量,因此我建议您计算该小时内价格平均值的协方差。

如果您不考虑将一小时内的价格作为同一测量的一部分,那么您就会遇到数据丢失问题,这意味着您在 price1 发生时丢失了 price2 的数据,反之亦然。(参见例如https://stats.stackexchange.com/questions/20457/is-it-possible-to-compute-a-covariance-matrix-with-unequal-sample-sizes

于 2013-06-24T08:59:47.167 回答