SW/주가 예측

시계열 데이터 : 자기상관, 상관도표 : 개념, 예제, 그리기

얇은생각 2019. 7. 1. 07:30
반응형

자기공분산

공분산을 지난 포스팅에서 알아보았습니다. 공분산은 동일한 시간에서 2개 변수의 상관관계를 분석하는 것입니다. 그렇다면 자기 공분산은 무엇일까요?


자기공분산은 서로 다른 2개의 시간에 대한 변수 값의 공분산을 계산합니다. 자기 공분산 함수는 왜 구하는 것일까요?


자기공분산 함수는 시간에 따른 값들의 상관 관계가 어떻게 되는지 파악할 수 있습니다. 현재의 상관 관계가 증가 추세인지, 하향추세인지, 중립 상태인지 알 수 있습니다. 또한, 상관관계의 변화 폭이 얼마나 되는지도 알 수 있습니다. 


따라서 자기공분산 함수는 시계열 데이터의 추세와 크기를 파악하는 데에 용이하게 활용할 수 있습니다.




자기상관

상관은 지난 포스팅에서 알아 보았습니다. 자기상관은 무엇일까요?


자기상관은 시계열 변수의 시간에 따른 자기 상관 관계를 나타내는 것입니다. 계열 상관, 교차자기 상관이라고도 합니다. 상관이 특정 시간에 대한 변수간의 상관관계라면, 자기상관은 시간의 변화에 따른 변수 간의 상관관계 변화가 주 관심사입니다. 


즉, 어떤 시계열 데이터가 일정한 패턴을 본인다면, 자기 상관이 있따는 것을 뜻합니다. 시간에 따라 변수의 값이 자기상관성을 가지고 변화하므로, 무작위가 아닌 일정한 패턴을 보여준다고 할 수 있습니다. 


자기 상관을 어떻게 활용할 수 있을까요? 바로 데이터의 무작위성을 파악할 수 있습니다.


자기상관 데이터가 -에 가까울 수록, 무작위성이 있는 시계열 데이터로 판단할 수 있습니다. 0보다 큰값을 가짓ㄹ 수록 자기상관을 강하게 가진다고 할 수 있습니다.


자기상관은 알고리즘 트레이딩에서 매우 중요한 이론적 바탕입니다.  그렇다면 현대 모비스에 자기상관 그래프를 그려보도록 하겠습니다.





import pandas as pd
import pandas_datareader.data as web
import datetime
import matplotlib.pyplot as plt
from pandas.plotting import scatter_matrix
from pandas.tools.plotting import scatter_matrix, autocorrelation_plot


# file_name 다운로드한 주가 데이터를 저장할 파일 이름
# company_code 종목 코드
# year1/month1/date1 데이터를 다운로드할 시작일
# year2/month2/date2 데이터를 다운로드할 마감일
def download_stock_data(file_name, company_code, year1, month1, date1, year2, month2, date2):
start = datetime.datetime(year1, month1, date1)
end = datetime.datetime(year2, month2, date2)
df = web.DataReader("%s.KS" % (company_code), "yahoo", start, end)
df.to_pickle(file_name)
return df


def load_stock_data(file_name):
df = pd.read_pickle(file_name)
return df


download_stock_data('mobis.data', '012330', 2018, 1, 1, 2018, 12, 31)
df_mobis = load_stock_data('mobis.data')

download_stock_data('mando.data', '204320', 2018, 1, 1, 2018, 12, 31)
df_mando = load_stock_data('mando.data')

fig, axs = plt.subplots(2,1)
df_mobis['Close'].plot(ax=axs[0])
autocorrelation_plot(df_mobis['Close'], ax=axs[1])
plt.show()




위 그래프는 모비스 주식의 종가입니다. 아래쪽 그래프는 자기상관 그래프입니다. 모비스 종가는 시간이 흘러감에 따라 -을 향해가는 경향을 보여주고 있습니다. 이것은 무작위성이 있다는 것을 알 수 있습니다.




상관도표

상관도표는 무엇일까요? 이것은 자기상관함수를 Lag K의 순차적 값에 따라 나타낸 그래프입니다. 자기 상관도라고도 합니다. 


자기상관 그래프와 동일하며, 그래프 형태가 막대 그래프 형태입니다.


선보다 크기를 잘푠해주어, Lag 구조를 파악하는 데 용이합니다. 따라서 무작위성을 파악하는 데도 좋습니다.


이러한 상관도표를 활용해서 주가의 계졀성이나 결정적인 추세가 있는지 판별하기 위해 많이 활용합니다.


그렇다면 이번에는 모비스의 종가를 상관도표로 그려보겠습니다.



import pandas as pd
import pandas_datareader.data as web
import datetime
import matplotlib.pyplot as plt
from pandas.plotting import scatter_matrix
from pandas.tools.plotting import scatter_matrix, autocorrelation_plot
from pandas.compat import range, lrange, lmap, map, zip
import numpy as np


# file_name 다운로드한 주가 데이터를 저장할 파일 이름
# company_code 종목 코드
# year1/month1/date1 데이터를 다운로드할 시작일
# year2/month2/date2 데이터를 다운로드할 마감일
def download_stock_data(file_name, company_code, year1, month1, date1, year2, month2, date2):
start = datetime.datetime(year1, month1, date1)
end = datetime.datetime(year2, month2, date2)
df = web.DataReader("%s.KS" % (company_code), "yahoo", start, end)
df.to_pickle(file_name)
return df


def load_stock_data(file_name):
df = pd.read_pickle(file_name)
return df


def get_autocorrelation_dataframe(series):
def r(h):
return ((data[:n - h] - mean) * (data[h:] - mean)).sum() / float(n) / c0

n = len(series)
data = np.asarray(series)

mean = np.mean(data)
c0 = np.sum((data - mean) ** 2) / float(n)

x = np.arange(n) + 1
y = lmap(r, x)

df = pd.DataFrame(y, index=x)

return df



download_stock_data('mobis.data', '012330', 2018, 1, 1, 2018, 12, 31)
df_mobis = load_stock_data('mobis.data')
df_mobis_corr = get_autocorrelation_dataframe(df_mobis['Close'])

fig, axs = plt.subplots(2,1)
axs[1].xaxis.set_visible(False)

df_mobis['Close'].plot(ax=axs[0])
df_mobis_corr[0].plot(kind='bar',ax=axs[1])

plt.show()



앞서 본 자기상관 그래프와 동일한 그래프라는 것을 확인할 수 있었습니다.

반응형