글 작성자: Maumpharm
반응형

변수의 차원 맞추기

퀀트 로직 중 핵심이 되는 매수/매도 조건식을 만들기 위해서는 몇 가지 지켜야 할 사항이 있다. 그 첫 번째로는 지표(변수)의 차원을 맞춰서 연산하는 것이다. 수식을 사용해 신규 지표를 정의하거나 만들 때는 단위(차원)를 일치시켜 연산 가능한 로직으로 구성해야 하는 것이 가장 기본이다.

먼저, 기술적 분석 관점에서 가장 선행적인 지표 중 하나인 거래량/거래대금을 예로 들어 다루어 보자

거래량과 거래대금은 특정 종목에 대해 얼마나 많이 사고 팔았는 지 판단할 수 있는 지표이다. 특정 가격에서의 매도와 매수 거래가 모여 OHLC(Open : 시가, High : 고가, Low : 저가, Close : 종가)를 이루고 일봉을 나타낸다. 그리고 이 일봉들이 모여, 이동평균선을 그린다. 따라서, 거래량과 거래대금이 종가보다 선행적 지표이며, 종가보다 이동평균 n일선이 선행적 지표가 된다.

가장 선행적인 거래량과 거래대금은 다음과 같은 관계가 있다.

(거래량) * (평균거래가격) = (거래대금)

위와 같이, 거래량의 단위는 (주)이고 거래대금의 단위는 (원)이다. 위의 두 지표는 의미하는 바가 유사하기 때문에 적절한 종목을 선정하는 퀀트 로직에 많이 사용된다. 하지만 두 지표의 단위가 다르므로 다른 지표와 혼합하여 사용할 때는 적절한 지표를 사용하는 것이 좋다.

파이썬 프로그래밍과 같은 컴퓨터 언어에서도 변수의 Type이 다르면 연산하지 못한다.

a = 34205 - '205'

위와 같은 수식에서 a는 34000이라는 숫자값을 나타내지 않고 수식 자체가 옳지 않다는 오류를 나타낸다. 왜냐하면 34205는 정수형 타입(int)이고, '205'는 문자열 타입(str)이기 때문에 서로 연산이 되지 않는 것이다.

다음과 같이 A와 B라는 새로운 매수 조건식을 만들어 보자.


A = {거래량} - {거래대금}
B = {거래량} / {거래대금}

 

A는 연산할 수 없는 지표이며, B는 (주/원)의 단위를 갖는 신규 지표이다. B의 수식은 1 / {평균거래가격} 으로도 볼 수 있으므로, (1/원)의 단위를 갖고 있다고도 볼 수 있다.

젠포트에서 매수/매도 조건식을 연산할 때 지표의 값의 단위가 포함되지 않으므로 {거래량}-{거래대금}의 값을 조건식에 이용할 수 있지만, 실제로 이는 매우 의미가 없는 수식이 된다. 위에서 설명했듯이 지표의 단위를 생각해 보면 (주 : 주식 수) - (원 : 금액) 이 되는 것인데 연산이 불가능한 단위이기 때문이다. 이러한 잘못된 로직은 과최적화를 유발하기 매우 쉽기 때문에 나만의 매매 지표를 만들 때 단위 연산을 필수적으로 검증해야 한다.

 

무차원 수로 조정하기

위에서 설명한 B의 지표를 다시 생각해보자, B = 1 / {평균거래가격} 의 수식은 B가 클수록 평균 거래 가격이 낮고 작을수록 평균 거래 가격이 큰 것을 의미한다. B 수식을 이용하여 아래의 새로운 조건식을 만들어 보자

가 : ({거래량} / {거래대금}) - 과거값(' {거래량} / {거래대금}', {2일}) > 0
혹은
가' : ({거래량} / {거래대금}) / 과거값(' {거래량} / {거래대금}', {2일}) > 1

