본문 바로가기

주식 데이터 모델링

딥러닝으로 주식 예측하는 논문 구현 [Stock Market Prediction on High-Frequency Data Using Generative Adversarial Nets] - 5. 구현(3) - 전체적인 구현

 이번 글은 논문 전체 구현 부분 입니다. 지난 글을 올리고 나서 열흘이나 지난 이유는, Rolling Segmentaion 등의 부분을 각각 포스팅 하기도 애매해서 그렇습니다. 모델에서 사용하는 파라메터 중 일부분은 논문을 그대로 적용시켰고, 큰 변화를 준 부분은 없습니다. 그 외 적혀있지 않은 부분은 제가 임의로 적용시켰구요. 

 논문과 제 구현의 가장 큰 차이점은, 사용한 데이터가 '분 단위' -> '일 단위' 라는 것입니다. 그래서 그런지 모델이 잘 작동하지 않았습니다. 애초에 목적이 이 논문을 구현해서 돈을 벌려고 한 것은 아니므로, 상세한 파라메터 조정은 각자의 몫으로...

 코드 전체를 글에 포스팅 하기에는 공간을 많이 차지 하기 때문에, Github로 공유하도록 하겠습니다. 그리고 설명이 필요한 부분만 코드와 함께 글을 작성하도록 하겠습니다.

 


 Rolling Segmentaion 구현 하는게 은근히 생각할 요소가 많았습니다.

 이미지를 이용해서 훈련을 시킬때는 보통 전체 training set에서 batch size만큼 이미지를 가져옵니다. 주식 같은 시계열 데이터를 훈련 시킬때 가장 쉬운 방법은, 전체 training set에서 훈련시킬 T 길이 만큼의 데이터를 가져오곤 합니다.

 근데 이번 논문에서 사용하는 방식은 다릅니다. 제가 해석해서 구현한 방식은 다음과 같습니다.

 

1) Batch size 갯수 만큼 주식을 불러온다. (Batch size가 8이면 주식 8개)

2) 주식 데이터의 맨 처음부분 부터 M+N 만큼의 데이터를 N 크기 만큼 이동시키며 훈련시킨다.

 

 위의 방법을 요약해둔 코드 입니다. 

def random_stock_generator(path_dir, batch_size, M, N) :
	
    ...

    while True :
        stock_batch = np.zeros(shape=(batch_size, seq_len, n_features))
        for i in range(batch_size) :
            idx = np.random.randint(file_length)
            stock_batch[i] = np.load(path_dir + "/" + file_list[idx])
            
        for j in range(num_stock_size) :
            data = stock_batch[:, N*j: (N*j + M+N) , :]
                
        yield data

 

 python의 generator를 이용해서 훈련시킬 때 마다 원하는 데이터를 출력하도록 했습니다. 그리고 GAN에서 훈련을 시킬때는, 따로 처리를 해줬습니다. 

 제가 이해한 바로는 이렇습니다. 논문의 실험을 예시로 들어보겠습니다. M=20, N=10 이고 T=242분 인 실험의 경우에, M+N 만큼의 데이터 내부에서 M 크기 만큼만 훈련에서 사용합니다. M 크기 만큼의 데이터에서 T 크기 만큼의 데이터를 만들어서 훈련을 하게 되겠죠. 저는 M크기의 데이터에서 T만큼의 데이터를 무작위로 만드는 코드를 다음과 같이 작성했습니다.

 

...
for k in range(num_iters) :
	_max_T = M-T-1

	idx_T = np.random.randint(_max_T)
	x = train_set[:, idx_T:idx_T+T, 1:].astype(np.float32)
	y_pre = train_set[:, idx_T:idx_T+T, 0].astype(np.float32)
	y_ = train_set[:, idx_T+T+1, 0].astype(np.float32)
...

얼추 이해가 되시나요? GAN에서 입력이 필요한 부분이 세가지 부분 입니다.

 1) 0~T 시점의 기술적 지표 -> G모델의 input

 2) 1~T 시점의 주식의 종가 -> G모델의 output 또는 T+1 시점의 주식 종가와 결합 하여 D 모델의 input

 3) T+1 시점의 주식의 종가 -> (2) 데이터와 결합하여 D모델의 input으로 사용

 


GAN 부분 코드

 그 외는 저런식으로 코드를 작성해두었습니다. GAN 코드도 어렵다면 어렵겠지만, 인터넷에 깔끔하게 설명해주신 글들이 많기 때문에 저의 설명은 생략하겠습니다. 가능하다면 실험결과 까지 올려서 마무리하고 싶긴 합니다...