1. 자료의 정규성에 따른 추정
자료의 수가 증가하면 정규분포를 따른다. 일반적으로 금융자료는 로그노말분포를 따른다. 그러므로 일일 자료의 시, 고, 저, 종의 자료를 로그화하여 각 일의 평균과 분산을 구한다. 계산된 평균과 분산을 기준으로 정규분포에 부합하는 일정한 샘플의 수를 추출한다.
결과적으로 새로운 자료는 각 매매일의 평균과 분산으로 구성된다.
기준으로 1000개의 자료를 반복적으로 추출하여 평균과 분산을 계산하자. 작성된 자료는 각각의 평균과 분산이다.
원자료의 구조
date
|
op
|
hp
|
lp
|
cp
|
vol
|
2016-12-22
|
59000
|
59600
|
58300
|
59000
|
356648
|
2016-12-23
|
59200
|
59400
|
58300
|
59200
|
268338
|
2016-12-26
|
59300
|
59300
|
56800
|
57000
|
588623
|
2016-12-27
|
57000
|
58300
|
56900
|
57800
|
357689
|
2016-12-28
|
57600
|
58400
|
57500
|
57600
|
315328
|
2016-12-29
|
57500
|
57700
|
56800
|
57000
|
224929
|
새로 작성된 자료의 구조
[,1]
|
[,2]
| |
2016-12-22
|
58989.11
|
537.705
|
2016-12-23
|
59029.57
|
505.4986
|
2016-12-26
|
58137.11
|
1379.243
|
2016-12-27
|
57503.86
|
656.4537
|
2016-12-28
|
57780.78
|
422.1877
|
2016-12-29
|
57234.39
|
413.1569
|
이 분석을 위해 다음과 같이 작성된 함수를 사용하였다.
forecast.distribution.s<-function(da, stDate, samplN, lvl=c(0.75, 0.90, 0.9), predD=1){
d<-da[index(da)>=stDate, 1:4]
d.l<-log(d)
d.mu<-apply(d.l, 1, mean)
d.sd<-apply(d.l, 1, sd)
d.new<-NULL
for(i in 1:nrow(d)){
d1<-rlnorm(samplN, d.mu[i], d.sd[i])
d.new<-rbind(d.new, c(mean(d1), sd(d1)))
}
d.new<-zoo(d.new, order.by=index(d))
mu<-as.data.frame(forecast(auto.arima(d.new[,1]), h=predD, level=lvl))
std<-as.data.frame(forecast(auto.arima(d.new[,2]), h=predD, level=lvl))
re<-list(NULL)
for(j in 1:nrow(mu)){
x<-NULL
x1<-NULL
for(i in 1:ncol(mu)){
if(std[j,i]<=0){
next
}
x<-rbind(x, quantile(rnorm(samplN, mu[j,i], std[j,i])))
x1<-append(x1,colnames(mu)[i])
}
x1[1]<-"mu"
rownames(x)<-x1
re[[j]]<-x
}
return(re)
}
사용예
> y<-forecast.distribution.s(dataLs[[4]], "2016-09-01", 10000, lvl, 3)
> y
[[1]]
0% 25% 50% 75% 100%
mu 54667.72 56535.06 56955.67 57373.41 59188.71
Lo 50 54843.00 56310.60 56622.61 56929.59 58394.11
Hi 50 54402.39 56748.28 57273.88 57793.35 59917.64
Lo 75 55166.83 56167.26 56399.53 56628.56 57744.91
Hi 75 54043.99 56908.49 57504.55 58110.29 60824.43
Lo 99 55668.51 55697.84 55704.56 55711.42 55741.87
Hi 99 53415.16 57346.18 58185.55 59020.08 63392.66
[[2]]
0% 25% 50% 75% 100%
mu 54599.68 56567.72 56980.65 57391.18 59324.67
Lo 50 54812.78 56123.36 56432.54 56743.89 58370.62
Hi 50 54738.03 57004.31 57536.92 58037.59 60677.39
Lo 75 54791.47 55813.61 56040.96 56265.65 57292.37
Hi 75 54594.07 57310.85 57910.73 58513.17 61624.19
Lo 99 54844.04 54876.18 54883.06 54889.98 54920.01
Hi 99 54663.04 58253.88 59086.74 59919.64 63939.49
[[3]]
0% 25% 50% 75% 100%
mu 54451.95 56624.40 57029.46 57430.88 59510.09
Lo 50 54590.91 56023.02 56331.98 56642.38 58184.48
Hi 50 54725.24 57195.05 57719.83 58246.00 60562.55
Lo 75 54654.54 55629.55 55861.65 56092.05 57274.46
Hi 75 54657.42 57584.71 58194.35 58778.22 61904.92
Lo 99 54363.61 54394.11 54400.89 54407.91 54435.79
Hi 99 54645.76 58825.61 59629.31 60441.42 63821.08
par(mfrow=c(3,1))
boxplot(t(y[[1]]))
boxplot(t(y[[2]]))
2. 두 변수들의 상관성과 관측값의 불일치 경향 찾기
python으로 작성
1) 설명변수와 반응변수의 시차를 일정기간 불일치 시켜 자료를 재배치
2) 1)에서 구축된 자료를 기반으로 지정구간의 이동평균 등을 위한 클래스 객체를 생성
3) 각 변수들 사이의 scale의 차이등으로 인해 정규화 시키는 것이 추후 분석에 유리하다. 그러므로 위에서 생성한 클래스 객체를 정규화
4) 그 클래스 객체의 지정된 변수들 사이의 상관계수를 계산
5) 상관계수의 변화와 실측값의 변화를 비교 그 추세를 검사
과정;
원 데이터는 google finance 에서 호출, 이 호출을 위해서는 다음의 모듈을 임포트해야 한다.
import numpy as np
import pandas as pd
from datetime import datetime
from pandas_datareader import data, wb #웹에서 데이터 호출
import pandas_datareader.data as web
print(d.head(3))
Open High Low Close Volume
Date
2016-01-04 1954.47 1954.52 1918.76 1918.76 359018000
2016-01-05 1911.93 1937.57 1911.93 1930.53 446548000
2016-01-06 1934.25 1934.25 1911.61 1925.43 594612000
print(d.tail(3))
Open High Low Close Volume
Date
2017-03-29 2172.31 2172.31 2162.04 2166.98 626792000
2017-03-30 2170.18 2174.16 2159.16 2164.64 643563000
2017-03-31 2166.62 2166.93 2159.80 2160.23 441640000
1) 분석을 위한 자료 생성은 다음의 사용자 정의 함수를 사용한다.
아래의 함수의 인수중 Da는 원 데이터, deColN은 반응변수로 할 열 번호, diffDay는 설명과 반응변수의 시차를 결정하기 위한 수치이다.
다음 함수는 먼저 원 데이터의 길이를 계산한다.
원 데이터 중에 반응변수의 열을 제거하고 분석할 값들만을 구성한 설명변수로 생성
shift() 함수를 적용하여 반응변수를 생성.
원 데이터의 마지막 설명변수는 최종 추정을 위한 다른 객체로 저장
def indDeS(da, deColN, diffDay=1):
n=len(da)
indN=np.delete(range(len(da.columns)), deColN)
da1=pd.DataFrame(da.ix[:(n-1), indN])
y=da.ix[:, deColN].shift(-diffDay)
da1['de']=y
targD=da.tail(1)[indN]
return([da1, targD])
d1, trg=indDeS(d, 3)
print(d1.tail(4))
Open High Low Volume de Date 2017-03-27 2161.17 2165.25 2153.14 395862000 2163.31 2017-03-28 2166.58 2169.14 2157.71 393970000 2166.98 2017-03-29 2172.31 2172.31 2162.04 626792000 2164.64 2017-03-30 2170.18 2174.16 2159.16 643563000 2160.23
print(trg)
Open High Low Volume Date 2017-03-31 2166.62 2166.93 2159.8 441640000
2) d1 객체의 정규화
dr=d1.rolling(window=5)
3) 자료의 정규화
3) 자료의 정규화
mu=dr.mean()sd=dr.std()norD=(d1-mu)/sdprint(norD.head(7))
Open High Low Volume de
Date
2016-01-04 NaN NaN NaN NaN NaN
2016-01-05 NaN NaN NaN NaN NaN
2016-01-06 NaN NaN NaN NaN NaN
2016-01-07 NaN NaN NaN NaN NaN
2016-01-08 -1.294747 -1.173184 -1.589022 -0.160165 -1.331808
2016-01-11 -0.719192 -1.417275 -0.621273 -1.118241 -1.070076
2016-01-12 -0.070449 -0.793204 -0.613639 -0.969437 0.946491
Open High Low Volume de
Date
2016-01-04 NaN NaN NaN NaN NaN
2016-01-05 NaN NaN NaN NaN NaN
2016-01-06 NaN NaN NaN NaN NaN
2016-01-07 NaN NaN NaN NaN NaN
2016-01-08 -1.294747 -1.173184 -1.589022 -0.160165 -1.331808
2016-01-11 -0.719192 -1.417275 -0.621273 -1.118241 -1.070076
2016-01-12 -0.070449 -0.793204 -0.613639 -0.969437 0.946491
4) 지정된 이동구간에 대해 반응변수와의 상관계수 계산
corOpen=dr.corr(d1['de'])
print(corOpen.tail(7))Open High Low Volume de Date 2017-03-22 0.794484 0.041950 0.408454 -0.167106 1.0 2017-03-23 0.429090 -0.106396 0.187640 -0.015958 1.0 2017-03-24 -0.664483 -0.688119 -0.551867 -0.425484 1.0 2017-03-27 -0.393969 -0.065968 0.059413 0.018278 1.0 2017-03-28 -0.356691 -0.213403 0.044578 0.440898 1.0 2017-03-29 0.055048 -0.086511 0.182659 0.122242 1.0 2017-03-30 -0.377367 -0.782739 -0.484168 0.133582 1.0
위의 자료에서 반응변수의 변화율에 대해 상관계수의 상관을 알아보자.
CloseChg=d1["de"].pct_change(1)
d2=pd.concat([corOpen['Open'], CloseChg], axis=1, join='inner')
d2=d2.dropna()
print(d2.head(5))
Open de Date 2016-01-08 0.625048 -0.011879 2016-01-11 0.476084 -0.002100 2016-01-12 0.495252 0.013444 2016-01-13 0.858780 -0.008490 2016-01-14 0.764442 -0.011126
plt.figure(figsize=(15, 7))plt.xlim([datetime(2016,10,1), datetime(2017, 4, 1)])plt.plot(d2.index, d2['de']*100, 'k', label='Close')plt.plot(d2.index, d2['Open'],'r', label='Op:Cl')plt.legend()plt.show()
댓글
댓글 쓰기