(가)와 (가')은 같은 로직이며, 특정 종목의 평균거래가격이 3일 전보다 어제 종가가 더 높다면 종목의 모멘텀이 크다고 판단해 매수하는 조건이다.

나 : 비율내림차순({거래량} / {거래대금}) > 90

하지만 (나)와 같이 B 지표가 상위 10%인 종목을 매수하는 로직을 만든다면, 평균 거래 가격이 작은 종목을 매수하므로 단순히 시가가 작은 동전주만을 매수하는 로직과 다를 바가 없다.

위의 두 조건식의 차이는 무엇일까? (가)는 (주/원)의 단위를 가진 값을 나타내지만 동일종목의 변화량을 나타내므로 주가가 다른 서로 다른 종목간의 객관적인 비교가 가능하다. (가') 로직은 무차원의 결괏값을 갖는다. 즉, 연산 값의 단위가 없는 것이다. 따라서 종목의 현재 시가에 상관없이 객관적인 비교를 할 수 있다.

반면에 (나) 로직은 어떨까? 과거값을 상대적으로 비교하지도 않고, (주/원)의 단위를 가진 값을 나타내기 때문에 단순히 {시가} 지표와 다를 것이 없다. 즉, 50,000원의 시가를 나타내는 주식과 500원의 시가를 나타내는 주식의 비교가 불가능하다. 따라서 하나의 로직을 이용하여 각기 다른 종목들의 우월성을 비교하기 위해서는 로직의 값을 무차원으로 만드는 것이 좋다.

 

 

무차원으로 조건식 설정하기

특정 주가의 변동성을 나타내는 지표를 만들어보자. 종가와 고가의 차이가 크고 종가와 저가의 차이가 크다면 변동성이 크다고 생각할 수 있다. 따라서 두 차이를 곱한 갑을 지표로 아래의 식을 만들어보았다.

조건식 1 : ({고가}-{종가}) * ({종가}-{저가})

(조건식 1)은 (원)^2의 차원을 가지고 있다. 따라서 종목 간 객관적 비교는 불가능하기 때문에 종가의 제곱으로 나누어주면 아래와 같이 무차원의 조건식 2를 얻을 수 있다.

조건식 2 : ({고가}-{종가}) * ({종가}-{저가}) / ({종가} * {종가})

조건식 2를 이용하여 변동성이 큰 종목과 낮은 종목을 선별하는 각 경우에 대해 비교하여 백테스팅해 보면 아래와 같은 결과를 얻을 수 있다. 종목은 20%비중으로, 20일 보유 후 매도 조건이고, 로직을 만족하는 종목들의 매수 우선순위는 시가총액이 낮은 순서대로 매수하였다.

 

매수 조건식 : 비율내림차순('({고가}-{종가}) * ({종가}-{저가}) / ({종가} * {종가})') > 90

 

매수 조건식 : 비율내림차순('({고가}-{종가}) * ({종가}-{저가}) / ({종가} * {종가})') < 10

이 결과를 통해 우리는 변동성이 큰 종목보다 작은 종목이 더 바람직한 결과가 나올 가능성이 높음을 예측할 수 있다. 물론, 매매 조건을 변화시키면 다른 결과가 나올 수 있다. 하지만 일반적으로 변동성이 낮은 종목이 장기적으로 우상향 할 가능성이 높은 것으로 많이 알려져 있고, 실제로 위의 결과는 이에 부합하는 것처럼 보인다.

위의 결과보다 중요한 것은 (조건식 2)가 다양한 종목들을 객관적으로 비교할 수 있는 무차원의 값을 가진 지표라는 것이다. 종목을 구분하는 로직을 (조건식 1)로는 사용할 수 없지만, 가격^2 차원인 (종가)^2를 나누어줌으로써 객관적인 비교가 가능하게 되었다.

반응형
마음약국 대표전화: 02-964-0675 Email: 0stjpharm@gmail.com 주소: 서울시 동대문구 왕산로 183