가치 투자 및 관련 종목 검색 (대신증권 API 기반 파이썬 활용)

가치 투자라는 것은 성장 가능성만을 보고 투자하지는 않는다. 전망을 신뢰하기 보다 객관적인 자료로 현재 상황을 판단하여 투자하는 방식이다. 필자는 성장 가능성을 주로 보긴 하지만 가치 투자에 근거하여 일부 종목을 매매해보고자 자료를 수집하고 정리해봅니다. 투자에 참고하시길 바랍니다.

가치 투자 정의

기업 가치의 산출에는 여러 가지 방법이 있지만 금융감독원의 ‘유가증권 인수업무에 관한 규정’에서 제시하는 식을 살펴보면 아래와 같다

본질가치 = (자산가치 * 2+ 수익가치 * 3) /5

여기서 자산 가치는 재무상태상의 자본 총계를 의미하며 부채를 뺀 순 자산가치를 의미한다.

자산가치 = 자산총계 – 부채총계 = 순자산가치 = 청산가치

그리고 수익 가치는 기업활동으로 이익으로 발생 가능한 가치이다.

자산가치와 수익가치를 기업의 주식수로 나누면 각각 BPS(=자산가치)와 EPS(=수익가치)로 표현된다.

파이썬 활용 종목 검색

시가총액 2000억 이상이며 1/PER(=기대수익률) > 0.12 이상 그리고 PBR < 1.0 이하이면서 자산가치가 현재 주가보다 높은 종목(가치투자에 따른 상승 기대 종목)을 검색하기 위해 파이썬 코드로 검색해보았다.

대신증권 API 활용, Python 3.6.1(x32)

# find valuable items
import win32com.client

# declare Cybosplus API
cpStockCode = win32com.client.Dispatch("CpUtil.CpStockCode")
cpStockMst = win32com.client.Dispatch("dscbo1.StockMst") # not CpDib.StockMst

# total num of stock items
itNum = cpStockCode.GetCount()
print(itNum)

for it in range(0, itNum):

   # get item info
   itCode = cpStockCode.GetData(0, it)
   itName = cpStockCode.GetData(1, it)

   # request info
   cpStockMst.SetInputValue(0, itCode)
   cpStockMst.BlockRequest()

   # get header values
   managedStatus = chr(cpStockMst.GetHeaderValue(66)) # 관리구분
   alarmInvestStatus = chr(cpStockMst.GetHeaderValue(67)) # 투자 경고 구분
   tradeStopStatus = chr(cpStockMst.GetHeaderValue(68)) # 거래 정지 구분
   unfaithfulNoticeStatus = chr(cpStockMst.GetHeaderValue(69)) # 불성실 공시 구분
   exchangeType = chr(cpStockMst.GetHeaderValue(45)) # 소속구분 '1' : 거래소, '5': 코스닥

   # filtering items
   if managedStatus == 'N' and alarmInvestStatus == '1' and 
         tradeStopStatus == 'N' and unfaithfulNoticeStatus == '0':

      # only to consider KOSPI or KOSDAQ
      if exchangeType == '1' or exchangeType == '5':

         currentPrice = int(cpStockMst.GetHeaderValue(11)) # current price (현재가)
         stockNum = int(cpStockMst.GetHeaderValue(31)) # 발행주식수
         marketCap = currentPrice * stockNum
         EPS = float(cpStockMst.GetHeaderValue(20)) # EPS
         BPS = float(cpStockMst.GetHeaderValue(70)) # BPS
         PER = float(cpStockMst.GetHeaderValue(28)) # PER

         if BPS != 0:
            PBR = float(currentPrice/BPS) # PBR calculation
         else:
            PBR = float('inf')

         # calc essencial value (본질 가치)
         assetValue = BPS
         profitValue = EPS / 0.01 # 10% 할인률 적용
         eValue = (assetValue * 2 + profitValue * 3) / 5

         if marketCap > 200000000000 and PER != 0 and 1 / PER > 0.12 and PBR < 1.0:
            if eValue > currentPrice:
               print(itName + "<" + itCode + ">")

검색 결과 (2017년 8월 13일)

