기본 콘텐츠로 건너뛰기

[ML] 결정트리(Decision Tree) 모델

stock data의 정규 분포의 적합성_bootstrap, CLT

중심극한정리를 사용하여 최근 60일 또는 30일간의 일일자료를 바탕으로 자료의 수를 증가시켜 회귀모형을 작성합니다.
우선 이 자료가 정규분포 또는 로그노말 분포에 적합성을 확인합니다.

1. 자료 호출 (대상은 코덱스 레버리지)
엑셀에 보관된 자료를 호출합니다.

>>> import numpy as np
>>> import pandas as pd
>>> from datetime import datetime, timedelta
>>> kl=pd.read_excel('C:\\~~\\newD1.xlsx', sheet_name="kl")

호출한 자료 중에서 일정한 날짜 이후의 데이터를 추출합니다.
이 경우 사용될 수 있는 date 자료형은 pd.Timestamp를 사용하여 입력된 숫자형 타입을 date형으로 전환합니다.

>>> startd=pd.Timestamp(datetime(2017,9,20))
>>> kl1=kl.ix[kl.index>=startd, :]
>>> len(kl1) #데이터 프레임 형에서 행의 수를 나타냅니다.
 60

위의 자료의 정규성 검사를 위해 QQ plot과 pearson 상관검정을 실시해 봅니다.

>>> from scipy import stats
>>> g=plt.subplot(111)
>>> x=stats.probplot(kl1.ix[:,3], dist="norm", plot=g)
>>> plt.show()

위의 객체 x에서 생성된 두 결과 객체 즉, 위 그림의 ordered Value(x[0][1])과 Theoretical quanties(x[0][0]) 사이의 상관분석을 실시해보면 다음과 같은 결과가 나타납니다.

>>> stats.pearsonr(x[0][0], x[0][1])
(0.98511825464031455, 4.6495729909051628e-46)

이 결과의 첫번째 인수는 상관계수이고 두 번째 인수는 p-value입니다. 이 검정의
귀무가설 : 두 객체의 상관성은 0이다.
이므로 귀무사설을 기각 할 수 있습니다. 즉, 두 변수는 높은 상관성이 있다고 할 수 있습니다. 그러나 pearson 상관분석은 샘플의 수가 500개 이상이일 경우에 높은 신뢰성을 보입니다.
이러한 이유로 다음 결과와 약간 상이한 점이 나타납니다.
이 결과를 다음의 원 자료의 히스토그램과 히스토그램을 작성하기 위해 각 구간을 설정한 값들이 정규분포를 따른다고 가정할 경우 가지는 밀도 함수를 작도할 경우 정규분포에 부합한다는 점에 의문을 가질 수 있습니다. 데이터 수가 적음으로 일어나는 원인인 것 같습니다.

>>> import matplotlib.pyplot as plt
>>> from scipy.stats import norm
>>> trg=kl1.ix[:,3]
>>> int=np.linspace(min(trg), max(trg)+1, np.int((max(trg)+1 -min(trg))/10))
>>> n, b, ig=plt.hist(trg, bins=int, normed=True, alpha=0.3)
>>> mu=np.mean(trg)
>>> sd=np.std(trg)
>>> plt.plot(b, norm.pdf(b, mu, sd), color="r", linewidth=2, label="CP, n=60")
>>> plt.show()

그러므로 bootstrap 방법을 적용하여 봅니다. 이 방법은 중심극한정리를 기반으로 하는 것으로 위의 자료는 60개 입니다. 이 자료를 모수로 일부의 원소들을 분취하여 평균을 하나의 원소로 합니다. 이 과정을 여러번 반복하면 모집단의 평균과 새로 생성되는 데이터셋의 표준편차를 모수로 하는 정규분포를 따를 것입니다.
모집단에서 분취하는 원소의 수를 10개로 한다면 총 선택할 수 있는 경우의 수는 아래의 결과와 같이 매우 큽니다.
>>> 60**10
604661760000000000
그러므로 이 범위 내에서의 실행은 무방합니다.

정규성 검사를 시각화 하기 위한 히스토그램과 QQplot을 작도하고 pearson 상관분석 결과를 동시에 반환하는 함수와 배열 객체를 대상으로 boostrap을 적용하는 함수를 각각 작성하여 적용하였습니다.

