콘텐츠로 이동
25 posts in the category “Finance”

코로나19 사태에서의 코스피와 해외주식시장, 금, 원유, 환율 상관관계

코로나19 사태에서 코스피 지수와 주요 해외 주식 시장 및 금, 원유, 원달러 환율의 상관관계를 살펴보겠습니다. 코로나19 사태로 주요국 증시가 엄청난 하락폭을 보이고 있습니다.

다음은 코스피와 주요 해외 주식 시장의 종가를 같이 그린 모습입니다.

kospi_dji kospi_nas kospi_spi kospi_nii kospi_shs kospi_hsi kospi_lns kospi_pas kospi_xtr

가장 먼저 상황이 심각했던 중국의 상해종합 지수는 1월말에 급락하는 모습을 보입니다. 항셍 지수도 다른 해외 지수들보다도 더 많이 하락하는 모습입니다.

그 외의 대부분의 지수들은 코스피와 그 모습이 크게 다르지 않습니다. 미국의 경우 3월 중반에 급등과 급락을 반복하지만 결국 추세는 하락하는 모양세입니다.

다음은 코스피와 금, 원유, 달러, 일본 엔 환율을 같이 그린 모습입니다.

kospi_gold kospi_wti kospi_usdkrw kospi_jpykrw

안전자산이라 여겨지는 금이 크게 빠졌습니다. 위기일 때 보통 금 지수는 올라가기 마련인데 이번 코로나19 사태에서는 통하지 않았습니다. 금보다는 달러를 더 선호하여 달러가 급등하는 모습입니다.

상관관계 순으로 보면 다음과 같습니다.

TargetCorrelation
NII@NI2250.9709107854451309
DJI@DJI0.9698340438431805
XTR@DAX300.969026490653162
PAS@CAC400.9688738794309948
LNS@FTSE1000.9642702121797924
SPI@SPX0.9605159313835816
HSI@HSI0.9403151549240741
NAS@IXIC0.9396642438028351
WTI0.9072223139452107
SHS@0000010.5638300683413756
Gold0.15738037237527366
USDKWR-0.8553774707185525
JPYKRW-0.9009982462185702

일본 니케이와 미국 다우 지수와 매우 높은 상관관계를 보입니다. 물론 일본과는 시차가 없어서 특별히 높은 상관관계를 가질 수 있습니다. 그에 비하면 미국 시장과 상관관계가 매우 높다고 볼 수 있습니다. 그리고 전체적으로 주가가 급락하면서 달러와 엔의 가치가 높아진 것을 확인할 수 있습니다.

금은 이미 가격이 너무 많이 올라가 있었던 터라 조정을 받은게 아닐까 싶습니다.

포트폴리오 평가 척도(Portfolio Performance Measures)

이 포스트에서는 주식 투자 등의 금융 투자에서 포트폴리오를 평가하는 주요 척도(Portfolio Performance Measures)를 요약 정리합니다.

포트폴리오의 실현 손익을 의미합니다. 가장 직관적이면서 기본적인 포트폴리오 평가 지표이지만 손익률만으로 포트폴리오를 평가하는 것은 위험할 수 있습니다. 이어서 알고 있으면 좋은 몇 가지 대표적인 포트폴리오 리스크 평가 지표들을 소개합니다.

알파는 시장 대비 주식 포트폴리오 손익률을 의미합니다. 만약 시장(코스피, 코스닥 등) 손익률이 10%이고 포트폴리오 손익률이 15%라면 알파는 5%가 됩니다. 반면 포트폴리오 손익률이 5%라면 알파는 -5%가 됩니다.

베타는 주식 종목 손익률과 시장 손익률의 공분산의 시장 손익률 분산 대비 비율입니다. 베타는 주식 종목과 시장의 방향성이 얼마나 비슷한지를 알려줍니다, 수식은 다음과 같습니다.

특정 기간에서 는 종목 손익률 시계열이고 은 시장 손익률 시계열 입니다. 여기서 분모는 시장 손익률의 분산, 분자는 시장 손익률과 종목 손익률의 공분산입니다.

샤프 비율은 무위험(risk-free) 자산의 손익률 대비 기대 초과 손익률을 의미합니다. 수식은 다음과 같습니다.

포트폴리오 손익률 에 무위험 자산 손익률 를 빼고 위험으로 해석할 수 있는 포트폴리오 손익률의 표준편차 를 나눈 값입니다.

소르티노 비율은 샤프 비율과 비슷한 척도입니다. 소르티노 비율에서는 포트폴리오 손익률 시계열의 표준편차인 대신에 시계열에서 하락(downside) 부분에서의 표준편차 를 분모로 사용합니다. 이는 변동성 중에서 급등과 같은 상승 변동성은 좋은 것으로 여기고 하락 변동성만을 부정 요소로 반영하는 것입니다. 수식은 다음과 같습니다.

