해당 대회는 캐글의 Iowa 부동산 데이터를 바탕으로 집값을 예측하는 모델을 만든 것입니다

대회 링크: https://www.kaggle.com/c/house-prices-advanced-regression-techniques


*코드 복붙이 필요하신 분들은 제 커널 페이지에 가시면 됩니다


순서는 아래와 같습니다.


Step 1.

Data Explore


Step 2. 

Feature Engineering


Step 3. 

Modeling


*Grid search를 통한 hyper parameter 찾는 방법은 추후 포스팅에서 자세히 진행하도록 하겠습니다

** Gradient Boosting Regression, XGBoost, LightGBM 을 사용하였습니다.







해당 대회는 캐글의 Iowa 부동산 데이터를 바탕으로 집값을 예측하는 모델을 만든 것입니다

대회 링크: https://www.kaggle.com/c/house-prices-advanced-regression-techniques


*코드 복붙이 필요하신 분들은 제 커널 페이지에 가시면 됩니다


순서는 아래와 같습니다.


Step 1.

Data Explore


Step 2. 

Feature Engineering


Step 3. 

Modeling




















해당 대회는 캐글의 Iowa 부동산 데이터를 바탕으로 집값을 예측하는 모델을 만든 것입니다

대회 링크: https://www.kaggle.com/c/house-prices-advanced-regression-techniques


*코드 복붙이 필요하신 분들은 제 커널 페이지에 가시면 됩니다


순서는 아래와 같습니다.


Step 1.

Data Explore


Step 2. 

Feature Engineering


Step 3. 

Modeling





전처리는 거의 다 끝났고, 이제 학습 데이터와 테스트 데이터로 나눠보도록 하겠다.

비율은 보통 자율적으로 선택하지만 보편적으로 0.7~0.75사이로 학습데이터를, 그 나머지를 테스트 데이터로 부여하게 된다.


코드는 아래와 같다.


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
32
33
import numpy as np
import math
import csv
##train set : 3125개 , test: 1041개
= open("./20개씩묶고_컬럼별정규화.csv"'r', newline='')
rdr = csv.reader(f)
 
data = []
for j, i in enumerate(rdr):
    if(j!=0): #label 제외하고 읽어옴.
        data.append(i)
np.random.shuffle(data)
 
ratio = 0.75
count = int(math.ceil(len(data)*ratio))
print(len(data), count)
train = data[:count]
test = data[count:]
 
o1 = open("./trainset.csv"'w', newline='')
wr1 = csv.writer(o1)
for i in train:
    wr1.writerow(i)
 
o2 = open("./testset.csv"'w', newline='')
wr2 = csv.writer(o2)
for i in test:
    wr2.writerow(i)
 
