본문 바로가기
python/금융데이터분석

python 증권데이터 분석 - 회귀 분석과 상관관계, KOSPI 다우존스 회귀분석

by orangecode 2022. 12. 23.
728x90
회귀 분석과 상관관계

회귀분석이란 데이터의 상관관계를 분석하는데 사용되는 통계분석 방법을 말한다.

 

회귀분석은 회귀 모형을 설정한 뒤, 실제로 관측된 표본을 대상으로 회귀 모형의 계수를 추정한다.

 

독립변수라 불리는 하나 이상의 변수, 

종속변수라 불리는 하나의 변수 간의 관계를 나타내는 회귀식이 도출되면 

 

임의의 독립변수에 대해 종속 변수 값을 추측해볼 수 있는데 이를 예측(prediction)이라고 한다.

 

 

회귀라는 단어는 영국의 통계학자 프랜시스 골턴(Francis Galton)이 수행한 부모 자식간 키의 상관관계 연구에서 유래되었다.

 

골턴의 연구에서 키가 매우 큰 부모의 자식은 부모들보다 대부분 작고, 키가 작은 부모의 자식은 작지만 부모들보다 크다는 사실을 발견했다. 키는 평균적으로 회귀하려는 경향이 있을을 알아냈으며 이때부터 회귀분석이라는 용어를 사용했다.

 

KOSPI VS 다우존스 지수 단순비교

국내 주식 KOSPI와 미국 주식의 다우존스 지수의 상관관계를 비교해보자

 

① 2000년 이후 다우존스지수(^DJI) 데이터를 다운로드 한다.

 

② 2000년 이후 KOSPI(^KS11) 데이터를 다운로드 한다.

 

③ 다우존스 지수를 붉은 점선으로 출력한다.

 

④ KOSPI를 푸른 실선으로 출력한다.

 

 

kospi와 dow 지수의 기준 값이 다르기 때문에 어떤 지수가 더 좋은 성과를 냈는지 한눈에 알아보기 쉽지 않다.

import yfinance as yf
from pandas_datareader import data as pdr
import matplotlib.pyplot as plt

yf.pdr_override()

dow = pdr.get_data_yahoo('^DJI', start='2000-01-01')
# 코스피 지수 가져오기
kospi = pdr.get_data_yahoo('^KS11', start='2000-01-01')

# 종가 비교 그래프 그리기
plt.figure(figsize=(10,8))
plt.plot(dow.index, dow.Close, 'b', label='DOW')
plt.plot(kospi.index, kospi.Close, 'r', label='KOSPI')
plt.grid(True)
plt.xlabel('Period')
plt.ylabel('Stock Price')
plt.legend()
plt.show()

 

KOSPI VS 다우존스 지수화 비교

일반 종가 데이터만으로 KOSPI와 다우존스 지수의  상관관계는 비교하기가 힘들다.

 

그러므로 현재 종가가 아닌 특정 시점의 종가로 나누어 변동률을 지수화 비교로 확인할 수 있다.

 

① 현재 다우존스 지수를 2000년 이후 다우존스 지수로 나눈뒤 100을 곱한다.

 

현재 KOSPI 지수를 2000년 이후 KOSPI  지수로 나눈뒤 100을 곱한다.

 

# KOSPI & 다우존스 지수 단순 비교
import yfinance as yf
from pandas_datareader import data as pdr
import matplotlib.pyplot as plt

yf.pdr_override()

# 다우존스 지수 가져오기
dow = pdr.get_data_yahoo('^DJI', start='2000-01-01')
# 코스피 지수 가져오기
kospi = pdr.get_data_yahoo('^KS11', start='2000-01-01')

# 지수화
dow_d = (dow.Close / dow.Close.loc['2000-01-04']) * 100
kospi_k = (kospi.Close / kospi.Close.loc['2000-01-04']) * 100


# 종가 비교 그래프 그리기
plt.figure(figsize=(10,8))
plt.plot(dow_d.index, dow_d, 'b', label='DOW')
plt.plot(kospi_k.index, kospi_k, 'r', label='KOSPI')
plt.grid(True)
plt.xlabel('Period')
plt.ylabel('Stock Price')
plt.legend(loc='best')
plt.show()

 

KOSPI VS 다우존스 산점도 비교

산점도란 독립변수 x 와 종속변수 y의 상관관계를 확인할 때 사용하는 그래프이다.

가로축은 독립변수 x, 세로축은 종속변수 y를 나타낸다.

 

KOSPI와 다우존스의 상관관계를 알아보고자,

독립변수 x = 다우존스

