금융에서 주식의 베타는 주식의 일일 수익률과 인덱스의 일일 수익률을 인덱스 일일 수익률의 분산으로 나눈 값 사이의 공분산입니다. 나는 일련의 주식 및 일련의 지수에 대해 베타를 계산하려고합니다.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 = 말 ... 제한) : 여기
'seq'열에 대한 색인이 있습니까? 이 테이블에 대해 모든 인덱스가 존재합니다. –
방금 주 게시물에 색인을 게시했습니다. – Steve06
date, index_id, permno 및 seq에 색인을 작성해보십시오. 데이터는 "End Of Day"데이터처럼 보입니다. 이 인덱스가 도움이되지 않으면이 쿼리의 실행 계획을 수행하십시오. 우리는 계획에서 병목을 확인할 수 있습니다. –