수익률 계산 – 3

우리나라 금융권에서 전통적인 유가증권의 투자수익률 계산에는 시간가중 수익률을 주로 사용한다.
전통적인 유가증권이라 함은 주식이나 채권 등과 같이 거래가 용이하고 법률로 정의된 정형화된 유가증권들을 의미한다.

시간가중수익률의 IT적인 처리
시간가중 수익률을 계산하기 위해서는 일별 수익률이 필요하다. 일별수익률은 아침에서 저녁까지, 더 정확하게 얘기하면 전일 저녁에서 오늘 저녁까지의 수익률을 의미한다. 이 때 주의해야 할 점은 전일 저녁과 오늘 아침은 연결되어 있다는 점이다. 즉, 전일 저녁과 오늘 아침 사이의 비 영업시간은 존재하지 않는 개념으로 생각해야 한다.(전일 결산이 끝나고 오늘 아침까지 밤사이에 발생하는 수익, 자금유입, 자금유출은 오늘의 수익, 자금유출입에 해당된다)
따라서 데이터베이스에 저장하기위해서는 통상적으로 일별 수익률을 저장하는 테이블에 별도 저장하며 통상적으로 BM(Benchmark)의 수익률 정보를 함께 저장한다. 그 이유는 일별로 정보를 분석하는 일이 대부분이며 BM과 함께 쌍으로 계산하는 경우가 많으므로 I/O 발생을 줄이기 위해 동일한 테이블 내에 데이터를 함께 저장한다.
그런데 일별 수익률을 저장해 두면 누적 수익률은 어떻게 계산할까?
시간가중 누적수익률을 계산하기 위해서 테이블이나 스프레드시트에 저장된 수익률들은 하나씩 읽어서 프로그램적으로 (1+R1)*(1+R2)*(1+R3)…*(1+Rn)-1을 할 수도 있으나 통상적으로는 내장함수인 SUM()을 이용한다.

SUM(), LN(), EXP()함수 이용
데이터베이스나 스프레드시트에는 보통 SUM, LN, EXP함수들이 존재한다. 내장함수들은 사용자 정의Stored Procedure/Function들 보다 속도가 조금 더 빠르므로 내장함수들을 이용하는것이 속도와 Query 조회에 유리하다.

SELECT OP_DT, FUND_RET, BM_RET
FROM   TD01_FUNDRET
WHERE  OP_DT BETWEEN '2011-01-01' AND '2012-12-31'

Result
OP_DT       | FUND_RET               | BM_RET
--------------------------------------------------------
2011-01-01  | 0.0003                 | 0.00024
2011-01-02  | 0.0012                 | 0.0017
2011-01-03  | 0.0011                 | 0.0015
..

등과 같이 조회되는 경우 시간가중 누적수익률은 (1+0.0003)*(1+0.0012)*(1+0.0011)* … -1로 계산이 되어야 한다.
내장함수를 이용한 누적수익률 계산은 EXP(SUM(LN(1+r)))-1을 이용한다.

SELECT EXP(SUM(LN(1+FUND_RET)))-1, EXP(SUM(LN(1+BM_RET)))-1
FROM   TD01_FUNDRET
WHERE  OP_DT BETWEEN '2011-01-01' AND '2012-12-31'

Index를 이용하는 방법
Index란 시장과 같이 여러 요소가 복합적으로 이루어져 있는 상태를 수준으로 변환하여 나타내는 지표를 의미한다. 흔히 주가지수(Stock Market Index)와 같은 시장 상태 또는 수준을 숫자로 변환하여 나타내는 지표가 되겠다. 그런데 수익률 계산도 누적 수익률을 일별로 계산해 두고 이를 Index(지수)로 삼아 수익률 계산을 하면 간단하게 시간가중 누적수익률을 간단히 계산할 수 있다.
이를 위해서는 최초 기준일부터 매일매일 누적 수익률(정확하게는 시작점을 100또는 1000을 기준으로 하는 누적 수익률)을 계산하여 저장해 두어야 한다.

SELECT OP_DT, FUND_RET_IDX, BM_RET_IDX
FROM   TD01_FUNDRET
WHERE  OP_DT BETWEEN '2011-01-01' AND '2012-12-31'

Result
OP_DT       | FUND_RET_IDX           | BM_RET_IDX
--------------------------------------------------------
2011-01-01  | 1000.3                 | 1000.24
2011-01-02  | 1004.204               | 1001.94
2011-01-03  | 1005.308               | 1003.443
..

이제 2012년 1월 1일 부터 2013년 12월 31일까지 2년 누적 수익률을 계산하기 위해서는 2012년 12월 31일 누적 수익률을 2011년 12월 31일 수익률로 나누면 된다.

SELECT  A.FUND_RET_IDX / B.FUND_RET_IDX - 1
FROM    TD01_FUND_RET A,
        TD01_FUND_RET B
WHERE   A.OP_DT  = '2013-12-31'
AND     B.OP_DT  = '2012-01-01' - 1

두 방식 모두 장단점이 있으므로(계산속도, 일별 수익률을 chart 등으로 보여주는 경우, 연속적인 누적수익률 계산시 등) 두 방식을 혼용하는 경우도 있고 따로 사용하는 경우도 있다.