종속변수 y = KOSPI

 

먼저 다우존스와 KOSPI를 비교하기 위해서는 다우존스, KOSPI의 Value 값의 개수가 같아야 한다.

 

데이터 전처리를 통해  index 값인 date를 기준으로 다우존스와 kospi 데이터를 merge해서 데이터 기간을 맞춰주기로 한다. 

# KOSPI & 다우존스 지수 단순 비교
import pandas as pd
import yfinance as yf
from pandas_datareader import data as pdr
import matplotlib.pyplot as plt

yf.pdr_override()

# 다우존스 지수 가져오기
dow = pdr.get_data_yahoo('^DJI', start='2000-01-01')
# 코스피 지수 가져오기
kospi = pdr.get_data_yahoo('^KS11', start='2000-01-01')

# kospi & 다우존스 dataframe 생성
df = pd.DataFrame({'DOW' : dow['Close'], 'KOSPI':kospi['Close']})
df

생성한 dataframe에 NaN값은 bfill(backwardfill)함수, bfill(forwardfill)함수를 이용하여 NaN 값을 덮어쓴다.

 

NaN값이 이전과 이후에 있는 값으로 NaN 값을 채울 수 있다.

KOSPI지수와 DOW JONES 지수 간 산점도를 분석해도 정확한 분석과 상관관계를 분석하기 힘드므로 선형 회귀 분석으로 정확히 분석해보고자 한다.

# KOSPI & 다우존스 지수 단순 비교
import pandas as pd
import yfinance as yf
from pandas_datareader import data as pdr
import matplotlib.pyplot as plt

yf.pdr_override()

# 다우존스 지수 가져오기
dow = pdr.get_data_yahoo('^DJI', start='2000-01-01')
# 코스피 지수 가져오기
kospi = pdr.get_data_yahoo('^KS11', start='2000-01-01')

# kospi & 다우존스 dataframe 생성
df = pd.DataFrame({'DOW' : dow['Close'], 'KOSPI':kospi['Close']})
df = df.fillna(method = 'ffill') # 앞의 데이터로 nan 채움
df = df.fillna(method = 'bfill') # 뒤의 데이터로 nan 채움

# 종가 비교 그래프 그리기
plt.figure(figsize=(10,8))
plt.scatter(df['DOW'], df['KOSPI'], marker='.')
plt.grid(True)
plt.xlabel('Dow Jones Industrial Average')
plt.ylabel('KOSPI')
plt.legend(loc='best')
plt.show()

 

KOSPI VS 다우존스 선형회귀 분석

SciPy 라이브러리 선형회귀 분석

: SciPy는 파이썬 기반 수학, 과학, 엔지니어링용 핵심 패키지 모음이다. 

SciPy는 numpy, matploblib, sympy, pandas 등의 수학적 알고리즘 모음으로 pip와 conda로 설치가 가능하다

 

SciPy 설치 방법

# pip install
pip install scipy

# conda install
conda install -c anaconda scipy

 

KOSPI VS 다우존스 선형회귀 분석

 

선형회귀 분석

회귀모델 : 연속적인 데이터 y, 원인이 되는 데이터 x 간의 관계를 추정하는 관계식

 

독립변수 X, 종속변수 Y의 관계를 1차식으로 나타낼 때, 선형회귀모델(Linear Regression Model)이라한다.

선형회귀모델

# KOSPI & 다우존스 지수 단순 비교
import pandas as pd
import yfinance as yf
from scipy import stats
from pandas_datareader import data as pdr
import matplotlib.pyplot as plt

yf.pdr_override()

# 다우존스 지수 가져오기
dow = pdr.get_data_yahoo('^DJI', start='2000-01-01')
# 코스피 지수 가져오기
kospi = pdr.get_data_yahoo('^KS11', start='2000-01-01')

# kospi & 다우존스 dataframe 생성
df = pd.DataFrame({'DOW' : dow['Close'], 'KOSPI':kospi['Close']})
df = df.fillna(method = 'ffill') # 앞의 데이터로 nan 채움
df = df.fillna(method = 'bfill') # 뒤의 데이터로 nan 채움

regr = stats.linregress(df['DOW'], df['KOSPI'])
regr
LinregressResult(slope=0.0717265562726003,    # 기울기
                 intercept=523.4758645052154, # y절편
                 rvalue=0.8230390474102471,   # R값(상관계수) 
                 pvalue=0.0,                  # p값
                 stderr=0.0006413313194406676, # 표준편차
                 intercept_stderr=11.541536248960632)

 

stats 로 생성한 모델로 선형회귀식을 위와 같이 구할 수 있다.

