해외 투자 & 해외 경기 선행 지수

필자도 국내 투자를 하긴 하는데 잘 나가는 해외 기업들을 보면 해외 투자에 대한 관심이 생기긴 합니다. 해외 투자에 관심을 가져야 하는 이유는 국내 주식 시장이 단지 세계 주식 시장의 2% 규모라는 놀라운 사실입니다. 우물 안 개구리라는 속담이 문득 생각납니다.

(아래 내용은 ‘나는 집에서 구글 주식을 사고 두바이 원유를 판다‘라는 책에서 아래 내용을 발췌했음을 알려드립니다.)

물론 해외투자가 장점만이 있는 것은 아닙니다 국내 주식 투자와 달리 양도소득세를 추가로 낸다고 합니다. (해외 ETF에 직접투자하면 1년에 한 번만 투자 이익과 투자 손실을 합해 순이익 부분에 대해서만 양도소득세 22%만 내면 됨) (관련 참고 블로그)

해외 투자에 있어서도 시장 현황을 참고해야 성공 확률이 올라갑니다. 참조할만한 해외 경기 선행 지표 몇 가지를 소개해 드립니다.

해외 투자 경기선행 지수

미국 경기선행 지수(Leading Index for the United States): 미국의 컨퍼런스 보드(Conference Board)에서 발표하는데 90%에 육박하는 확률로 경기 침체를 예상할 수 있는 매우 신뢰성 높은 경제 지표라고 합니다.(발췌 내용)
//fred.stlouisfed.org/graph/graph-landing.php?g=eTza&width=500&height=275
OECD 경기선행 지수: OECD 회원국들에 국한된 경기 선행지수이긴 하나 중국도 포함되어 있어 선진국과 신흥국의 경기 전망을 분류해서 예상할 수 있습니다.
https://data.oecd.org/chart/4Vb3

미국기업세후 순이익지표(After-tax profit): 주식 시장과 관련해서 주목해야 할 지표가 하나 더 있는데 바로 미국 기업의 세후 이익 지표입니다. 금융 위기 이후 주가 선행성 강화되었다고 합니다.

해외 ETF

해외 투자시 직접 구글과 애플과 같은 종목을 직접 구매할 수도 있지만 보통은 해외 ETF 형태로 투자를 많이 합니다. ETF는 IT, 바이오 등 산업군별 종목도 있으며 또한 금, 원유와 같은 원자재에 해당하는 ETF도 있으니 여러 가지 형태로 투자가 가능합니다. 최근 중국에서의 커피 소비량 증가에 따른 커피 ETF 등도 있다고 하니 좁은 시장에서 벗어나 넓은 해외 시장에서의 투자를 한번 검토해보시길 바랍니다. 실제로 해외 시장에 투자하는 ETF 투자자가 늘어나고 있다고 합니다. 키움증권에 따르면 전체 해외 주식 거래 대금 가운데 해외 ETF가 차지하는 비중이 2014년 23%, 2015년 44%, 지난해엔 50%를 처음으로 넘었다고 합니다.

국내 상장 ETF나 해외 상장 ETF 투자 방법은 주식과 거의 같습니다. 증권사 홈트레이딩시스템(HTS)이나 영업점 전화를 통해 ETF를 사고팔 수 있습니다. 다만 해외 상장 ETF의 매매 주문은 ETF가 상장돼 있는 해외 거래소의 거래시간에만 가능합니다. 그리고 투자하기 위해서는 현지 통화를 미리 환전해 둬야 합니다. 원화 강세 때는 해외 주식투자가 유리하지만 원화 약세 국면에서는 환차손을 볼 수 있습니다.

예로 로봇 및 4차산업 관련 ROBO라고 하는 해외 ETF는 꾸준한 증가세를 띄고 있습니다. 놀랍습니다. 미리 알았더라면 50% 이상의 수익을 얻었을텐데, 아쉽습니다. 지금부터라도 눈 크게 뜨고 해외 투자도 지켜보려 합니다.

참고

순환 신경망 (LSTM) 활용 주가 예측

시계열 데이터 예측에 좋은 성능을 낸다는 순환 신경망을 통해 제가 현재 보유하고 있는 내츄럴엔도텍 주식에 대한 예측을 해보고자 합니다. 내츄럴엔도텍은 한 때 백수오로 알려진 업체이며 최근 홈쇼핑 판매 개시로 많은 관심을 받고 있습니다.

 LSTM이란…

순환 신경망은 보통 RNN(Recurrent Neural Network)라고 하는데 그레디언트 소실(Gradient Vanishing Problem)을 해결하고자 메모리를 도입한 LSTM(Long-Short Term Memory)을 주로 이용합니다.

LSTM은 시계열 데이터 처리에 있어서는 ARIMA 등 기존 알고리즘보다 좋은 성능을 내는 것으로 알려져 있습니다. LSTM에 대한 자세한 내용은 여기를 참조하시기 바랍니다. 순환 신경망의 놀라운 효과 라는 안드레 카파시 블로그 글 (영문)도 참고하시기 바랍니다. 순환 신경망으로 세익스피어 글도 짓고 자바 프로그래밍도 합니다.

LSTM 소개에 대한 이미지 검색결과

기존 MLP 신경망은 은닉층의 노드값을 계산할 때 입력에 가중치를 곱해서 은닉층의 노드값(상태)값을 업데이트 합니다. 그러나 순환 신경망은 그와 달리 은닉층의 노드값을 계산할 때 이전 히든(hidden) 노드에 대한 상태값과 입력을 모두 활용합니다. (아래 수식 참조)

