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の があります。最終的には、これらすべてのペアの価格の実行中の (経時的な) 共分散を計算できるようにしたいと考えています。最初は、単一のペアの共分散を計算するだけで解決でき、その後反復できます。

共分散を計算するには、同じ長さの 2 つの配列が必要です (この場合はprice)。これを単一のクエリとして記述する方法に苦労しており、ローカルで共分散を計算するためにすべてのレコードが返されるのを避けています。

2 つの疑似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、 andの 2 つの等しい長さの配列を取りprice2、共分散を計算します。2 番目のステートメントは、2 つの異なるタイプを選択するもので、すべてトランザクションの最初の 1 時間以内に発生し、返される値が同じ長さに制限されます。

私の限られた SQL の知識では、これらのクエリをどのように組み合わせるかを理解するのに苦労しています。どんな助けでも大歓迎です。最終的に、特定の時間ブロックのペアごとの共分散を計算する 1 つのクエリを実行できると便利です。

4

1 に答える 1

0

ここで少し混乱しています。共分散は、同時に収集されたデータで計算されることを意図しています。(同時に行われた2つの測定のように

LIMIT 句を使用すると、精度に影響する貴重なデータが削除されます。また、それについてはわかりませんが、LIMIT は異なる時間に異なる行を返す可能性があるため、計算が確定しない可能性があると思います。

共分散を 1 時間ごとに作成している場合、それは 1 時間内に発生する価格が同じ測定値であると見なすことを意味するため、その時間内の価格の平均で共分散を計算することをお勧めします。

1 時間以内の価格を同じ測定の一部と見なしていない場合は、欠落しているデータの問題があります。つまり、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 に答える