중심극한정리를 사용하여 최근 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]))
우선 이 자료가 정규분포 또는 로그노말 분포에 적합성을 확인합니다.
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()
모집단에서 분취하는 원소의 수를 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)
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)
결과는 정규분포에 부합함을 보여줍니다.
댓글
댓글 쓰기