임의의 x의 값이 주어질 경우 이에 해당하는 y 값을 예측할 수 있다.

 

상관계수에 따른 리스크 완화

상관계수(Coeffcient of Correlation)이란 독립변수와 종속변수 사이의 상관관계 정도를 나타내는 수치이다.

 

상관계수 r-1 ≤ r ≤ 1의 범위를 가진다.

 

상관계수 r = 1에 가까울 때, 양의 상관관계가 가장 강한 값이다.

상관계수 r = -1에 가까울 때, 음의 상관관계가 가장 강한 값이다.

상관계수 r = 0에 가까울 때, 2개의 변수는 상관관계가 없다.

 

 

KOSPI VS DOW JONES 지수 상관계수 구하기

## KOSPI VS DOW 지수 상관계수 구하기
df['DOW'].corr(df['KOSPI'])

 

상관계수에 따른 리스크 완화 효과
+ 1.0 리스크 완화 효과 없음
+ 0.5 중간 정도 리스크 완화 효과 있음
0 상당한리스크 완화 효과 있음
- 0.5 대부분의 리스크를 제거함
- 1.0 모든 리스크를 제거함

노벨 경제학상을 수상한 해리 마코위츠 박사의 현대 포트폴리오 이론에 의하면

'투자에 대한 수익과 위험은 평균과 분산으로 나타낼 수 있으며, 상관관계가 낮은 자산을 대상으로 분산 투자하면 위험을 감소시킬 수 있다' 는 이론을 말한다.

 

상관관계가 낮은 대표적인 예가 주식 vs 채권인데

상관관계가 낮은 자산들로 포트폴리오를 구성하면 약세장, 강세장에서 모두 실적을 낼 수 있다.

 

결정계수 구하기

결정계수란 관측된 데이터에서 추정한 회귀선이  실제로 데이터를 얼마나 잘 설명하고 있는지 나타나는 계수이다.

 

결정계수는 두 변수의 상관관계 정도를 나타내는 상관계수(R value)를 제곱한 값이다.

 

보통 R2 결정계수 = R2 SCORE라고 부른다.

 

KOSPI VS DOW JONES 지수 결정계수 구하기

## KOSPI VS DOW 지수 상관계수 구하기
# R-Value
r_value = df['DOW'].corr(df['KOSPI'])

# 결정계수 r2 score
r2 = r_value ** 2
r2

 

KOSPI VS DOWS JONES 회귀분석 전체 코드

# KOSPI & 다우존스 지수 단순 비교
import pandas as pd
import yfinance as yf
from scipy import stats
from pandas_datareader import data as pdr
import matplotlib.pyplot as plt

yf.pdr_override()

# 다우존스 지수 가져오기
dow = pdr.get_data_yahoo('^DJI', start='2000-01-01')
# 코스피 지수 가져오기
kospi = pdr.get_data_yahoo('^KS11', start='2000-01-01')

# kospi & 다우존스 dataframe 생성
df = pd.DataFrame({'DOW' : dow['Close'], 'KOSPI':kospi['Close']})
df = df.fillna(method = 'ffill') # 앞의 데이터로 nan 채움
df = df.fillna(method = 'bfill') # 뒤의 데이터로 nan 채움

regr = stats.linregress(df['DOW'], df['KOSPI'])
regr_line = f'Y = {regr.slope : 2f} * X + {regr.intercept : 2f}'

# 종가 비교 그래프 그리기
plt.figure(figsize=(10,8))
plt.scatter(df['DOW'], df['KOSPI'], marker='.')
plt.plot(df.DOW, regr.slope * df.DOW + regr.intercept, 'r')
plt.legend('DOW X KOSPI', regr_line)
plt.title('DOW X KOSPI (R = {regr.rvalue: .2f})')
plt.xlabel('Dow Jones Industrial Average')
plt.ylabel('KOSPI')
plt.show()

 

 

참고도서

http://www.yes24.com/Product/Goods/90578506

 

파이썬 증권 데이터 분석 - YES24

투자 기법과 프로그래밍 기술로 자신만의 퀀트 투자 시스템을 완성하라『파이썬 증권 데이터 분석』은 웹 스크레이핑으로 증권 데이터를 주기적으로 자동 수집, 분석, 자동 매매, 예측하는 전

www.yes24.com

https://github.com/INVESTAR/StockAnalysisInPython

 

GitHub - INVESTAR/StockAnalysisInPython

Contribute to INVESTAR/StockAnalysisInPython development by creating an account on GitHub.

github.com

 

 

반응형

댓글