아무리 수익률이 높더라도 MDD가 크면 좋은 포트폴리오라고 할 수 없을 것입니다. 실전 투자에서 낙폭이 크면 손절을 하기 쉽상이므로 안정적인 포트폴리오가 필요합니다.

금융 데이터 분석의 필요성

주식 시장에서 투자자는 개인, 기관, 외국인 등이 있습니다. 이 포스트를 보고 계신 대부분은 개미라 부르는 개인들일 것입니다. 그렇다면 개인, 기관, 외국인의 투자 수익률은 어떨까요?

아래 그래프는 2014년~2018년 동안의 개인, 기관, 외인의 주식 투자 수익률 입니다.

개인 vs. 기관 vs. 외인

5년 동안 개인, 기관, 외인 수익률을 비교해 보면 개인들이 주식 시장에서 얼마나 고통받고 있는지 알 수 있습니다.

여러 이유들이 있겠지만 정보의 비대칭성을 하나로 들 수 있습니다. 개인들은 국내외 금융권 종사자들에 비해 고급 정보를 접하기 어려울 수밖에 없는 것이 현실입니다. 이러한 불리함을 가지고 있기에 개인들이 주식시장에서 이기기 어려운 것입니다.

그래도 다행인 것은 최근에는 많은 정보들이 인터넷 상에 공개되어 있습니다. 대부분의 금융 데이터들은 인터넷 상에서 구할 수 있습니다. 이러한 데이터들을 모두 모아보면 투자 판단에 도움이 될 방대한 양의 데이터가 생길 것입니다.

그러나 이러한 방대한 양의 데이터를 사람이 일일이 쳐다보며 분석해 내기란 거의 불가능 합니다. 그러므로 파이썬과 같은 프로그래밍 언어를 통해 데이터를 처리 및 분석해야 합니다.

분석한 데이터를 보고 사람이 다시 투자판단을 내리기도 사실 어려운 일입니다. 그래서 기계학습을 통해 투자 판단 모델을 구축해서 보다 다양한 상황을 고려하고 객관적인 판단을 내리는 것이 좋다고 생각합니다.

개인이 이러한 분석 시스템을 개발하는 것은 매우 어려운 일일 것입니다. 퀀티랩은 위의 주식 분석 방법들을 수행하며 지속적으로 고도화해 나가고 있습니다.

퀀티랩은 주식 종목, 주식 시장, 산업, 경제 등의 전반에 대한 고도의 주식 분석 결과를 퀀티랩 서비스와 블로그 및 각종 채널에서 공유할 것입니다. 퀀티랩이 공유하는 주식 분석 결과가 개인들의 투자에 도움이 되기를 희망합니다.

국내 주식시장과 해외 주식시장의 상관관계

주식시장은 국내 사정 뿐만 아니라 해외 주요 국가들의 상황에 영향을 받습니다. 많은 투자자들이 특히 미국 주식시장 상황을 관심있게 지켜보는 이유가 미국 주식시장 상황에 우리나라 주식시장이 큰 영향을 받는다고 생각해서일 것입니다. 이번 포스트에서는 우리나라 주식시장과 주요국 주식시장들 간의 상관관계를 살펴보겠습니다.

주요 주식시장으로 한국의 KOSPI, 미국의 Dow Jones (DJI), Nasdaq (NAS), S&P 500 (SPI), 일본의 니케이 225 (NII), 중국의 상해종합 (SHS), 홍콩의 항셍 (HSI), 영국의 FTSE 100 (LNS), 프랑스의 CAC 40 (PAS), 독일의 DAX30 (XTR)를 들 수 있습니다. 괄호 안의 코드명은 네이버 금융을 참고했습니다. 각 해외 주식시장 지수들과 한국의 KOSPI 사이의 상관관계는 다음과 같습니다.

kospi_dji kospi_nas kospi_spi kospi_nii kospi_shs kospi_hsi kospi_lns kospi_pas kospi_xtr

상관관계가 높은 순으로 정렬해 보면 다음과 같습니다.

IndexCorrelation
HSI@HSI0.6646677893714394
NII@NI2250.39574631268446814
SHS@0000010.26712766899597473
LNS@FTSE1000.12171746103767508
DJI@DJI0.09225215796116076
PAS@CAC400.047920317117435045
XTR@DAX300.03127491770767439
NAS@IXIC0.019002467506360643
SPI@SPX-0.011244728898221503

