IT지식/빅데이터

토이프로젝트 - (7) VAR - 1단계

매 석 2023. 6. 23. 18:49
반응형

- 과거 내용

 

 

토이프로젝트 - (6) 논문 분석

논문 사이트 여러 사이트에서 논문을 확인할 수 있지만 riss를 사용했다. 한국 증시, 미국 증시 관계에 대...

blog.naver.com

여러 가지 논문을 보고 VAR 모형과 Granger 인과검정 등을 사용하기로 결정했다.

 

 

 

벡터자기회귀 모형(VAR)을 활용한 다변량 예측 모델링 - 국내 주요 기업 주가 및 거래량 예측

Step 1. VAR 이란? VAR이란 Vector Autoregression, 벡터자기회귀 모형을 의미한다. 기본적인 자기회귀모형이 단변량 시계열 예측에서 사용된다면 벡터자기회귀모형은 다변량 예측에 사용된다. 즉, 2개 이

songseungwon.tistory.com

 

서칭하다 보니, 다른 분이 정리해준 좋은 자료가 있어서

이 포스팅을 참조하려 한다.

 

 

- 데이터 파악하기

데이터 기간은 2011년 8월 5일 ~ 2023년 6월 23일이며

처음에 pandas의 shift를 사용하여 미국과 한국의 날짜 차이를

조정하려 했으나, 아래와 같이 다우 지수의 22일 데이터가

코스피의 23일 데이터와 이미 매칭되어있는 상태였다.

막상 매칭을 해보니, 날짜가 2012년 7월 19일부터 시작이다.

코스피 날짜를 기준으로 하다보니, 두 나라의 공휴일 등의

차이로 시작 날짜가 달라질 수도 있지만 거의 1년 정도의 차이가 발생했다.

이를 알아본 결과 아래의 #01 코드의 문제였다. (데이터 수집 코드)

from bs4 import BeautifulSoup
import pandas as pd
import urllib.request as req
import requests
df=[]

symb=[]
xymd=[]
open=[]
close=[]
diff=[]
rate=[]
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.62'}
for i in range(1,300):
            url="https://finance.naver.com/world/worldDayListJson.naver?symbol=DJI@DJI&fdtc=0&page="+str(i)
            data = requests.get(url,headers=headers)
            value= data.json()
            #01
            for j in range(len(value[0])+1):
                symb.append(value[j]["symb"])
                xymd.append(value[j]["xymd"])
                open.append(value[j]["open"])
                close.append(value[j]["clos"])
                diff.append(value[j]["diff"])
                rate.append(value[j]["rate"])
            df=pd.DataFrame({"code":symb, "date":xymd,"open":open,"close":close,
                                  "diff":diff,"rate":rate})
df.to_csv("DW.csv",index=False)

 

 

 

for문의 range에서 len(value[0]) 값으로 진행했기에 마지막 값이 짤리는 것이

지속되다보니 1년의 차이가 생긴 것이다. 그래서 +1을 해서 해결해주었다.

이후 데이터의 개수를 모두 2600개로 고정시켰다.

그랬더니 미국은 2013년 2월 25일~ 2023년 6월 23일의 기간을 가지고

한국은 2012년 11월 28일 ~ 2023년 6월 23일까지의 기간을 가진다.

이 차이는 10년 동안의 개장 일수 차이가 약 60일 정도 있다는 것이다.

(데이터 분석에 사용할 코드)

 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# Graph Style
import mplcyberpunk
plt.style.use('cyberpunk')

def readData(name):
    return pd.read_csv(name+".csv")

def madeData(name):
    value=readData(name)
    temp = pd.DataFrame({'Date':KS['date'],name:value['close'],'KS':KS['close']})
    
    #inplace를 통해 기존의 인덱스(숫자)를 대체
    temp.set_index('Date',inplace=True)
    temp = temp.dropna()
    return temp

def showChart(df):
    fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(15,6))
    #numpy 다차원 배열 공간을 1차원으로 평탄화해주는 함수 
    ax_li = axes.flatten()
    df_cols = df.columns
    #zip이라는 내장 함수로 묶어준다. 
    for i, (col, ax) in enumerate(zip(df_cols, ax_li)):
        ax.plot(df[col], linewidth=0.8)
        ax.set_title(col)

    plt.tight_layout()
    plt.show()

KS=readData("KS")
KDW = madeData("DW")
showChart(KDW)

#KSP = madeData("SP")
#showChart(KSP)
#KNS = madeData("NS")
#showChart(KNS)

KOSPI와 DOW 지수의 차트를 비교한 것이다.

차트를 보여주기 전에, flatten이라는 numpy 함수를 사용하여

다차원 배열 공간을 1차원으로 평탄화해주었다.

그 결과 아래 사진과 같이 1차원 그래프 형태의 결과를 얻을 수 있다.

다음 포스팅은 Granger 인과검정을 다룰 예정이다.