대림산업<A000210>
한국타이어월드와이드<A000240>
기아차<A000270>
대원강업<A000430>
동아쏘시오홀딩스<A000640>
강남제비스코<A000860>
한화<A000880>
대한제분<A001130>
유진투자증권<A001200>
부국증권<A001270>
종근당홀딩스<A001630>
신영증권<A001720>
오리온홀딩스<A001800>
삼호<A001880>
KISCO홀딩스<A001940>
한국유리<A002000>
아세아<A002030>
쌍용양회<A003410>
대신증권<A003540>
현대제철<A004020>
세방<A004360>
대림씨엔에스<A004440>
현대차<A005380>
넥센<A005720>
풍산홀딩스<A005810>
에스엘<A005850>
동아타이어<A007340>
서연<A007860>
현대모비스<A012330>
동원개발<A013120>
유니드<A014830>
부산가스<A015350>
예스코<A015360>
한국전력<A015760>
SK가스<A018670>
유진기업<A023410>
기업은행<A024110>
원익홀딩스<A030530>
교보증권<A030610>
LG디스플레이<A034220>
평화정공<A043370>
세아홀딩스<A058650>
세이브존I&C<A067830>
현대백화점<A069960>
GS<A078930>
휠라코리아<A081660>
대한제강<A084010>
한화생명<A088350>
현대EP<A089470>
SK이노베이션<A096770>
메리츠금융지주<A138040>
BNK금융지주<A138930>
DGB금융지주<A139130>
JB금융지주<A175330>
아세아시멘트<A183190>
광주은행<A192530>
서연이화<A200880>
코라오홀딩스<A900140>
GRT<A900290>

참조

 

R 함수로 코스닥 데이터 가져오기

R은 통계 관련 대표적인 오프 소스 도구이지만 머신러닝에서도 최근 많이 사용된다. 머신러닝이라고 하면 데이터를 다루는 기법(또는 분야 학문)다. 필자가 관심있어 하는 주식도 마찬가지로 데이터로 구성된 분야이기에 머신러닝 적용이 가능하다. 예로 예측하는 것도 주식의 과거 데이터를 이용해서 예측할 수 있겠다.

그러므로 R를 이용해서 어쩌면 주식 관련 처리를 하고 싶은 분들도 있을 것이다. 기본적인 통계뿐 아니라 머신러닝에도 적합한 도구이기 때문이다. 사실은 필자도 그 중 한명이기에 R를  활용하여 주식 관련 데이터를 처리하고 싶어 이것저것 찾아보았다. 역시나 R에서 주식 관련 패키지들이 존재한다.

quantmod, tseries 그리고 fImport와 같은 것들이 있다. 하지만 아쉽게도 국내 KOSDAQ 데이터를 가져올 수 있는 패키지는 없었다.