Alt text

 

 

이런 방법으로 은닉층 상태를 업데이트 하기에 시계열 데이터에서의 패턴 변화를 감지할 수 있게 됩니다. 또한 LSTM은 순환신경망에 메모리까지를 가지고 있어 과거 시계열 데이터의 패턴 변화를 더 잘 잡아내는 특징을 가지고 있습니다.

좀 더 자세히 설명을 드리면 LSTM은 메모리가 있으며 메모리 입출력 컨트롤을 위한 소자(논리적인 장치)가 있는데 게이트(gate)라고 합니다. 게이트에는 입력(input), 출력(output) 게이트 그리고 망각(forget) 게이트가 있습니다.

LSTM 게이트에 대한 이미지 검색결과

LSTM을 학습하는 방법은 조금 복잡합니다. 기본적으로는 BPTT (Backpropagation Through Time) 을 사용합니다. 알고리즘은 BP와 유사하지만 순환 신경망에서는 시계열 데이터를 다루다보니 그리고 은닉층이 이전 은닉층 상태값까지 고려하다보니 그로 인해 조금은 복잡합니다. 순환 신경망 그래프 안에 네트워크가 연결된 구조를 펼쳐(unfold) 오차에 준한만큼 역으로 따라가며 전파하여 가중치를 학습합니다. 자세한 내용은 밑바닥부터 시작하는 딥너링이라는 책을 한번 읽어보시면 좋을 듯 합니다. 또는 Graphically Determining Backpropagation Equations 블로그 자료를 참고하시길 바랍니다.

 학습 데이터

LSTM 학습에 사용한 데이터로는 아래와 같은 형태로 저장된 csv 포맷을 읽어서 처리했습니다(다운로드:  A168330) 미리 아래와 같은 포맷으로 데이터를 저장해두고 나서 학습한 것입니다. 그리고 간단히 종가(Close) 데이터만을 이용해서 학습했습니다.

Date Open High Low Close Volume
20170816 27250 32450 27100 31500 3341469
20170814 25700 26800 24400 26750 1384477
20170811 25300 25750 24050 24950 2019038

 케라스 활용 LSTM 구현

LSTM을 파이썬으로 돌리는 방법은 여러 가지가 있지만 많이 사용되는 케라스(Keras) 라이브러리를 이용했습니다. 케라스는 텐서플로우를 기반으로 쉽게 사용할 수 있도록 하기 위한 일종의 래핑(wrapping) 라이브러리 입니다.

import os
import pandas as pd
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt
import math
from sklearn.metrics import mean_squared_error

look_back = 1
def create_dataset(dataset, look_back=1):
    dataX, dataY = [], []
    for i in range(len(dataset)-look_back-1):
        a = dataset[i:(i + look_back)]
        dataX.append(a)
        dataY.append(dataset[i + look_back])
    return np.array(dataX), np.array(dataY)

# file loader
sydtpath = "D:sydt"
naturalEndoTekCode = "A168330"
fullpath = sydtpath + os.path.sep + naturalEndoTekCode + '.csv'
pandf = pd.read_csv(fullpath, index_col="Date")

# convert nparray
nparr = pandf['Close'].values[::-1]
nparr.astype('float32')
print(nparr)

# normalization
scaler = MinMaxScaler(feature_range=(0, 1))
nptf = scaler.fit_transform(nparr)

# split train, test
train_size = int(len(nptf) * 0.9)
test_size = len(nptf) - train_size
train, test = nptf[0:train_size], nptf[train_size:len(nptf)]
print(len(train), len(test))

# create dataset for learning
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)

# reshape input to be [samples, time steps, features]
trainX = np.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
testX = np.reshape(testX, (testX.shape[0], 1, testX.shape[1]))

# simple lstm network learning
model = Sequential()
model.add(LSTM(4, input_shape=(1, look_back)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=2)

# make prediction
testPredict = model.predict(testX)
testPredict = scaler.inverse_transform(testPredict)
testY = scaler.inverse_transform(testY)
testScore = math.sqrt(mean_squared_error(testY, testPredict))
print('Train Score: %.2f RMSE' % testScore)

# predict last value (or tomorrow?)
lastX = nptf[-1]
lastX = np.reshape(lastX, (1, 1, 1))
lastY = model.predict(lastX)
lastY = scaler.inverse_transform(lastY)
print('Predict the Close value of final day: %d' % lastY)  # 데이터 입력 마지막 다음날 종가 예측

# plot
plt.plot(testPredict)
plt.plot(testY)
plt.show()

결과 화면

아래 차트 오른쪽 부분이 내츄럴엔도텍이 최근(2017년 8월) 홈쇼핑 판매 개시로 주가가 오르고 있는 부분입니다. 실제 주가(파란색)와 예측 주가(노란색)로 출력되어 있습니다. 예측은 현재일 (1일)을 이용해서 다음날 (1일)을 예측합니다. 마지막 날 예측이 어긋나는게 아쉽습니다

stocksLSTM2

위 소스에 대해 문의가 있거나 틀린 점, 보완할 점이 있으면 아래 댓글 남겨주시면 감사하겠습니다. 그리고 위 소스 내용은 아래 사이트(Machine Learning Mastery) 자료를 참고해서 개발한 것입니다.
Machine Learning Mastery

참고

가치 투자 및 관련 종목 검색 (대신증권 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일간의 수업) 터틀 트레이딩, 마이클 코벨 지음, 정명수 옮김, 위즈덤 하우스 출판