我有一个表格金融交易的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)))
第一个语句采用两个等长的price1
和price2
数组,并计算协方差。
第二个语句是选择两种不同类型的语句,这些类型都发生在事务的第一个小时内,并将返回值限制为相等的长度。
在我有限的SQL知识中,我无法理解如何组合这些查询。任何帮助深表感谢。 最终能够运行一个查询来计算特定时间段的成对协方差将是可爱的。
答案 0 :(得分:0)
使用LIMIT子句可以删除有价值的数据,从而影响准确性。此外,我不确定,但我认为,LIMIT可能会在不同的时间返回不同的行,因此您的计算可能不是确定的。
如果您按小时制作协方差,这意味着您认为一小时内发生的价格是相同的测量值,因此我建议您计算该小时内平均价格的协方差。
如果你没有考虑一小时内的价格是同一测量的一部分,那么你就会发现缺少数据问题,这意味着当价格1发生时你缺少price2的数据,反之亦然。 (参见例如https://stats.stackexchange.com/questions/20457/is-it-possible-to-compute-a-covariance-matrix-with-unequal-sample-sizes)