그렇지만 우연히 국내 사이트(http://blog.naver.com/lisist/220417131329)에서 R을 활용하여 코스닥 (KOSDAQ) 데이터를 가져오는 법을 확인할 수 있었다. 그나마 다행이었다. 다양한 패키지에 속해있는 함수들은 사용할 수 없겠지만 그래도 데이터를 가져올 수 있었다. 그 버전을 보완해서 약간의 locale 문제도 반영한 R 함수를 github에 올려놓았다. 참고하시길 바란다

https://github.com/lifegear/get-Korean-stocks-by-R

R 소스를 다운로드받고 우선  XML 패키지를 설치해야 한다. (필자의 경우 R Studio 활용)

> install.packages("xml")

그리고 나서 XML 패키지를 불러온다

> library(xml)

그런 다음 g.hist2 라는 함수를 아래와 같이 호출한다.

> output <- g.hist2("KOSDAQ:035720", "2017-01-01", "2017-05-01")
> output
 Date Open High Low Close Volume
1 2017-04-28 14050 14050 13600 13650 129595
2 2017-04-27 14000 14150 13900 13900 66842
3 2017-04-26 14000 14250 13750 14000 115246
4 2017-04-25 13900 14150 13850 13900 98483
5 2017-04-24 14250 14300 13850 13900 118903
6 2017-04-21 14350 14500 14000 14250 136055
7 2017-04-20 14650 14850 14150 14250 250277
8 2017-04-19 13600 15700 13600 14700 1282552
9 2017-04-18 13600 13600 13300 13550 151580
10 2017-04-17 13800 13850 13450 13500 175651
11 2017-04-14 14200 14200 13600 13750 155652
...

아래는 output 데이터를 활용해서 출력한 주식 차트 그래프이다

> plot(output$Date, output$Close, type="l")
chart

아래는 R 함수 소스이다 (github url 바로가기)

library(XML)

g.hist2 <- function(ticker, start_date, end_date){

 #ticker set & modify
 ticker_m <- gsub(":","%3A",ticker)

 #set locale
 lct<-Sys.getlocale("LC_TIME")
 Sys.setlocale("LC_TIME", "C")

 #set date
 start_date = as.Date(start_date)
 end_date = as.Date(end_date)

 #format date for calling google finance url
 fmtstr <- "%b+%d%%2C+%Y" #ex) Jan+01,+2017
 start_date_fmt <- as.character(format(start_date, fmtstr))
 end_date_fmt <- as.character(format(end_date, fmtstr))

 #set URL
 url = 'http://www.google.com/finance/historical?q='
 url = paste(url,ticker_m,'&startdate=',start_date_fmt,'&enddate=',end_date_fmt,'&num=200',sep='')

 #downloading data from the Google Finance
 output <- as.data.frame(readHTMLTable(url,stringsAsFactors=FALSE)[4])

 output[, 1] <- as.Date(output[, 1], format="%b %d, %Y")
 names(output) <- c("Date", "Open","High","Low","Close","Volume")

 for (k in 2:6){
 output[, k] <- as.numeric(gsub(",", "", output[, k]))
 }

 #### Checking whether all data are retrieved or not ####
 end <- as.Date(output[length(output[, 1]), 1])
 ll <- 200 - length(output[, 1])
 if ((end-ll)<start_date) end <- start_date
 if (end > start_date) {
 output <- rbind(output, g.hist2(ticker,start_date,as.character(end-1)))
 }

 return(output)
}

금리 이해

주식뿐 아니라 모든 재테크의 근본은 금리이다. 1~2% 대 초저금리 시대이지만 그래도 금리의 조정에 대해서는 민감하다. 금리가 여러 파생상품이나 증권 그리고 지표들을 변화시키는 근본 요인으로 작용하기 때문이다. 경제가 복잡해져서 수식처럼 깔끔히 정리는 되지 않겠지만 금리와 관련된 여러가지 내용을 정리해본다.

금리의 대장, 콜금리

정부 정책 도구로서 콜금리는 그것을 올리느냐 내리느냐에 따라 경기와 물가, 성장과 가격변수에 지대한 영향을 끼친다. 콜금리는 금융사끼리 남거나 모자르는 자금을 30일 이내의 초단기로 빌려주고 받는 때의 금리이다. 우리나라 콜금리는 각 경제계 대표들의 집합체인 금융통화위원회 위원들이 한 달에 한 차례 결정한다.

신이 내린 파워 FOMC

우리나라 금융통화위원회에 해당하는 것이 미국의 FOMC(Federal Open Market Committee, 연방공개시장위원회)다. 미국 경제가 세계 경제에서 차지하는 비중을 감안하면 미국의 금리 결정은 전 세계 경제와 금융계에 엄청한 파장을 미친다. FOMC는 미국의 연방준비제도 이사회(FRB)  산하로서 미국 내 통화 및 신용정책에 관한 내용을 비롯한 금리, 은행의 지급준비금, 통화량 등을 결정하는 최고결정기구다. FOMC는 6~8주 간격으로 1년에 8차례의 회의를 갖는다  FOMC의 회의 결과는 뉴욕과 런던, 도쿄뿐만 아니라 우리의 금리시장, 즉 채권시장에도 직접적인 영향을 미친다.

금리와 채권 가격은 반비례

채권은 돈 빌리며 이자 얼마 주겠다고 약속한 증서이다. 채권을 발생한 당시 금리보다 경제적인 호황 등으로 이후 시중금리가 하락하면 채권에서 약속한 수익률(당시 금리 수준)이 시중금리보다 높으니 결국 채권 가격이 오르게 된다. 따라서 금리가 내려가면 수익률이 상대적으로 좋아져 채권 가격은 오른다. 역으로 금리가 올라가면 채권 가격은 떨어진다.

금리와 경기 상황

금리에 가장 민감한 영향을 주는 것은 역시 경기 상황이다. 정부와 중앙은행은 경기 조절을 위해 금리라는 변수를 먼저 움직일 때가 많다. 반드시 그런 것은 아니지만 경기 상승 국면에서 투자가 증가하면 물가도 동반 상승하여 금리의 상승 요인으로 작용하기도 한다. 이렇다보니 경제성장률, GDP 의 발표 및 전망치는 금리에 영향을 주며 또한 채권 시장에 직접적인 영향을 미친다.

금리와 경기종합지수

경기종합지수(CI, Composite Index)는 국민 경제의 총제적 활동 수준을 가리킨다. 동행, 선행 그리고 후행지수로 나뉜다. 그 중 선행지수의 구성요소 중에는 시대 변화에 따라 선행성이 약해지고 있다. 그만큼 경제 변동요인이 복잡해져 예측하기 힘들게 된 것이다. 즉, 현재의 선행지수를 가지고 경기 저점을 예측하는 데는 한계가 있다는 것이다. 참고로 선행지수로 사용되는 지표는 입/이직자 비율, 중간재 출하지수, 내구소비재 출하지수, 건축 허가 면적, 건설용 중간재 생산지수, 기계 수주액, 재고순환지표, 총유동성, 수출신용장 내도액, 수출용 원자재 수입액 등 10개 지표를 종합해서 작성된다.

금리와 물가

금리에 영향을 주는 또 다른 요소가 물가상승률이다. 금리가 오르면 물가는 떨어진다. 역으로 물가가 상승하면 보통은 금리도 상승하게 된다. 실제적인 과정은 물가 상승으로 인해 부담을 느낀 정책 당국이 금리 인상 조치를 취한다. 금리 인상은 돈의 흐름을 금융상품으로 더 많이 끌어 들이게 될 것이고 이렇게 되면 상품에 대한 수요가 떨어지게 되고 결과적으로 물가는 하락하게 된다. 그리고 보통 경기가 침체되면 정부는 금리 인하 조치를 통해 경기를 부양하려고 한다. 금리 인하 조치로 원래 목적은 기업의 금융 부담을 완화시켜 투자를 촉진하고자 한 것이나 금리 인하 조치의 파급경로가 변하여 소비자의 소득을 증진시키는 자산 효과로 파급되어 물가를 올려 오히려 역효과를 일으킬 가능성도 배제할 수 없다.

금리와 유가

우리나라의 경우 석유의 생활의존도가 높기 대문에 유가가 오르면 소비자 물가가 상승한다. 국제 유가가 배럴당 1달러 오르면 소비자 물가 0.15% 포인트 상승한다고 한다.  물가 상승뿐 아니라 경제 성장률 둔화, 경상수지 적자 등 삼각파도에 직면하게 된다. 결국 유가는 즉각적으로 우리나라 물가에 영향을 주므로 결국은 금리에도 영향을 준다는 것이다.

금리와 주가

대체로 금리 인하의 신호가 감지되면 주가는 상승한다. 반면 금리가 상승하면 주가는 하락한다. 하지만 예외가 있다. 일본의 경우에도 주가와 금리가 동시에 하락했다. 일본의 저금리 정책은 경기도 부양을 하지 못했고 증시 침체에도 도움을 주지 못했다. 금리가 낮아도 미래에 대한 불안으로 허리띠를 졸라매고 소비가 위축되어 주식 시장 부양도 되지 않은 것이다. 중요한 점은 저금리일지라도 기업의 경기 활성화로 이어지지 않으면 주가 상승으로 연결되지 못한다. 중요한 점은 초저금리 시대에 금리로 인하여 돈을 더 빌리고 말고 할 여지가 별로 없다는 것이다. 따라서 저금리 시대에서 금리 자체가 주가에 영향을 주는 요소는 작다. 단, FOMC의 금리 조정은 세계 경제에 영향을 주는 요소이기에 주가 변동 요인으로 작용할 수 있다.

주가는 경기에 선행하나

금리가 주가의 움직임에 미치는 영향을 알아보았으니 이번에는 주가가 금리에 어떤 영향을 미치는지 알아보자. 보통 주가는 경기에 선행한다고 알려줘 있다. 그러나 경기선행지수에는 종합주가지수가 포함되어 있지 않다. 그 이유는 주가가 가지고 있는  불규칙적이고 변동성이 너무 커서 선행지수에 포함될 경우 오히려 선행지수의 신뢰성을 떨어뜨리는 결과를 가져오기 때문이다

금리와 환율

환율은 금리를 변동시키는 주요한 요인이 된다. 반대의 경우에도 영향을 미치기는 마찬가지다. 예로 우리나라의 물가가 외국보다 많이 오르면 우리나라 수출 상품의 가격은 상대적으로 비싸진다. 그러므로 수출이 감소하고 수입이 증가한다. 이에 따라 사용되는 외국돈이 귀해져 환율은 상승하게 된다. 경제성장률이 높으면 우리나라 경제에 대한 신뢰도로 외국인의 투자가 늘어 환율을 하락시키는 요인으로 작용할 수 있다. 한편 우리나라의 금리 수준이 외국보다 높으면 높은 이자 수익을 얻기 위해 외국 투자자들이 국내 은행에 예금을 하거나 채권을 사려고 할 것이다. 결국 외국돈이 많아져 환율이 하락한다.

참조

파이썬을 활용한 주가 회귀분석 예

파이썬을 활용하여 주가 회귀분석을 한 예를 정리해보고자 한다. 구글 주가 데이터를 가져와 3일봉(3일전 데이터), 2일봉(2일전), 1일봉을 활용해 주가를 예측하는 예이다. 상관관계가 없는 데이터간 회귀분석을 하는 것이 적당하지 않을 지 몰라고 데이터 분석을 위한 pandas와 주가 데이터 등을 쉽게 가져올 수 있는 quandl (https://www.quandl.com/)이라는 라이브러리를 이용한 단순한 예로만 이해하면 된다.

import numpy as np #벡터와 행렬 계산을 위한 함수 라이브러리
import pandas as pd #데이터 분석을 위한 라이브러리
import quandl, math #주가 데이터를 가져오기 위한 라이브러리
from sklearn import cross_validation #학습과 테스트를 위한 데이터 분리
from sklearn.linear_model import LinearRegression #회귀분석 라이브러리

#구글 주가 데이터를 가져와 Quandl데이터 셋 구성
#Quandl 데이터셋에는 일단위 시가, 종가, 고가, 저가, 거래량 등이 포함되어 있음
df = quandl.get('WIKI/GOOGL')

df['Close3'] = df['Close'].shift(3)
df['Close2'] = df['Close'].shift(2)
df['Close1'] = df['Close'].shift(1)
df.dropna(inplace=True)

X = np.array(df[['Close3', 'Close2', 'Close1']]) #회귀분석 라이브러리 활용을 위한 데이터셋 구성
y = np.array(df['Close']) #타겟  구성

X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.2) #데이터 분리

clf = LinearRegression() #회귀 분석 객체 생성
clf.fit(X_train, y_train) #회귀 분석 학습

#만약 Close3: 812 ~Close1: 799일 경우 종가 예측 방법
clf.predict([[812, 813, 807]])

실제 회귀 분석을 해보면 구글 주식의 경우 회귀 계수 (파라미터)가 아래와 같다

array([3.31584798e-04, -4.98201976e-02,
1.03048347e+00])

참고로 구글의 종가(Close)에는 근접한 일봉(Close1 > Close2 > Close3)일수록 영향을 많이 받는 것을 알 수 있다

터틀 트레이딩

1980년 대 초 시카고 선물 시장에서 군림하던 트레이더 리처드 데니스가 트레이더 그룹을 강화하기 위해 13명의 상품 선물 트레이더를 모집한 적이 있다. 트레이더는 그 전까지는 재야의 고수처럼 그들만의 공식을 비밀로 하고 해서 드러나지 않은 직업이었기에 그 당시 트레이더의 모집은 놀라운 시도이었다. 중요한 사실은 그 곳에서 훈련받은 트레이더는 단지 2주간의 훈련으로 트레이더로써 업무를 시작했다는 것이고 더군다나 향후 실력있는 트레이더들로 성장했다는 것이다. 짧은 기간의 교육으로도 가능한 이유는 복잡한 시장원리나 경험보다는 단순한 규칙 기반의 트레이더 매매 방식을 적용했기 때문이다. 더 놀라운 사실은 그러한 규칙을 기반으로 한 트레이딩에 있어 많케는 년 150%에 달라는 엄청난 수익이 가능했다는 점이다. 터틀(시스템)이라 불리는 그들만의 공식을 정리해 본다.

시장(종목) 진입/이탈 규칙

4주간 또는 11주간의 신고점 내지는 신저점

매우 단순한 규칙이지만 추세 매매 방식이다. 모집된 트레이더들은 추세 매매의 규칙을 기반으로 트레이딩을 했던 것이다. 물론 약간의 개인적인 응용도 했을 것으로 생각된다.

손절매 규칙

2N 이하로 내려갈 경우

(n을 구하고 n의 이동평균을 구한 후의 오늘의 N값을 의미함. 즉, n은 오늘 고가와 저가와의 차이, 어제 종가와 오늘 고가와의 차이, 어제 종가와 오늘 저가의 차이 중 최대 절대값을 의미함. 가령 각각의 경우 60, -50, -100이며 n은 100라 정의. n을 오늘로부터 지난 15일 동안의 매일 n을 구한 후, 그 합을 15로 나누면 그것이 오늘의 변동성을 의미하는 N을 구할 수 있음)

피라미드 쌓기 규칙

어떤 종목(선물, 주식)을 신고점 돌파에 맞춰 매수를 했는데 그 가격이 계속 상승한다면 매입 주식 수를 더 늘리는 것이다. 정확히는 주가가 1N 상승할 때마다 투자를 늘려갔다.

유닛(리스트 관리) 규칙

터틀은 각각의 트레이딩에 대해 리스트 관리차원에서 최대 손실이 전체 투자금 대비 2퍼센트를 초과하지 않도록 트레이딩하였다. 2%의 유닛이라고 했다. 예로 총 100만원의 투자금이 있다고 하자. 100만원의 2%는 2만원이다. 최대 손실 가능성이 2만원이라는 의미이다. 금일 A 종목에 있어 N이 1500이라고 한다면 손절매 가격은 2N이기에 3000이라 할 수 있다. 따라서 20000(최대손실금)/3000(2N)=6 이므로 리스크 관리 차원에서 최대 6주(계약) 까지만 매수(시장진입)하라는 규칙이다.

터틀 트레이딩이 흥미로운 점은 의외로 단순하다는 점이다. 따라서 기계적으로 시스템 트레이딩하기에도 쉽다는 것이다. 조만간 실험적으로 실제 시스템 트레이딩을 구현해 검증을 하고 싶기도 하다.

참조

  • (월가를 긴장시킨 14일간의 수업) 터틀 트레이딩, 마이클 코벨 지음, 정명수 옮김, 위즈덤 하우스 출판

주식 투자 성공을 위한 4원칙

그 동안의 경험과 투자 관련 책 내용을 바탕으로 성공할 수 있는 주식 투자의 원칙을 세워 본다. 스스로에게 다짐하는 목적도 있으며 또한 처음 주식에 입문하시는 분들께 조금이라도 지침이 되었으면 한다.

1. 방어적 수익 추구

주식 투자로 조금 벌었다고 해도 번 것이 아니다. 한 번의 실수로 몇 년치의 수익이 날라갈 수 있기 때문이다. 따라서 손실 없도록 노력하는 방어적 매매 방식이 몸에 배어야 한다. 가령 추격 매수 등은 절대 금지 사항이다.

2. 미수와 신용, 담보 대출은 절대 금지

주식은 필연적으로 변동하게 되어 있다. 믿는 기업에 투자했겠지만 예기치 않게 외적내적 요인으로 30% 이상 손실이 나올 수 있다. 이럴 경우 대출 상태라면 반대매매에 들어갈 수 있어 팔 수 밖에 없는 상황에 몰린다. 따라서 어떤 주가 변동에서 견딜 수 있도록 여유 자금으로만 투자해야 한다.

3. 분할 매수

주가는 재료나 수급에 따라 단기로 변할 수 있기에 여러 차례 나눠서 매수하면 안정적인 투자를 할 수 있다.

4. 분산 투자

한 종목보다는 분산 투자를 한다. 예기치 못한 상황에도 실패하지 않아야 한다.

참조

  • 쥬라기, 부자가 되는 0.4%의 비밀, 김철상 지음, 지식노마드
    (책에서는 ‘실패하지 않는 투자 12원칙’으로 작성된 내용을 참고하여 위 내용 작성함)

 

 

RBM (제한된 볼츠만 머신) 이해

요즘 한창 뜨고 있고 있는 딥러닝을 공부하고자 한다면 RBM (Restricted Boltzmann machine)이라는 제한된 볼츠만 머신이라는 알고리즘을 최소 한번은 들어 보았을 것이다. 확률적인 개념이라 다소 이해하기 어려운 면도 있어 가급적 쉽게 설명해보고자 한다. RBM을 로봇 트레이딩에 어떻게 활용할지는 아직 잘 모르겠지만… (아래 등장하는 수식에 있어서는 설명의 편의를 위해 간소화시킨 부분도 있음을 미리 언급해둔다.)

RBM은 우선 DBN(DBN, Deep Belief Network)이라고 하는 딥러닝의 일종인 심층신뢰신경망을 구성하는 기본적인 요소이다. 즉 RBM을 여러겹 쌓아서 심층신뢰신경망을 만든다.

그리고 RBM의 구조는 단순하다. 관찰 가능한 가시층(visible layer)과 은닉층(hidden)으로만 구성된다. 아래 그림에서 아래층이 가시층, 윗층이 은닉층인 것이다.

rbm
<RBM>

다만 같은 층 내부 노드간의 연결은 없고 층과 층 사이와의 연결만이 있다. 이런 점에서 제한적(Restricted)라고 불리운다. 그럼 이제 RBM의 주요 개념을 간단히 살펴보자

확률 기반 단층 신경망 RBM

역전파 신경망과 비교해보면 이해가 쉬울 수 있다. 역전파와 비슷하게 RBM도 입력노드에 가충치를 곱한 다음 시그노이드 함수를 적용해 은닉층의 값을 구하는 방법은 비슷하다. 다만 확률적으로 샘플링해서 구한다. 역적파 신경망에서는 시그모이드(Sigmoid) 결과값이 바로 노드의 출력값이 되지만, RBM에서는 노드의 값을 결정짓기 위한 확률값이다. 가령 0.8이라고 하면 역전파 신경망에서는 0.8이 바로 노드 출력값이겠지만 RBM에서는 0.8이 확률값이기에 노드 출력값이 확률에 따라 결정된다. (아래 관련 수식, 가시층 l번째 노드가 1일 때의 확률 분포)

 p(V_l = 1 |h) = sigma (sumlimits_{i=1}^n w_{il} h_i)

확률은 미지의 세계를 모델링하는 데 좋은 도구이다. 가령 내일 비가 올지 예측하는 문제에 대해서 분석적으로 접근하면 아직 미지의 변수가 너무 많아 어렵지만 확률은 그 미지의 것들을 덮어버리고 다만 숫자로 표현하면 그만인 것이다. RBM에서는 머신만이 이해할 수 있는 수치적(가충치) 정보를 확률적으로 학습하는 것이다. 신경망에 확률 개념을 도입하는 이유도 그와같은 이유이다. 다시 말해, 미지의(Unknown) 패턴이 많기 때문이다.

RBM은 에너지라는 개념이 있다. 역전파 신경망을 생각하면 목표치가 있기에 오류치를 계산하고 오류치 만큼 역전파시켜 학습을 시키는 데 RBM은 단층이기에 목표치가 없다. 그래서 다른 방식의 개념이 필요한데 바로 에너지라는 개념이다. 에너지(E)는 마이너스(-) 부호를 가지고 가중치가 0보다 큰 수이기에 입력과 출력이 양의 상관 관계에 있을수록 에너지가 작아진다. 예로 입력이 -1일 때 은닉층 결과가 -1이면 에너지가 최소가 된다.  홉필드 네트워크에서도 비슷한 에너지 개념을 사용하고 있으니 참고하길 바란다.

E(v,h) = - sumlimits_{i=1}^n sumlimits_{j=1}^m w_{ij} h_i v_j

RBM의 학습 방법은 입력층 노드값에 가충치를 곱하고 더하고 확률을 구하고 확률에 근거하여 샘플링하여 은닉층의 노드값을 결정한다. 은닉층의 노드값이 결정되면 또 다시 입력층의 노드값들을 같은 방식으로 결정한다. 그러면서 에너지를 최소화하는 방향으로 가충치를 학습하는 것이다.

참조

알고리즘 트레이딩의 대표적 인물

알고리즘 트레이딩은 시스템 트레이딩과는 약간 개념이 다르지만 알고리즘이나 통계를 기초로 트레이딩을 한다는 의미에서 넓게 보면 유사하다. 알고리즘 트레이딩의 대표격 인물을 살펴보고 정리하고자 한다.

애드워드 소프

애드워드 소프(Edward Thorp)는 알고리즘 트레이딩의 1세대라고 할 수 있다. 월스트리트 최초로 수학과 IT 시스템을 이용해 펀드를 운영했다. MIT 수학과 출신인 그는 뉴포트 파트라즈(Newport Partners)라는 투자회사를 설립했고 약 30년간 연평균 20%에 달하는 수익을 창출했다. 그 때 당시 S&P 500의 연평균 수익률이 8.84%라는 것을 생각하면 대단한 수익률이다. 소프는 통계적 차익 거래에 기반을 둔 알고리즘 시스템을 주로 활용한 것으로 알려졌다. 통계적 차익거래란 넓은 의미에서 자산가격의 기대값과 현재 가격 사이의 차익거래를 의미한다.

제임스 해리스 사이먼스

소프와 마찬가지로 제임스 해리스 사이먼스도 하버드 대학 교수였다. 르네상스 테크놀러지(Renaissance Technologies)라는 헤지펀드 회사를 설립했으며 해지 펀드(Hedge Fund) 역사상 가장 성공한 CEO라는 평가를 받을 정도이다. 2014년 기준 약 12조의 8500억원의 재산을 가지고 있었다. 적용 모델 등을 외부에 공개하지 않기로 유명했지만 추세 추종에 기반을 둔 모델을 적극적으로 사용한 것으로 알려졌다.

케네스 그리핀

케네스 C 그리핀은 하버드 대학교 경제학과 출신으로 자산은 70억달라로 추정된다. 역시 ‘Citadel’이라는 헤지펀드 회사를 설립했다. Citadel의 특성은 IT 기술을 적극적으로 활용한다는 점이 다르다. 그래서 트레이더보다는 IT 인력이 더 많았다고 한다.  모델의 개발, 검증, 실제 거래에 이르기까지의 많은 과정을 자동화하고 HFT(High-frequency trading) 영역을 개척했다는 평가를 받고 있다.

참조

중국 주식 투자 기회

가끔은 국내 주식뿐 아니라 해외 주식도 해봐야겠다는 생각들이 종종 든다. 한때 잘나가던 애플이나 최근 잘나가는 테슬라 등의 소식을 접할 때는 주식을 샀었으면 수익을 내지 않을까 하는 생각들이 계속 들곤 했다.

그러던 중 우연히 중국 주식 관련 책을 접하게 되었다. “지금 중국 주식 천만원이면 10년 후 강남 아파트를 산다”라는 책이다. 호기심반 의심반으로 책을 읽기 시작했다.

2014년 11월 중국 증시로 통하는 문 후강퉁을 기억하는지. 중국 본토 주식을 홍콩 시장을 거쳐 사들일 수 있게 된 것이다. 2016년 말 또는 내년 초 후강퉁에 이어 선강퉁이 시행될 예정이다. 후강퉁이 유가증권 시장 개방이라면 선강퉁은 코스닥 시장 개방이다. 외국인 투자 자본이 몰려 주가에 영향을 줄 수 있다

중국은 또한 아직 여러 가지 면에서 저평가되어 있다. 워렌버핏이 국가의 증시가 과열되어 있는지, 침체되어 있는지를 점검하는 지표로 ‘시가총액/GDP’을 사용한다고 한다. 지표만으로 보면 2016년 9월 기준으로 미국은 120%, 중국은 50%미만의 수치를 나타낸다고 한다.

그리고 중국 정부의 부채는 충분히 낮은 수준(GDP 기준 42.7%)이기에 재정지출을 일으켜 경제발전을 위한 투자를 지속할 가능성이 높다. 정부정책 수혜주로는 교통인프라 구축, 전기차 보급 등 여러 가지가 있다.

  • 외환 보유국 세계 1위, GDP 세계 2위인 나라
  • 백만장자 가구 수가 200만이 넘는 나라
  • 미국 정부의 채권을 가장 많이 보유한 나라
  • 매년 근로자 최저 시급을 15% 이상 올리는 나라
  • 핀테크, 전자상거래 분야에서 미국을 추월한 나라
  • 세계 최고의 제조 대국에서 서비스 대국으로 탈바꿈한 나라
  • 투자대국에서 소비대국으로 탈바꿈한 나라

위 나라가 중국이다. 또 한번의 증권 시장 개방을 앞두고 있다. 큰 기회를 놓치지 말아야 한다. 아파트까지는 아니더라도 상당한 수익을 낼 수 있을 기회로 작용할 것이다. 실행하는 자만이 얻을 수 있는 수익이다.

참조

  • 지금 중국 주식 천만이면 10년 후 강남 아파트를 산다. 2(실전편) 정순필 지음. ISBN 979-11-85021-68-3 03320

FIX 프로토콜 이해

시스템 트레이딩에서 자동으로 트레이딩을 하기 위해서는 각 증권회사에서 제공하는 API등을 이용해야 하는데 제 각각 달라 시스템 트레이딩을 확장하는데 있어 어려운 요소로 작용한다. 다행히도 FIX(Financial Information Exchange) 표준 프로토콜이 존재한다. FIX는 주식, 선물, 옵션, 채권 등 다양한 금융 상품들을 거래하기 위한 표준 프로토콜이다. 금융 상품 거래의 참여자들로부터 주문을 내는 고객, 중계를 해주는 증권사, 체결을 시키는 거래소가 있는데 이러한 참여자들간의 통신을 표준화해 주는 역할을 한다.

FIX 프로토콜 메시지는 <tag>=<value>들의 여러쌍 그리고 그것들간을 구별짓기 위한 구분자(delimiter)로 구성된다. 재미있는 사실은 태그(tag)가 모두 숫자로 구성된다는 점이다. (태그 확인) 태그값(value)은 문자열, 정수, 실수 또는 다중값 등을 포함 가능하다. 그리고 구분자는 아스키 0x01를 사용한다. 그리고 메시지에는 header, body, trailer 로 구성된다. header는 메시지 헤더 내용(아래 예제 메시지 중 빨간색 부분), body(아래 파란색)는 실제 메시지 내용 그리고 trailer(아래 검은색) 는 checksum 등 내용을 포함하고 있다. (아래 메시지에서 구분자는 |로 표기)

8=FIX.4.2 | 9=178 | 35=8 | 49=PHLX | 56=PERS | 52=20071123-05:30:00.000 | 11=ATOMNOCCC9990900 | 20=3 | 150=E | 39=E | 55=MSFT | 167=CS | 54=1 | 38=15 | 40=2 | 44=15 | 58=PHLX EQUITY TESTING | 59=0 | 47=C | 32=0 | 31=0 | 151=15 | 14=0 | 6=0 | 10=128 |

다만 해외에 비해 FIX 국내 적용 사례나 뉴스 등은 쉽게 찾아보기 어려운 점은 아쉽다. 각 증권사마다의 특징 등이 달라서인지 그런지 모르겠지만 역시 파급까지는 상당한 시간이 필요해 보이지만 어쩌면 시스템 트레이딩의 인기로 FIX가 부상될지 모른다는 근거없는 기대를 해본다

참조