IT지식/빅데이터

토이프로젝트 - (11) 다변량 선형 확률과정 - 5단계

매 석 2023. 7. 2. 18:54
반응형

- 과거 내용

 

 

토이프로젝트 - (10) 다변량 선형 확률과정 - 4단계

과거 내용 다변량 시계열 모델 1. ARCH 오차항의 분산의 현재값이 이전 오차항의 제곱값들에 의존할 것...

blog.naver.com

 

- VECM(오차수정모형)

 

두 시계열 데이터가 공적분 관계를 가지고 있다면

정상성을 만족하지 않아도 차분을 진행하지 않고

바로 모형에 데이터를 적합시킬 수 있다.

- VECM 코드

def vecm_model(df):
    from statsmodels.tsa.vector_ar import vecm 
    vmodel = vecm.VECM(endog = df, k_ar_diff = 9, coint_rank = 3, deterministic = 'ci')
    model_fit = vmodel.fit()
    print(model_fit.summary())

 

모형을 만드는 과정이다.

각각의 옵션의 의미는 아래 링크를 통해 공부할 수 있다.

 

 

statsmodels.tsa.vector_ar.vecm.VECM - statsmodels 0.15.0 (+44)

statsmodels.tsa.vector_ar.vecm.VECM class statsmodels.tsa.vector_ar.vecm.VECM(endog, exog=None, exog_coint=None, dates=None, freq=None, missing='none', k_ar_diff=1, coint_rank=1, deterministic='n', seasons=0, first_season=0)[source] Class representing a Ve

www.statsmodels.org

 

- 출력 결과

==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
L1.KS         -0.0829      0.056     -1.484      0.138      -0.192       0.027
L1.DW          0.1233      0.057      2.157      0.031       0.011       0.235
L2.KS          0.0080      0.053      0.151      0.880      -0.095       0.111
L2.DW          0.1302      0.054      2.422      0.015       0.025       0.236
L3.KS          0.0199      0.049      0.404      0.686      -0.077       0.117
L3.DW          0.1185      0.051      2.343      0.019       0.019       0.218
L4.KS          0.0007      0.045      0.016      0.987      -0.088       0.090
L4.DW          0.0222      0.046      0.480      0.631      -0.068       0.113
L5.KS         -0.0045      0.042     -0.109      0.913      -0.086       0.077
L5.DW          0.0241      0.042      0.572      0.567      -0.058       0.107
L6.KS         -0.0532      0.037     -1.419      0.156      -0.127       0.020
L6.DW          0.0324      0.037      0.868      0.385      -0.041       0.105
L7.KS         -0.0305      0.033     -0.921      0.357      -0.095       0.034
L7.DW         -0.0076      0.033     -0.232      0.816      -0.071       0.056
L8.KS         -0.0184      0.028     -0.663      0.507      -0.073       0.036
L8.DW          0.0054      0.027      0.200      0.841      -0.047       0.058
L9.KS          0.0199      0.020      1.015      0.310      -0.019       0.058
L9.DW          0.0284      0.018      1.567      0.117      -0.007       0.064
Det. terms outside the coint. relation & lagged endog. parameters for equation DW
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
L1.KS         -0.1668      0.060     -2.762      0.006      -0.285      -0.048
L1.DW         -0.0521      0.062     -0.842      0.400      -0.173       0.069
L2.KS         -0.1827      0.057     -3.203      0.001      -0.294      -0.071
L2.DW          0.0031      0.058      0.053      0.958      -0.111       0.117
L3.KS         -0.0863      0.053     -1.618      0.106      -0.191       0.018
L3.DW          0.0274      0.055      0.501      0.616      -0.080       0.135
L4.KS         -0.0982      0.049     -1.997      0.046      -0.195      -0.002
L4.DW         -0.0401      0.050     -0.804      0.422      -0.138       0.058
L5.KS         -0.0077      0.045     -0.170      0.865      -0.096       0.081
L5.DW         -0.0151      0.045     -0.332      0.740      -0.104       0.074
L6.KS         -0.0363      0.041     -0.896      0.370      -0.116       0.043
L6.DW         -0.1047      0.040     -2.597      0.009      -0.184      -0.026
L7.KS         -0.0328      0.036     -0.918      0.359      -0.103       0.037
L7.DW          0.0166      0.035      0.471      0.638      -0.052       0.086
L8.KS         -0.0594      0.030     -1.982      0.048      -0.118      -0.001
L8.DW         -0.0460      0.029     -1.591      0.112      -0.103       0.011
L9.KS         -0.0560      0.021     -2.637      0.008      -0.098      -0.014
L9.DW          0.0451      0.020      2.299      0.022       0.007       0.083
                 Loading coefficients (alpha) for equation KS
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
ec1           -0.9151      0.059    -15.637      0.000      -1.030      -0.800
ec2           -0.1091      0.060     -1.822      0.068      -0.226       0.008
ec3           -0.0002      0.000     -0.796      0.426      -0.001       0.000
                 Loading coefficients (alpha) for equation DW
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
ec1            0.1976      0.063      3.122      0.002       0.074       0.322
ec2           -1.0298      0.065    -15.908      0.000      -1.157      -0.903
ec3           -0.0003      0.000     -1.618      0.106      -0.001    7.06e-05
          Cointegration relations for loading-coefficients-column 1
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
beta.1         1.0000          0          0      0.000       1.000       1.000
beta.2      5.245e-18          0          0      0.000    5.25e-18    5.25e-18
const       1.648e-21          0          0      0.000    1.65e-2

 

- 10개 지점에 대한 예측 결과