def histNormalplotS(trg, lbl="cp"):
    int=np.linspace(min(trg), max(trg)+1, np.int((max(trg)+1 -min(trg))/10))
    g1=plt.subplot(121)
    n, b, ig=g1.hist(trg, bins=int, normed=True, alpha=0.3)
    mu=np.mean(trg)
    sd=np.std(trg)
    g1.plot(b, norm.pdf(b, mu, sd), color="r", linewidth=2, label=lbl)
    g2=plt.subplot(122)
    x=stats.probplot(trg, dist="norm", plot=g2)
    plt.show()
    return(stats.pearsonr(x[0][0], x[0][1]))

def mkbtsSampleS(obj, smpN, repN):
    n=len(obj)
    spId=np.random.choice(n, size=smpN, replace=True)
    sample=np.array(np.mean(obj.ix[spId,:], 0)).reshape(1,5)
    for i in range(repN+1):
        spId=np.random.choice(n, size=smpN, replace=True)
        sp=np.array(np.mean(obj.ix[spId,:], 0)).reshape(1,5)
        sample=np.r_[sample,sp]
    return(sample)

>>> kl2=mkbtsSampleS(kl1, 10, 1000)    

위에서 생성한 객체 kl1의 종가에 대한 검정
>>> histNormalplotS(kl2[:,3])
 (0.9986076612871887, 0.0)
결과는 정규분포에 부합함을 보여줍니다. 

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같

[matplotlib] 히스토그램(Histogram)

히스토그램(Histogram) 히스토그램은 확률분포의 그래픽적인 표현이며 막대그래프의 종류입니다. 이 그래프가 확률분포와 관계가 있으므로 통계적 요소를 나타내기 위해 많이 사용됩니다. plt.hist(X, bins=10)함수를 사용합니다. x=np.random.randn(1000) plt.hist(x, 10) plt.show() 위 그래프의 y축은 각 구간에 해당하는 갯수이다. 빈도수 대신 확률밀도를 나타내기 위해서는 위 함수의 매개변수 normed=True로 조정하여 나타낼 수 있다. 또한 매개변수 bins의 인수를 숫자로 전달할 수 있지만 리스트 객체로 지정할 수 있다. 막대그래프의 경우와 마찬가지로 각 막대의 폭은 매개변수 width에 의해 조정된다. y=np.linspace(min(x)-1, max(x)+1, 10) y array([-4.48810153, -3.54351935, -2.59893717, -1.65435499, -0.70977282, 0.23480936, 1.17939154, 2.12397372, 3.0685559 , 4.01313807]) plt.hist(x, y, normed=True) plt.show()

R 미분과 적분

내용 expression 미분 2차 미분 mosaic를 사용한 미분 적분 미분과 적분 R에서의 미분과 적분 함수는 expression()함수에 의해 생성된 표현식을 대상으로 합니다. expression expression(문자, 또는 식) 이 표현식의 평가는 eval() 함수에 의해 실행됩니다. > ex1<-expression(1+0:9) > ex1 expression(1 + 0:9) > eval(ex1) [1] 1 2 3 4 5 6 7 8 9 10 > ex2<-expression(u, 2, u+0:9) > ex2 expression(u, 2, u + 0:9) > ex2[1] expression(u) > ex2[2] expression(2) > ex2[3] expression(u + 0:9) > u<-0.9 > eval(ex2[3]) [1] 0.9 1.9 2.9 3.9 4.9 5.9 6.9 7.9 8.9 9.9 미분 D(표현식, 미분 변수) 함수로 미분을 실행합니다. 이 함수의 표현식은 expression() 함수로 생성된 객체이며 미분 변수는 다음 식의 분모의 변수를 의미합니다. $$\frac{d}{d \text{변수}}\text{표현식}$$ 이 함수는 어떤 함수의 미분의 결과를 표현식으로 반환합니다. > D(expression(2*x^3), "x") 2 * (3 * x^2) > eq<-expression(log(x)) > eq expression(log(x)) > D(eq, "x") 1/x > eq2<-expression(a/(1+b*exp(-d*x))); eq2 expression(a/(1 + b * exp(-d * x))) > D(eq2, "x") a * (b * (exp(-d * x) * d))/(1 + b