2011-04-20 4 views
0

금융에서 주식의 베타는 주식의 일일 수익률과 인덱스의 일일 수익률을 인덱스 일일 수익률의 분산으로 나눈 값 사이의 공분산입니다. 나는 일련의 주식 및 일련의 지수에 대해 베타를 계산하려고합니다.MySQL : 재무 베타 계산을위한 쿼리 최적화

여기에 50 영업일 롤링 창 내 쿼리 있고 난 당신이 날 속도를 최적화 할 수 있도록하고 싶습니다 : 두 메인 테이블이 이미 오름차순으로 개체와 날짜에 의해 정렬

INSERT INTO betas (permno, index_id, DATE, beta) 
(SELECT 
    permno, index_id, s.date, IF(
    s.`seq` >= 50, 
    (SELECT 
(AVG(s2.log_return*i2.log_return)-AVG(s2.log_return)*AVG(i2.log_return))/VAR_POP(i2.log_return) AS beta 
    FROM 
     stock_series s2 
     INNER JOIN `index_series` i2 ON i2.date=s2.date 
     WHERE i2.index_id=i.index_id AND s2.permno = s.permno 
     AND s2.`seq` BETWEEN s.`seq` - 49 AND s.`seq` 
     GROUP BY index_id,permno), NULL) 
    AS beta 
FROM 
    stock_series s 
    INNER JOIN `index_series` i ON i.index_id IN ('SP500') AND i.date=s.date 
) 
ON DUPLICATE KEY 
UPDATE beta= VALUES (beta) 

하고, 그들은 이미 "seq"칼럼뿐만 아니라 로그 일일 수익을 포함합니다. Seq는 회사 (또는 인덱스)와 같은 모든 일일 행을 연속적으로 열거합니다. 즉, seq는 테이블의 모든 새로운 주식 또는 인덱스에 대해 1에서 시작하고 주어진 엔티티의 총 행 수까지 계산합니다. 나는 롤링 윈도우를 허용하기 위해 그것을 만들었습니다.

지금까지 500 개의 회사와 1 개의 인덱스를 사용하여 쿼리가 영원히 완료됩니다. 보기, 저장된 procs, 임시 테이블 등 마음에 오는 최적화를 알려주십시오. 물론 불일치를 발견하면 알려주십시오.

편집 : 인덱스 : stock_series이 PRIMARY KEY (permno, 날짜) 및 UNIQUE KEY (permno, 서열)가, index_series을 포함하여 PRIMARY KEY (INDEX_ID, 날짜)

이 한 회사에 대한 확장 된 결과를 설명을 (이 WHERE s.permno = 말 ... 제한) : 여기 enter image description here

+0

'seq'열에 대한 색인이 있습니까? 이 테이블에 대해 모든 인덱스가 존재합니다. –

+0

방금 ​​주 게시물에 색인을 게시했습니다. – Steve06

+0

date, index_id, permno 및 seq에 색인을 작성해보십시오. 데이터는 "End Of Day"데이터처럼 보입니다. 이 인덱스가 도움이되지 않으면이 쿼리의 실행 계획을 수행하십시오. 우리는 계획에서 병목을 확인할 수 있습니다. –

답변

-1

내가 프로가하는 일 : 다음에 그 calcualte하지 않는 EXPLAIN EXTENDED of above SELECT query

ALL에 대한 확장 된 결과 ~ 500 개 기업을 EXPLAIN databae. 데이터를 가져 와서 계산하고 다시 삽입하십시오. 내가 일하는 곳에서 그들은 일의 끝에서 그 물건을하고있는 휴 그리드를 가지고있다. 네, 상당수의 기계에서와 같이 기가 바이트의 csv 파일을 생성 한 다음 데이터베이스에 다시로드하는 방법에 대해 설명합니다. Beta, Gamma, PnL은 120.000 가지 요소로 거래됩니다. 데이터 베이는 이에 최적화되어 있지 않습니다.

+0

나는 그것을 알고 있으며 Excel VBA 나 다른 언어로 직접하는 법도 알고 있습니다. 문제는 그러한 솔루션이 많은 작업을 제시하며 베타 계산을 자주 수행 할 필요가 없다는 것입니다. 그래서 순수 MySQL에 보관하려고합니다. 모든 행을 반복하는 저장 프로 시저 일 수도 있습니다. – Steve06