Skip to content

블로그

윈도우에서 리눅스(우분투) 사용하자! WSL(Windows Subsystem for Linux) 소개

개발을 주로 리눅스에서 하는 개발자들이 많을 것입니다. 여러모로 리눅스는 개발 편의성과 생산성을 높여 줍니다. 그러나 개발 외적으로는 리눅스가 불편한 점이 많아 윈도우를 포기할 수도 없습니다. 윈도우를 포기할 수 없는 이유 3가지를 들어 보겠습니다.

  1. 한국의 많은 사이트들(특히 공공기관 사이트들)이 윈도우에서만 사용가능하거나 윈도우에서 편리하다. (Ex. 연말정산)
  2. 윈도우에 최적화된 MS Office를 꼭 써야 한다.
  3. 게임…

다행히도 윈도우에서 리눅스를 사용할 수 있는 다양한 방법이 있습니다.

  1. Virtual Machine: VMWare, Virtual Box 등
  2. Docker Container
  3. WSL (Windows Subsystem for Linux)

여기서 Virtual Machine을 이용한 방법은 많은 분들이 이미 알고 계실거라 생각합니다. 그러나 Virtual Machine에게 컴퓨터의 리소스를 나눠줌으로써 (정말 고사양 컴퓨터가 아니라면) 성능 문제가 생기기 쉽습니다.

Docker Container는 개발 환경을 독립적으로 유지하기에 좋지만 번거로운 감이 있습니다.

그래서 이 포스트에서는 WSL을 이용하여 윈도우에서 우분투를 쉽게 사용하는 방법을 소개하고자 합니다.

먼저 WSL을 활성화 시켜야 합니다. 윈도우 설정 > 앱 > 프로그램 및 기능 > Windows 기능 켜기/끄기로 갑니다. 아니면 윈도우 키 > "Windows 기능 켜기/끄기" 검색해도 됩니다.

Windows 기능 켜기/끄기

이렇게 WSL을 설치하고 나면 Microsoft Store에서 Ubuntu를 설치할 수 있습니다.

Microsoft Store

Ubuntu는 가장 최신의 LTS 버전이므로 가장 왼쪽에 있는 Ubuntu를 설치하면 됩니다. 버전이 명시되어 있는 Ubuntu를 설치해도 됩니다.

Ubuntu를 설치하고 나면 다음과 같이 bash 터미널을 띄울 수 있습니다.

ubuntu bash

이제 윈도우에서도 우분투를 맘껏 사용하시면 됩니다. 글을 쓰는 시점에서 아직 하나 아쉬운 점은 WSL에서 tensorflow-gpu를 사용할 수 없다는 것입니다. 이 부분에 대해서는 MS에서 GPU 관련 개선을 진행중이라 하니 기다려보면 되겠습니다.

WSL 우분투의 파일시스템은 C:\Users\<사용자이름>\AppData\Local\Packages 아래에 CanonicalGroupLimited.Ubuntu로 시작하는 폴더를 찾아보면 됩니다. 이 폴더에서 LocalState\rootfs를 보면 우분투 bash에서 보던 파일 구조를 확인할 수 있습니다.

장고(Django) 환경의 Jupyter Notebook 실행하기

Django로 웹개발을 하다보면 Django의 ORM(Object-relational Mapping)을 자주 사용하게 됩니다. Django의 ORM 관련 문서는 여기를 참고해 주세요.

from django.db import models 모듈의 Model 클래스로 DB를 쉽게 구축할 수 있습니다. 그럼에도 DB 구축 과정에서 테스트성 작업도 필요하게 됩니다. 예를들어, 테스트 데이터를 생성해 보거나, 모델을 이용하여 질의(Query)를 만들어 보거나, 데이터를 수정해 보거나, 테스트로 입력한 데이터들을 삭제하거나 등입니다. 즉, 데이터 CRUD(Create, Retrieve, Update, Delete)를 테스트 해볼일이 많습니다.

Django 설정이 로딩된 상태에서만 모델들을 사용할 수 있습니다. 이들을 테스트하기 위해서 Django View에서 테스트 코드를 작성하고 GET 호출을 하는 번거롭고 비효율적인 방법으로 테스트할 수도 있습니다만, 보다 효과적인 방법을 소개합니다.

Terminal window
python manage.py shell

이렇게 Django 프로젝트의 설정이 로딩된 쉘을 실행하고, 이 위에서 모델들을 다룰 수 있습니다.

먼저 django-extensions를 설치합니다.

Terminal window
pip install django-extensions

그리고 settings.py에서 INSTALLED_APPS 리스트에 django_extensions를 추가합니다.

INSTALLED_APPS = [
...
'django_extensions',
]

이제 다음과 같이 shell_plus를 실행하면 관련있는 Django 모듈들을 자동으로 임포트해 줍니다.

Terminal window
python manage.py shell_plus

3. django-extensions의 shell_plus + Jupyter Notebook

Section titled “3. django-extensions의 shell_plus + Jupyter Notebook”

Django 환경을 Jupyter Notebook(Lab)으로 사용할 수 있습니다.

Terminal window
python manage.py shell_plus --notebook

금융 데이터 분석의 필요성

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

아래 그래프는 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

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

기술적 분석 라이브러리 TA-LIB Python Wrapper

