저번 포스팅에 이어서 전처리 작업을 해보겠다.

이번 포스팅해서 진행할 것은 첫번째로 20개를 그램으로 묶으며, 데이터를 정규화할 것이다.

우선 그램에 대해서 간단하게 설명하면 아래와 같다.


input data   /  target(예측)

   b    c          d

b    c    d          e

c    d    e          f


이런식으로 일부분은 중복되지만 완전히 중복되지 않는 인풋데이터를 확보하여 예측값을 구하는 것으로

이번의 경우에는 데이터가 충분하지 않기 때문에 사용하게 된 방법이다.

R실습에서 진행하였던 디시전 트리의 앙상블과 비슷한 개념이라고 할 수 있다.


그램에 대한 코드는 아래와 같다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import csv
import numpy as np
from sklearn.preprocessing import MinMaxScaler
import warnings
warnings.filterwarnings("ignore")
 
########20gram으로 분류############
= open("./타겟추가데이터2_새로운방식.csv"'r', newline='')
rdr = csv.reader(f)
 
list = []
for i in rdr:
    list.append(i)
list.pop(0#제목줄 지우기
print(len(list))
 
gram_20 = []
for i in range(len(list)+1-20):
    gram_20.append(list[i:i+20])  
gram_20 = np.array(gram_20)
#print(gram_20)
#print(gram_20.shape)
print(gram_20[0].shape)  ## 20개씩 묶어서 진행 - 4163 번 진행 20행 21열 (스샷참고) = 5일  
###########################

o.close()
f.close()
cs


20개씩 묶은 이유는 한 행에 5일치에 속하는 데이터들을 묶기 위함이며(하루에 4bars * 5 일 = 20bars)

해당 그램을 사용해야 뜨는 타임라인이 없이 6시간봉마다 예측을 진행할 수 있다. (우리는 마감시 기준 6, 12, 18, 24시간 뒤 가격을 예측할 것이다)



해당 코드부분만 실행해보면 20행 21열이며 4163번 진행하였음을 알 수 있다. 


이제 칼럼별로 정규화를 진행하겠다.

참고로 우리가 예측할 것은 순수한 가격이 아닌 ratio 즉 가격의 변화율을 예측할 것이며, 이를 close와 곱하여 가격을 유추해낼 것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#######노말라이제이션############
= open("./20개씩묶고_컬럼별정규화.csv"'w', newline='')
wr = csv.writer(o)
title = ['time','low''high','open','close','volume','sma5','sma20','ema12','ema26','dn','mavg','up','pctB','rsi14','macd','signal']*20 #20일치
title.append("lastday_close")
title.append('after6ratio')
title.append('after12ratio')
title.append('after18ratio')
title.append('after24ratio')
wr.writerow(title)
 
scaler = MinMaxScaler(feature_range=(0,1)) #scaler 선언
for i in gram_20:
    close = np.array(i[-1][4], np.float64) # -1은 마지막 인덱스를 뜻함 여기서는 19 
    target = np.array(i[-1][-4:], np.float64) # 뒤에서부터 네 개 값 계산해서 타겟으로 넣음 
    ratio = target/close
    
    for j in range(1, i.shape[1]-4): #날짜다음부터 체크해서 타겟4개 제외. / 현재 종가부터 
        col = scaler.fit_transform(np.reshape(i[:,j], (-11)))
        col = np.transpose(col) # 이걸 다시 열로  바꿔서 그대로 붙임 
        i[:,j] = col # 붙임 
    
    #break
    data = i[:, :-4# 타임까지 포함해서 타겟 열 전까지 가지고와서 (ratio 다 떄고 그래서 20 행 17 열 )
    data = np.reshape(data, (-1)) #각 행을 짤라서 하나의 긴 행으로 바꿈 - 1차원 배열로 알아서 펴줌 즉 한게의 긴 행 상태로 바꿈    =  20 * 17 = 340 
    data = np.append(data,close)  # close 1열 추가 
    data = np.append(data,ratio) #  나중에 close 와 ratio 를 곱해가지고 실제 예측 가격 파악가능  - ratio 4개 추가  - 총 345 열 
    
    wr.writerow(data) 
cs


코드를 라이별로 간단하게 설명하면 close는 그램으로 묶은 20행중 마지막 행의 close를 담게 된다.

또한 target은 동일한 행의 마지막 4개 열(after 6 ratio ~ after 24 ratio)


그 후 각 데이터들에 대한 정규화를 진행하게 되며(타겟은 제외하고) 

한 개의 그램에 20행 21열로 구성이 되어 있는것을, 마지막 4개 열을 제외하고 하나의 행으로 길게 늘어뜨리게 된다.

해당 과정을 진행하면 20*17(20행*17열을 한개의 행에 길게 늘어뜨림) 340행이 나오게 되며, 해당 과정이 끝나면

close와 ratio(close -1열 + ratio - 4열 = 총 5열 추가) 한 행당 345개의 열을 가지게 된다.


두번째 포문에 대한 설명을 조금 더 하자면 

i = 

1 2 3 4 5 6 7 

2 3 4 5 6 7 8 

3 4 5 6 7 8 9 

일 때,


i [ : , : -4] 면  

1 2 3 

2 3 4 

3 4 5 


와 같이 선택하는 것이다.

즉 뒤에 4개를 빼고 묶는다고 생각하면 된다.


해당 csv 파일을 열어보면 한 행이 345개의 열로 구성되어 있는것을 확인할 수 있다.



+ Recent posts