def vecm_model(df):
    from statsmodels.tsa.vector_ar import vecm 
    vmodel = vecm.VECM(endog = df, k_ar_diff = 9, coint_rank = 3, deterministic = 'ci')
    model_fit = vmodel.fit()
    model_fit.plot_forecast(steps=10, n_last_obs=50)

옵션은 아래 링크를 통해서 알 수 있다.

 

statsmodels.tsa.vector_ar.vecm.VECMResults.plot_forecast - statsmodels 0.15.0 (+44)

statsmodels.tsa.vector_ar.vecm.VECMResults.plot_forecast VECMResults.plot_forecast(steps, alpha=0.05, plot_conf_int=True, n_last_obs=None)[source] Plot the forecast. Parameters: stepsintPrediction horizon. alphafloat, 0 < alpha < 1The confidence level. plo

www.statsmodels.org

 

- 전체 코드 및 토이프로젝트 후기

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,df):
    temp = pd.DataFrame({'Date':KS['date'],'KS':KS['close'],name:df['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
    for i, (col, ax) in enumerate(zip(df_cols, ax_li)):
        print(col,ax)
        ax.plot(df[col], linewidth=0.8)
        ax.set_title(col)

    plt.tight_layout()
    plt.show()
    
#정상성 분석 함수
def adf_test(data):
    data = pd.read_csv(data+".csv")
    from statsmodels.tsa.stattools import adfuller
    #axis=1은 열을 의미한다.
    #data = data.drop(['code'],axis=1) 
    data=data[['date','close']]
    #로그 변환 - 주가가 큰 폭으로 움직여서
    data['close']=np.log(data['close'])
    #print(data)
    result = adfuller(data['close'])
    #print(f'원 데이터 ADF Statistic: {result[0]:.3f}')
    #print(f'원 데이터 p-value: {result[1]:.3f}')
    if(result[1]>0.05):
        #차분으로 추세제거
        data['close']=data['close'].diff(periods=1).iloc[1:]
        data=data.dropna()
        result = adfuller(data['close'])
        #print(f'1차 차분 ADF Statistic: {result[0]:.3f}')
        #print(f'1차 차분 p-value: {result[1]:.10f}')
    #변환 후 반환
    return data
#그레인저 인과검정
def granger(df,data,data2):
    from statsmodels.tsa.stattools import grangercausalitytests
    df_cols = df.columns
    maxlag=14
    #KS->DW
    df_outs=grangercausalitytests(df[[data,data2]],maxlag=maxlag)
    print(df_outs)
    
    #DW->KS
    df_outs=grangercausalitytests(df[[data2,data]],maxlag=maxlag)
    print(df_outs)
    
def cointegration(KDW):
    from statsmodels.tsa.vector_ar.vecm import coint_johansen
    out = coint_johansen(KDW,1,1)
    #공적분 결과값이 해당 유의수준 통계량보다 크면 유의하다.
    stats = [round(x,2) for x in out.lr1] #공적분 통계량
    sigs = [round(x,2) for x in out.cvt[:, 1]] #유의수준 0.05 관측치
    yns = [x>y for x,y in zip(stats,sigs)] # 유의 여부(장기 안정성)
    dist = np.mean(np.array(stats) - np.array(sigs)) #안정성의 강도
    print('stats: ',stats) 
    print('sig-level: ',sigs)
    print('significant_yn: ',[x>y for x,y in zip(stats,sigs)])
    print('dist: ', round(dist,2))

def var_model(df):
    from statsmodels.tsa.api import VAR
    from statsmodels.stats.stattools import durbin_watson
    model = VAR(df)
    model = model.fit(3)
    print(model.summary())
    durbin = pd.DataFrame([model.resid.columns, 
                           [round(x,2) for x in durbin_watson(model.resid)]]).T
    durbin = durbin.set_index([0])

def vecm_model(df):
    from statsmodels.tsa.vector_ar import vecm 
    vmodel = vecm.VECM(endog = df, k_ar_diff = 9, coint_rank = 3, deterministic = 'ci')
    model_fit = vmodel.fit()
    print(model_fit.predict(steps=10))
    model_fit.plot_forecast(steps=10, n_last_obs=50)

KS=adf_test("KS")
DW=adf_test("DW")
KDW = madeData("DW",DW)
vecm_model(KDW)

#KS=readData("KS")
#DW=readData("DW")
#cointegration(KDW)
#granger(KDW,"KS","DW")
#showChart(KDW)
#granger(KDW)
#KSP = madeData("SP")
#showChart(KSP)
#KNS = madeData("NS")
#showChart(KNS)

 

정리하지 않고 그 동안 adf_test, 공적분 검정, VAR, VECM 모형 등을

구현한 전체 코드이다. 주석 처리한 부분은 단계별로 필요할 때 사용하고

다음 단계에 필요하지 않을 때 주석 처리한 것이다.

대학 중간중간 시간을 조금씩 내서 공부하고 토이프로젝트를 진행했는데,

생각보다 기간이 너무 길어졌다. 또한 데이터 분석을 중점으로 공부하려 했는데,

주가와 관련되다보니, 경제학에서 필요한 통계학 쪽으로 치우치게 되었고,

결국 VAR, VECM과 같은 경제와 깊은 관련이 있는 것들을 공부하게 되었다.

그러다보니, 한글로 된 설명들이 없었기에 모형의 통계학적 해석에 어려움이 있었다.

다음에는 조금 더 데이터 분석과 가까운 주제와 기법으로 돌아올 예정이다.

아직 부족하기에 딥러닝 기법과 개념을 조금 학습해야할 듯 하다.