저번 포스팅에 이어서 전처리 작업을 해보겠다.
이번 포스팅해서 진행할 것은 첫번째로 20개를 그램으로 묶으며, 데이터를 정규화할 것이다.
우선 그램에 대해서 간단하게 설명하면 아래와 같다.
input data / target(예측)
a 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으로 분류############ f = 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 | #######노말라이제이션############ o = 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], (-1, 1))) 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개의 열로 구성되어 있는것을 확인할 수 있다.
'데이터분석 > with Python' 카테고리의 다른 글
[Python] LSTM을 활용한 비트코인 가격 예측 및 결과측정 (1) | 2018.03.06 |
---|---|
[Python] 비트코인 가격예측을 위한 학습 데이터 전처리 (3) (0) | 2018.03.06 |
[Python] 비트코인 가격예측을 위한 학습 데이터 전처리 (1) (0) | 2018.03.01 |
[Python] TA-Lib를 활용한 비트코인(주가)기술분석 보조지표 추가 (0) | 2018.02.17 |
[Python] API를 활용한 비트코인 가격(주가) 데이터 수집 (1) | 2018.02.16 |