이렇게 일일이 상관관계를 살펴보기 전에는 코스피가 미국 증시와 가장 비슷한 흐름을 보일 것으로 생각했으나, 실제로는 홍콩 증시와 더 비슷한 것을 알 수 있습니다. 그리고 확실히 코스피는 홍콩, 일본, 중국 등의 증시와 관계가 깊다고 볼 수 있습니다.

IMF에서 GDP 관련 지표를 파이썬으로 얻어오기

IMF에서 세계 지표들을 확인할 수 있습니다. 이번 포스트에서는 파이썬으로 IMF 사이트에서 GDP 관련 지표들을 파이썬으로 얻어오는 방법을 다루겠습니다.

국제통화기금(IMF, International Monetary Fund)는 선진국들이 출자하는 펀드이며 세계 경제 지표를 조사하여 공개하고 있습니다. IMF에 대한 자세한 사항은 나무위키 - IMF를 참고하세요.

국내총생산(GDP, Gross Domestic Product)에는 명목 GDP(Nominal GDP)와 실질 GDP(Real GDP)가 있습니다. 명목 GDP는 당해의 시장가격으로 가치를 계산하고 실질 GDP는 물가를 고려한 가격으로 가치를 계산합니다. 따라서 경제성장률은 실질 GDP의 성장률을 의미합니다. 한국의 GDP는 나라지표 사이트에서 확인할 수 있습니다.

한국 뿐만 아니라 세계 주요 국가들의 GDP 관련 지표들을 확인해 보겠습니다. IMF - World Econimic Outlook Databases에서 최신 발표 내용을 확인하면 됩니다.

먼저 By Countries (country-level data)를 선택합니다.

imf weo

그리고 데이터를 얻고자 하는 국가를 선택합니다. 여기서는 모든 국가를 선택하겠습니다.

imf weo

다음으로 얻고자 하는 데이터 종류를 선택합니다. 이 포스트에서 확인하고자 하는 데이터는 Gross domestic product, constant prices (Percent change)와 Output gap in percent of potential GDP (Percent of potential GDP)이긴 하지만 전체 다 선택하겠습니다.

imf weo

이제 다음 화면에서 Start Year를 1980으로 변경하고 나머지는 기본 설정으로 둔 상태에서 Prepare Report 버튼을 누릅니다.

imf weo

조금 기다리면 다음과 같은 화면이 나옵니다. 화면에 표시하기에 데이터가 너무 크다는 문구가 나오는데, 그 아래에 다운로드 링크가 있습니다. 이 링크를 클릭하면 WEO_Data.xls 파일을 다운받을 수 있습니다. 이 파일은 사실 TSV(Tab-separated Values) 입니다.

imf weo

이제 파이썬으로 이 파일을 다운받고 읽어 보겠습니다. 먼저 다음처럼 requests 라이브러리를 사용해서 IMF 데이터를 요청하고 파일을 저장합니다.

import requests
url = 'https://www.imf.org/external/pubs/ft/weo/2019/01/weodata/weoreptc.aspx?pr.x=49&pr.y=15&sy=1980&ey=2024&scsm=1&ssd=1&sort=country&ds=.&br=1&c=512%2C668%2C914%2C672%2C612%2C946%2C614%2C137%2C311%2C546%2C213%2C674%2C911%2C676%2C314%2C548%2C193%2C556%2C122%2C678%2C912%2C181%2C313%2C867%2C419%2C682%2C513%2C684%2C316%2C273%2C913%2C868%2C124%2C921%2C339%2C948%2C638%2C943%2C514%2C686%2C218%2C688%2C963%2C518%2C616%2C728%2C223%2C836%2C516%2C558%2C918%2C138%2C748%2C196%2C618%2C278%2C624%2C692%2C522%2C694%2C622%2C962%2C156%2C142%2C626%2C449%2C628%2C564%2C228%2C565%2C924%2C283%2C233%2C853%2C632%2C288%2C636%2C293%2C634%2C566%2C238%2C964%2C662%2C182%2C960%2C359%2C423%2C453%2C935%2C968%2C128%2C922%2C611%2C714%2C321%2C862%2C243%2C135%2C248%2C716%2C469%2C456%2C253%2C722%2C642%2C942%2C643%2C718%2C939%2C724%2C734%2C576%2C644%2C936%2C819%2C961%2C172%2C813%2C132%2C726%2C646%2C199%2C648%2C733%2C915%2C184%2C134%2C524%2C652%2C361%2C174%2C362%2C328%2C364%2C258%2C732%2C656%2C366%2C654%2C144%2C336%2C146%2C263%2C463%2C268%2C528%2C532%2C923%2C944%2C738%2C176%2C578%2C534%2C537%2C536%2C742%2C429%2C866%2C433%2C369%2C178%2C744%2C436%2C186%2C136%2C925%2C343%2C869%2C158%2C746%2C439%2C926%2C916%2C466%2C664%2C112%2C826%2C111%2C542%2C298%2C967%2C927%2C443%2C846%2C917%2C299%2C544%2C582%2C941%2C474%2C446%2C754%2C666%2C698&s=NGDP_R%2CNGDP_RPCH%2CNGDP%2CNGDPD%2CPPPGDP%2CNGDP_D%2CNGDPRPC%2CNGDPRPPPPC%2CNGDPPC%2CNGDPDPC%2CPPPPC%2CNGAP_NPGDP%2CPPPSH%2CPPPEX%2CNID_NGDP%2CNGSD_NGDP%2CPCPI%2CPCPIPCH%2CPCPIE%2CPCPIEPCH%2CFLIBOR6%2CTM_RPCH%2CTMG_RPCH%2CTX_RPCH%2CTXG_RPCH%2CLUR%2CLE%2CLP%2CGGR%2CGGR_NGDP%2CGGX%2CGGX_NGDP%2CGGXCNL%2CGGXCNL_NGDP%2CGGSB%2CGGSB_NPGDP%2CGGXONLB%2CGGXONLB_NGDP%2CGGXWDN%2CGGXWDN_NGDP%2CGGXWDG%2CGGXWDG_NGDP%2CNGDP_FY%2CBCA%2CBCA_NGDPD&grp=0&a='
res = requests.get(url)
if res.status_code == 200:
with open('data/2019-06-09-imf_gdp/WEO_Data_2019.xls', 'wb') as fout:
fout.write(res.content)