f.close()
o1.close()
o2.close()
'''
cs


해당 코드를 실행시 4163개의 Train data, 3123개의 Test data로 나눠진 것을 확인할 수 있다.




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

이번 포스팅해서 진행할 것은 첫번째로 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개의 열로 구성되어 있는것을 확인할 수 있다.



저번 포스팅에 이어서 전처리를 마무리해보도록 하겠다.

코딩 전 엑셀로 정리를 해준 부분은 다음과 같다 


null 값이 들어있는 행을 모두 삭제하며, 그 전 보조지표로 추가했던 sma120을 삭제한다.

null값을 삭제하는 이유는 해당 데이터들이 있으면 제대로된 학습이 되지 않기 때문이며, sma120을 삭제하는 이유는 해당 지표를 변수로 쓰려면 

처음 119개 행들이 null값으로 출력되기 때문에 지나치게 데이터의 갯수가 줄어들기 때문이다. 


따라서 아래와 같이 정리해주게 된다.


정리를 해준 후, 각 행별로 타겟을 추가해주기 위한 코딩을 진행해준다. 

여기서 타겟은 해당 칼럼 기준으로 6, 12, 18, 24시간 뒤 가격을 타겟으로 쓰기 위해 해당 행에 맞게 칼럼을 추가해준다.

이해가 가지 않는다면 아래 그림을 보면 된다.


즉 우리는 low ~ signal까지의 칼럼으로 target 6, 12, 18, 24 칼럼을 예측하는 모델을 만드려 하는 것이다.


해당 과정을 진행하는 코드는 아래와 같다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import csv
 
#하루 4개씩 있어야됨, 6시간봉
= open("./중복제거최종데이터_전처리전.csv"'r', newline='')
rdr = csv.reader(f)
= open("./타겟추가데이터2_새로운방식.csv"'w', newline='')
wr = csv.writer(o)
wr.writerow(['time','low''high','open','close','volume','sma5','sma20''sma120''ema12','ema26','dn','mavg','up','pctB','rsi14','macd','signal','target_after6','target_after12','target_after18','target_after24']) # 필터 자리 놔둠
 
queue = []
for j,i in enumerate(rdr): #i는 행 값 (날짜부터 지표 다 포함)
    if(j!=0): #label 제외하고 읽어옴.
        queue.append(i) 
        if(j>4): #
            data = queue.pop(0# 1차원배열 
            data.append(queue[0][4])  # append 해서 옆쪽으로 붙인다 
            data.append(queue[1][4]) #4는 close 자리 
            data.append(queue[2][4]) 
            data.append(queue[3][4])
            wr.writerow(data)
 
 
f.close()
o.close()
cs


if문 안쪽 4번 칼럼은 close자리이고,  data.append(queue[0][4]) ~  data.append(queue[3][4]) 는 6시간~24시간을 뜻히는 것을 알 수 있다.

코드에서 볼 수 있는 것처럼 사이즈 4의 큐를 이용하여, 큐의 특성인 FIFO를 이용하여 순서에 맞게 종가를 새 칼럼으로 append 하였다. 




이번 포스팅에선 저번 포스팅에서 수집한 비트코인 가격 데이터에 모델 학습을 위한 변수를 추가하기 위해

기술분석에 쓰이는 보조 지표들을 추가해볼 것이다.


본 포스팅에서 필요한 라이브러리들과 설치법은  다음과 같다 


  • Pandas:   cmd창에서 pip install pandas 커맨드 입력후 설치
  • Numpy:   pip install numpy
  • Ta-Lib:    하단에서 설명
  • sklearn:   pip install sklearn


Cmd창은 항상 관리자 권한으로 열어야 한다는 것을 잊지말자.

TA-Lib같은 경우 이상하게 설치가 되지 않으므로 따로 웹사이트를 방문하여 다운받아줘야 한다



여기서 파이썬 버전에 맞는 것을 설치해주면 된다.

잘 모르겠다면 아래와 같이 입력하여 확인해볼수 있다. 

나는 3.5.4이고 (실수로)32비트 아나콘다를 설치하였으므로 cp35~win32.whl를 받으면 된다.

혹시나 이 글 보고 아나콘다를 설치해야 한다면 64비트로 설치하면 된다.


해당 파일을 파이선 워킹디랙토리에 넣고 pip install 파일명을 해주면 잘 설치가 되며, 설치 완료후에는 아래와 같은 화면이 뜬다.



이제 준비를 끝냈으니 TA-Lib와 보조지표들에 대해서 간단히 설명해 보겠다.

비트코인 가격을 분석할때 많은 트레이더들은 다양한 보조 지표들을 사용하며, 

차트는 심리의 반영이기 때문에 이러한 보조 지표들이 (일정부분) 맞아 떨어지는 경우가 많다.


비트코인 3시간 봉 - RSI를 볼때 과매수 영역으로 진입하고 있음을 알 수 있으며 RSI와 MACD가 상승하고 있다는 것은 매수가 붙고 있다는 것을 뜻한다


(더 많은 차트분석은 제 트레이딩뷰 퍼블리시에서 보실 수 있습니다)

이러한 이유로 보조지표가 유의미한 변수가 될 수 있다고 생각하였으며, 선택한 보조지표 리스트는 아래와 같다.

  • SMA5

  • SMA20

  • SMA120

  • EMA12

  • EMA26

  • MACD

  • RSI

  • BBANDS

그 외 다른 보조지표들은 깃허브 참고


해당 지표들을 추가하기 위한 파이선 코드는 아래와 같다.


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
32
33
34
35
36
37
38
39
40
import csv
import numpy as np 
import talib
import pandas as pd
 
 
df = pd.read_csv("./duplication_eliminated_bitcoin_data.csv")
df.head(20)
 
close = np.array(df[['close']])
close
 
##################################지표추가#######################################
 
df['sma5'= talib.SMA(np.asarray(df['close']), 5)
 
df['sma20'= talib.SMA(np.asarray(df['close']), 20)
 
df['sma120'= talib.SMA(np.asarray(df['close']), 120)
 
df['ema12'= talib.SMA(np.asarray(df['close']), 12)
 
df['ema26'= talib.SMA(np.asarray(df['close']), 26)
 
upper, middle, lower = talib.BBANDS(np.asarray(df['close']), timeperiod=20, nbdevup=2, nbdevdn=2, matype=0)
df['dn'= lower
df['mavg'= middle
df['up'= upper
df['pctB'= (df.close - df.dn)/(df.up - df.dn)
 
rsi14 = talib.RSI(np.asarray(df['close']), 14)
df['rsi14'= rsi14
 
macd, macdsignal, macdhist = talib.MACD(np.asarray(df['close']), 12269)  
df['macd'= macd
df['signal'= macdsignal
 
 
df.to_csv('./중복제거최종데이터_전처리전.csv', sep=',',na_rep='NaN')
 
cs

한 파이선 코드는 아래와 같

모든 보조지표는 종가를 매개변수로 받고 있으므로 우리는 종가(close)를 활용하여 보조지표를 추가해 준다



추가를 한 후 csv를 열어보면 잘 들어온 것을 확인할 수 있다. 

NaN은 아직 지표를 계산하기에 충분하지 못한 일수(ex 12일 이동평균선인데 12일보다 적게 데이터가 모여있음)이기 때문에 발생한 것이므로 

추후 분석시엔 NaN이 없는 지점부터 사용하게 된다.


다음 포스팅에선 해당 데이터들을 최종적으로 정리하여 전처리를 마무리하게 된다.

오늘부터 진행해볼 실습은 딥러닝을 통한 비트코인 가격 예측이다.

이를 위해서는 아래와 같은 프로세스를 통해 진행해 보겠다. 



따라서 오늘 진행할 것은 API를 통하여 비트코인의 과거 가격 데이터를 수집해보도록 하겠다 


우리가 API를 통해 받아올 거래소는 미국의 "Coinbase" 거리소이다. 

해당 거래소를 선택한 이유는 아래와 같다.


Coinbase (Gdax)

  • USDT가 아닌 USD를 사용 
  • 미국 내 거래량 1위 


Bitfinex와 Binance같은 거래소를 선택하지 않은 이유는 테더로 거래를 진행하기 때문이다. 

테더가 사실 우리가 진행할 예측에 크게 영향을 주진 않지만 때마침 테더 관련 이슈가 터진 상황이기 때문에 

향후에도 예측모델을 사용하기 위해 혹시모를 사태에 대비해 USD를 이용하는 Coinbase(Gdax)를 선택하였다. 


코인베이스의 API 설명 사이트는 이곳이며 클릭시 이동하게 된다.

해당 페이지에서 과거 데이터 수집을 위한 방법을 찾아보자.



대략적인 파라미터는 start(시작시간) 과 end(종료시간), 그리고 granulariy(몇시 봉으로 할건지)를 넣어줄 수 있다.

여기서 보여준 예시는 아래와 같다 


즉 종목과 TImeslice를 정해주면 지정해준 시간부터 지정해준 시간까지에 대한 데이터를 수집할 수 있다는 것이다.


Gdax는 UnixTIme을 쓰는데, 이는 우리가 쓰고있는 2018-02-16 이런 시간대신, 뭔가 다른 계산 프로세스를 통해서 시간을 표시하는 것이다.

해당 프로세스의 장점은 현실에서 2월은 30일까지 있고 3월은 31일까지 있고 이런 귀찮은 프로세스를 처리하지 않아도 자연스럽게 타임라인을

표시할 수 있다는 것이지만, 직관성이 매우 떨어진다는 단점을 가진다. 


자세한 시간계산 프로세스는 모르겠고, 우선 우리가 쓰는 시간을 Unixtime으로 바꿔줄 수 있는 코드는 아래와 같다. 


1
2
3
4
5
6
from datetime import datetime
 
def unixtime(t): #우리가 쓰는 시간을 유닉스타임으로 바꿈 
    temp = t.split('-')
    return int(time.mktime(datetime(int(temp[0]), int(temp[1]), int(temp[2])).timetuple()))
 
cs

활용 예시는 아래에서 다시 확인하겠다.


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
32
33
34
35
36
37
38
39
import gdax
from datetime import datetime
import csv
import time
 
#########데이터 수집################
public_client = gdax.PublicClient()
= open("./get_bitcoin_data.csv"'a', newline='')
wr = csv.writer(o)
 
granularity = 3600*6#3600*6 #6시간봉
interval = 3600*24*50
start_time = '2015-02-28'
last_time = '2018-01-17'
 
result = []
#for i in range(unixtime('2015-02-28'), unixtime('2018-01-17'), interval): #i는 15-02-28 ~ 18-01-17 이지만 (i, i+777600)(2015-02-28~2018-01-25까지) 뽑으니깐 오늘인 18-01-18까지 다 뽑아짐.
for i in range(unixtime(start_time), unixtime(last_time), interval): #i는 15-02-28 ~ 18-01-17 이지만 (i, i+777600)(2015-02-28~2018-01-25까지) 뽑으니깐 오늘인 18-01-18까지 다 뽑아짐.
    start = str(datetime.fromtimestamp(i)).split(' ')[0]
    if i + interval > unixtime(last_time): 
        end = str(datetime.fromtimestamp(unixtime(last_time) + 3600*24)).split(' ')[0# 이렇게 하면 새벽3시까지만 나오므로 18시간 뒤까지 뽑게 24시간의 초를 더해줌
    else:
        end = str(datetime.fromtimestamp(i+interval)).split(' ')[0]
    
    r = public_client.get_product_historic_rates('BTC-USD', start=start, end=end, granularity=granularity)
    for k in r:
        result.append([str(datetime.fromtimestamp(k[0])), k[1], k[2], k[3], k[4], k[5]])
 
    last_r_size = len(r) #마지막 넣을때 사이즈 - 예를들어 마지막에 12만 저장되면 
    print(last_r_size)
 
 
popped = result.pop(-1*last_r_size) #그냥 17일까지로 뽑으면 17일 새벽3시까지만 뽑힘. 그래서 하루 더 뽑은다음 제일 마지막 시간만 빼게 되면 17일 저녁 9시까지 뽑을수 있음 
print('del',popped)
for i in result:
    wr.writerow(i)
 
o.close()
##########################
cs

위 코드는 Gdax API를 활용하여 비트코인 과거 데이터를 뽑아온 것이다.

자세한 과정을 라인별로 설명하면 다음과 같다. 


우선 Gdax API를 사용하기 위하여 gdax를 import 해주고, 이를 csv 파일로 저장해주기 위한 코드 역시 삽입한다.


Granularity 는 3600 (한시간은 3600초) * 6을 하여 여섯시간 봉을 뽑아오게 된다.

Interval에 준 3600*24*50의 뜻은 한번에 뽑을때 50일치를 가지고 오는데 거기서 *4를 하니깐 200일치를 가지고 온다는 것이다.

즉 하루 4개(24시간 = 6시간 *4) * 50일치는 200개 봉.


그 아래 포문은 계속 뽑아오는 과정이고, 이 과정에서 한가지 짚고 넘어가야 할 것이 있다.

유닉스 타임을 사용해서인지 어떤건지 우리가 지정한 last_time이 전부 받아오는 것이 아닌, 해당 일의 새벽 3시까지 봉만 받아오는 문제점이 발생하였다.


따라서 last_time에서 하루를 더 받아온다음, 제일 마지막에 받아온 봉을 날리는 방법으로 우리가 원하는 last_time까지 데이터를 수집하기로 하였다.

해당 코드는 주석이 달린 부분에서 확인할 수 있다.


따라서 마지막까지 데이터를 다 받아온 후, 이에 대한 사이즈를 구해야 삭제하는 코드를 진행하였다. (result.pop~) 


해당 코드를 돌려보면 아래와 같이 뜬다. 



위에서 설명한 것처럼 200개씩 받아온 후, 마지막 행을 del을 프린트하며 삭제하도록 한다. 


받아온 csv파일을 열어보니 데이터 순서도 뒤죽박죽이고 무엇보다 중복된 데이터들이 있었다.

정확한 이유는 모르겠다. 아마 gdax api가 구려서 그런것 같은데.. 


여튼 이를 해결하기 위해 파이썬 딕셔너리를 사용하였다.


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
############ 중복제거##################   
= open("./get_bitcoin_data.csv"'r', newline='')
rdr = csv.reader(f)
dic = {}
for i in rdr: # 한줄씩 보겠다 
    key = str(i[0]) #0번인덱스 = 날짜 / 이걸 키로 설정함 
    value = str(i[1]) + ' ::: ' + str(i[2]) + ' ::: ' + str(i[3]) + ' ::: ' + str(i[4]) + ' ::: ' + str(i[5])
    #temp = str(i[0]) +' ::: ' + str(i[1]) + ' ::: ' + str(i[2]) + ' ::: ' + str(i[3]) + ' ::: ' + str(i[4]) + ' ::: ' + str(i[5])
    dic[key] = value
 
f.close()
 
= open("./duplication_eliminated_bitcoin_data.csv"'w', newline=''# 저장 
wr = csv.writer(o)
wr.writerow(['time','low','high','open','close','volume']) # 필터 자리 놔둠
 
for i in dic: # i 는 키 
    temp = dic[i].split(' ::: '# 딕셔너리는 랜덤하게 긁어옴 - 그래서 엑셀에서 정렬해줘야 
    temp.insert(0, i) #맨앞에 날짜 추가
    wr.writerow(temp)
    #wr.writerow(i.split(' ::: '))
 
 
o.close()
###########################
cs


파이선 자료형중 하나인 딕셔너리에 대해 간단하게 설명하면, 인덱스별로 짝을 맞게 삽입하여 인덱스를 입력하면 짝이 튀어나오도록 하는 것이다.

이 과정에서 중복되는 인덱스가 있으면(키) 둘 중 하나가 랜덤으로 삭제되게 된다.


csv파일을 보았는데 우리가 가진 데이터의 중복 튜플들은 소수점을 올림했냐 버림했냐 반올림했냐 등의 사소한 문제였기 때문에 뭐가 삭제되어도 

딱히 상관이 없으므로 그냥 딕셔너리에 삽입후 꺼내도록 한다. 


key는 0번 인덱스로 설정 - CSV파일을 TIme 칼럼을 뜻한다. 

그 뒤 해당 행의 가격 값들 (high, low, close, volum 등등등) 을 짝을 맞추어 딕셔너리에 삽입한다.(for i in rdr문) 

":::" 를 경계로 각 값을 붙였기 때문에 해당 값을 기준으로 다시 나눠주게 되고, 해당 행의 0번자리(제일 앞자리)에 i(날짜)를 추가하게 된다. (for i in dic문) 


이렇게 저장된 csv파일을 확인해보면 


이렇게 중복 데이터가 삭제된 것을 확인할 수 있다. 

물론 정렬은 안 된 상태여서 그냥 액셀에서 필터를 활용하여 오름차순 정렬을 하였다. 


이렇게 해서 API를 활용한 비트코인 가격 데이터 수집을 마치고, 

이제 모델 학습에 활용할 변수 획득을 위한 보조지표(기술분석을 위한 보조지표)를 추가하여 보겠다. 


+ Recent posts