기술적 분석(Technical Analysis)는 과거 축적된 주가와 거래량 등을 분석하여 미래 주가의 방향성을 예측하는 분석 방법입니다. 대표적인 보조지표(Indicator)로 이동평균(Moving Average), 볼린저밴드(Bollinger Band), Moving Average Convergence Divergence(MACD), Relative Strength Index(RSI) 등이 있습니다.

보조지표들 외에도 차트에서 패턴을 알아내기도 합니다. 대표적인 패턴으로 Three Line Strike, Two Black Gapping, Three Black Crows, Evening Star, Abandoned Baby 등이 있습니다.

이번 포스트에서는 기술적 분석 라이브러리인 TA-LIB의 Python Wrapper에 대해서 소개하고자 합니다. TA-LIB를 이용하면 이동평균, 볼린저밴드, MACD, RSI 등의 대표적인 기술적 분석 보조지표를 쉽게 계산할 수 있고 다양한 차트 패턴을 포착할 수 있습니다. 자세한 기능은 이 문서에서 확인할 수 있습니다.

우분투 환경에서 TA-LIB 설치를 진행합니다.

Terminal window
wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz
tar -xzf ta-lib-0.4.0-src.tar.gz
cd ta-lib/
./configure --prefix=/usr
make
sudo make install

다음과 같이 make가 없다는 메시지가 뜬다면 make를 먼서 설치하고 다시 make 명령을 실행하면 됩니다.

Command 'make' not found, but can be installed with:
sudo apt install make
sudo apt install make-guile

이제 TA-LIB 파이썬 라이브러리를 설치하면 됩니다. TA-LIB이 설치되어 있어야 TA-LIB 파이썬 라이브러리를 설치할 수 있습니다.

Terminal window
pip install ta-lib

TA-LIB 파이썬 라이브러리를 이용하여 볼린저밴드를 추가해 보겠습니다. 먼저 다음과 같은 OHLCV(Open-High-Low-Close-Volume) 데이터, 즉 봉차트가 있습니다.

import pandas as pd
df = pd.read_csv('chart.csv')
closecodedatediffdiffratiodiffsignhighlowopenpricevolume
46200.0593020180823100.0NaN246200.045700.046150.03093430000006730918
46150.0593020180824-50.0NaN546400.045550.045900.03022130000006582535
46300.0593020180827150.00.325027246550.046000.046100.02436960000005263782
46550.0593020180828250.00.539957246950.046300.046800.03433230000007365976
46800.0593020180829250.00.537057246800.046400.046750.02599640000005572374
47650.0593020180830850.01.816239247950.046700.046950.058025900000012193231
48450.0593020180831800.01.678909248450.047000.047100.065231800000013577454
43500.0593020190806-450.0-1.023891543800.042500.042500.065480500000015083824
43200.0593020190807-300.0-0.689655543900.043100.043600.043450000000010002533
42650.0593020190808-550.0-1.273148543500.042650.043250.072807400000016926881
43150.0593020190809500.01.172333243350.043050.043250.04187190000009685147
43700.0593020190812550.01.274623244000.043550.044000.03705310000008466169
43000.0593020190813-700.0-1.601831543500.042950.043500.03141910000007276979
43700.0593020190814700.01.601831244250.043500.043900.03834270000008750135

TA-LIB 파이썬 라이브러리 모듈 이름은 talib 입니다. talib을 임포트하고 볼린저밴드를 구하는 함수를 호출합니다. 이 문서에서 함수들의 Signature를 확인할 수 있습니다.

upperband, middleband, lowerband = BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0)

이렇게 Upper Bollinger Band, Middle Bollinger Band, Lower Bollinger Band를 쉽게 구할 수 있습니다.

import talib
ubb, mbb, lbb = talib.BBANDS(df.close, 20, 2)
df['ubb'] = ubb
df['mbb'] = mbb
df['lbb'] = lbb
closecodedatediffdiffratiodiffsignhighlowopenpricevolumeubbmbblbb
46200.0593020180823100.0NaN246200.045700.046150.03093430000006730918NaNNaNNaN
46150.0593020180824-50.0NaN546400.045550.045900.03022130000006582535NaNNaNNaN
46300.0593020180827150.00.325027246550.046000.046100.02436960000005263782NaNNaNNaN
46550.0593020180828250.00.539957246950.046300.046800.03433230000007365976NaNNaNNaN
46800.0593020180829250.00.537057246800.046400.046750.02599640000005572374NaNNaNNaN
47650.0593020180830850.01.816239247950.046700.046950.058025900000012193231NaNNaNNaN
48450.0593020180831800.01.678909248450.047000.047100.065231800000013577454NaNNaNNaN
43500.0593020190806-450.0-1.023891543800.042500.042500.06548050000001508382448098.40053746057.544016.599463
43200.0593020190807-300.0-0.689655543900.043100.043600.04345000000001000253348325.70744245940.043554.292558
42650.0593020190808-550.0-1.273148543500.042650.043250.07280740000001692688148540.42638545762.542984.573615
43150.0593020190809500.01.172333243350.043050.043250.0418719000000968514748592.45711345605.042617.542887
43700.0593020190812550.01.274623244000.043550.044000.0370531000000846616948538.70090545467.542396.299095
43000.0593020190813-700.0-1.601831543500.042950.043500.0314191000000727697948456.11615645275.042093.883844
43700.0593020190814700.01.601831244250.043500.043900.0383427000000875013548388.64143945157.541926.358561