그리고 저장된 파일을 pandas 라이브러리를 사용하여 읽고 활용합니다. 확장자가 xls이기는 하지만 실제 내용은 TSV 형태이므로 read_csv() 함수를 사용할 수 있습니다.

그리고 저장된 파일을 pandas 라이브러리를 사용하여 읽고 활용합니다. 확장자가 xls이기는 하지만 실제 내용은 TSV 형태이므로 read_csv() 함수를 사용할 수 있습니다.

import pandas as pd
df = pd.read_csv('data/2019-06-09-imf_gdp/WEO_Data_2019.xls', sep='\t', encoding='ISO-8859-1')
df.head()
CountrySubject DescriptorUnitsScaleCountry/Series-specific Notes19801981198219831984…201620172018201920202021202220232024Estimates Start After
AfghanistanGross domestic product, constant pricesNational currencyBillionsSource: National Statistics Office Latest actu…NaNNaNNaNNaNNaN…493.073506.215517.858533.394552.063574.127599.933629.880664.4522017.0
AfghanistanGross domestic product, constant pricesPercent changeNaNSee notes for: Gross domestic product, consta…NaNNaNNaNNaNNaN…2.1642.6652.3003.0003.5003.9974.4954.9925.4892017.0
AfghanistanGross domestic product, current pricesNational currencyBillionsSource: National Statistics Office Latest actu…NaNNaNNaNNaNNaN…1,318.4781,377.5351,418.1281,488.8611,595.0531,733.5391,902.1092,096.9512,322.6502017.0
AfghanistanGross domestic product, current pricesU.S. dollarsBillionsSee notes for: Gross domestic product, curren…NaNNaNNaNNaNNaN…19.42820.23519.58519.99020.68221.92823.57725.45027.6082017.0
AfghanistanGross domestic product, current pricesPurchasing power parity; international dollarsBillionsSee notes for: Gross domestic product, curren…NaNNaNNaNNaNNaN…66.38469.44972.64876.15880.47085.42691.11397.643105.1582017.0

여기서 한국의 GDP 성장률과 GDP Gap 데이터만 뽑아서 차트로 가시화해보면 다음과 같습니다.

df_gdp = df[(df['Country'] == 'Korea') & (df['Subject Descriptor'] == 'Gross domestic product, constant prices') & (df['Units'] == 'Percent change')].iloc[:, 5:-1]
df_gdpgap = df[(df['Country'] == 'Korea') & (df['Subject Descriptor'] == 'Output gap in percent of potential GDP') & (df['Units'] == 'Percent of potential GDP')].iloc[:, 5:-1]
x_gdp = df_gdp.columns.astype(int)
y_gdp = df_gdp.values[0].astype(float)
x_gdpgap = df_gdpgap.columns.astype(int)
y_gdpgap = df_gdpgap.values[0].astype(float)
import matplotlib.pyplot as plt
import matplotlib
%matplotlib inline
plt.plot(x_gdp, y_gdp, label='GDP')
plt.plot(x_gdpgap, y_gdpgap, label='GDP Gap')
plt.hlines(0, xmin=x_gdp[0]-3, xmax=x_gdp[-1]+3)
plt.legend()

res