이번 포스팅에서는 S&P500 지수와 KOSPI200 지수의 상관관계를 알아보기에 앞서 각각의 데이터를 불러온 후 엑셀파일로 저장하는 과정을 설명드리겠습니다.

 

먼저 소스는 다음과 같습니다.

import FinanceDataReader as fdr
import pandas as pd

df500 = fdr.DataReader("US500", '2017-05-01')
df200 = fdr.DataReader("KS200", '2017-05-01')

df500 = df500['Close']
df200 = df200['Close']

concat = pd.concat([df500, df200], axis=1, keys=['S&P500','KOSPI200'])

final = concat.dropna()

print(final)
#final.to_excel('S&P500-KOSPI200.xlsx')

FinanceDataReader를 이용해서 S&P500 지수와 KOSPI200 지수를 불러옵니다. 

S&P500는 'US500', KOSPI200는 'KS200' 을 첫번째 파라미터로 넣어줍니다.

 

두번째 파라미터는 시작 날짜를 의미합니다. 

세번째 파라미터는 마지막 날짜인데 입력하지 않으면 오늘 날짜까지로 설정이 됩니다.

 

concat 를 이용하여 두 지수의 종가를 합칩니다.

print를 하면 다음과 같이 데이터가 콘솔창에 출력됩니다.

주석처리된 것을 풀고 실행하면 다음과 같이 엑셀 파일이 생성됩니다.

 

평균 회귀 전략 중 하나인 볼린저 밴드를 파이썬으로 구현해보자.

 

볼린저 밴드는 3개 선으로 구성되는데 추세를 판단할 수 있는 중심선, 상단선과 하단선의 표준편차 밴드로 구성된다. 

일반적인 볼린저 밴드 공식은 다음과 같다.

  • 상단 볼린저 밴드 = 중간 볼린저 밴드 + (표준편차 X 2)
  • 중간 볼린저 밴드 = 종가의 20 이동평균
  • 하단 볼린저 밴드 = 중간 볼린저 밴드 - (표준편차 X 2)
import FinanceDataReader as fdr
df = fdr.DataReader("057030", '2020') # YBM넷 2020년~현재
df = df[['Close']]
df['MA20'] = df['Close'].rolling(window=20).mean() # 중간 볼린저 밴드
df['stddev'] = df['Close'].rolling(window=20).std()
df['upper'] = df['MA20'] + (df['stddev'] * 2) # 상단 볼린저 밴드
df['lower'] = df['MA20'] - (df['stddev'] * 2) # 하단 볼린저 밴드
print(df.tail(10))

위와 같이 결과가 나온다.

MA20이 중간 볼린저 밴드, upper가 상단 볼린저 밴드, lower가 하단 볼린저 밴드이다.

 

참고로 볼린저 밴드를 수식으로 표현하면 다음과 같다.

중간 볼린저 밴드는 다음과 같다.

$$ \bar{X} = {\sum_{j=1}^N X_j \over N} $$

 

상단, 하단 볼린저 밴드에 들어가는 표준편차는 다음과 같이 표현한다.

$$ \sigma = \sqrt{\sum_{j=1}^N (X_j - \bar{X})^2 \over N} $$

 

이제 이 데이터를 이용하여 자신만의 멋진 투자 전략을 만들어보자.

주식의 종가(Close) 데이터를 이용하여 기술적지표 중 가장 기본이 되는 이동평균선을 만들어보자.

 

주가 데이터는 FinanceDataReader 라이브러리를 이용해서 가져오도록 하자.

설치시 pip install FinanceDataReader가 아니라 pip install -U finance-datareader 를 입력해서 설치하자.

 

예전에는 야후 파이낸스에서 제공하는 pandas_datareader api를 이용했는데 미국 주식 데이터는 정확하지만 국내 주식은 데이터가 빠져있는 등 데이터를 가공하기에 적합하지 않다.

 

참고로 FinanceDataReader는 네이버 증권에 있는 주가 데이터를 가져온다.

 

다음과 같이 주가 데이터를 가져와보자.

DataReader의 첫번째 파라미터에는 원하는 종목코드를, 두번째 파라미터에는 연도를 입력하자.

import FinanceDataReader as fdr
df = fdr.DataReader("019175", "2020")
print(df)

Jupyter Notebook을 이용해서 실행하면 다음과 같이 조회된다.

 

종가(Close)를 이용하여 이동평균선 값을 구해보자.

df = df[['Close']]
df['MA5'] = df['Close'].rolling(window=5).mean() # 5일선
df['MA10'] = df['Close'].rolling(window=10).mean() # 10일선
df['MA20'] = df['Close'].rolling(window=20).mean() # 20일선
df['MA60'] = df['Close'].rolling(window=60).mean() # 60일선
df['MA120'] = df['Close'].rolling(window=120).mean() #120일선
print(df)

이번에는 종가의 변화율을 만들어보자.

df['Close_dpc'] = (df['Close'] / df['Close'].shift(1) - 1) * 100  #종가 변화율 일반식
df['Close_pct_change'] = df['Close'].pct_change() * 100 #종가 변화율 pct_change함수 사용
print(df)

변화율은 간편하게 pct_change() 함수를 이용하면 된다. 

기본값은 하루전 종가와의 변화율이고 며칠 전 종가와의 변화율도 pct_change()를 이용하면 간단하게 구할 수 있다.

df = df[['Close']]
df['Close_pct_change5'] = df['Close'].pct_change(5) * 100 #5일 전 종가와 당일종가의 변화율
print(df.tail(10))

2020-11-13 종가(138,500)와 5일전인 2020-11-06 종가(143,500)의 변화율을 구하면 -3.484321로 계산됨을 알 수 있다.

 

+ Recent posts