-
프로젝트 준비
주가 예측 모델 툴킷 제작및모델 설계(LSTM 기반) 진행- 손실 함수(CrossEntropyLoss) 및 평가 지표(Accuracy) 설정
- 데이터 수집은
StockDatabase프로젝트를 바탕으로metadata파일을 제작하는 방식으로 진행
-
데이터 분석 및 전처리
-
look-ahead period,look-back period설정 및Window Warping방식을 바탕으로 데이터를 선정 -
Feature 들에 대하여
Non-Stationary 데이터가 되도록 스케일링 방식 적용 -
회귀 모델을 위한 분석
-
데이터 분포 분석
결과값 확대 및 축소 함수(log 및 sqrt 공식)를 적용하여 다음과 같이정규 분포 형태의 데이터 분포로 구성Shapiro-Wilk 검정을 진행한 결과, 정규분포와 균등분포가 아님을 확인균등분포 (Uniform Distribution)에 가깝도록 데이터를 선정하여 분포를 변환하였고QQ Plot를 통하여 검증
-
데이터 수치가
lower boundary와upper boundary를 벗어나는 경우, 제외하지 않고clipping하는 방식으로 데이터를 보존 -
위 방법들을 시도해보았지만, 회귀 모델에 대한 성능이 비교적 떨어져
분류 모델로의 전환을 진행하였음
-
-
분류 모델을 위한 분석
- 데이터 단순화
- 가격 보조지표를 활용하여 상승폭과 하락폭을 비교하여 더욱 변동이 있는 방향으로 결과값이 분류(
Bearish,Bullish)되도록 라벨링을 진행하였음
- 가격 보조지표를 활용하여 상승폭과 하락폭을 비교하여 더욱 변동이 있는 방향으로 결과값이 분류(
- 데이터 단순화
-
도메인 지식 적용
- 데이터 선정 알고리즘 이외에도
변동성 차원에서의 지표 조건을 추가하여 데이터 선정 - 데이터 학습할 때,
액면분할,액면병합등에 의해서액면가가 변화하는 것이 반영되지 않은 데이터의 경우에 대한 예외처리 진행 - 주가 데이터의 복잡성을 단순화할 가격 보조지표 적용 진행
- 모델의 결과값을 바탕으로 전반적인 시황 분석이 가능하도록 통합 진행
- 데이터 선정 알고리즘 이외에도
-
-
모델 학습 및 하이퍼파라미터 튜닝
LSTM->Dropout->LayerNorm->FC->Dropout->BatchNorm->FC으로 모델 구성- 학습률, Epoch, RNN 레이어 개수, Hidden Dimension 에 대한 하이퍼파라미터 튜닝 진행
warmup steps에 관련된 실험 진행 및 전체 epoch 에 대한 step size 의 약 10% 가량으로 설정 후 진행
-
성능 평가
주가 데이터 수집(보조지표 포함)과 metadata 형식으로전처리 과정진행주가 분석 모델 툴킷 제작및모델 설계(LSTM 기반) 진행하이퍼 파라미터 설정및 학습 진행
- 70~100 epochs 를 최종 목표로 하고 있는 도중, 10, 20, 30 epochs 일 때의 Training 과 Validation 에 대한 MSE 와 Loss 를 보면서 모델 품질에 대하여 판단하는 중이다.
- 그 결과, Training 에 대해서는 MSE 가 대폭 줄어들고 있지만, Validation 에 대해서는 MSE 가 줄고 있지 않는
과적합 상태를 발견하였다.
- 현재 metadata.txt 에서 시장과 종목 코드를 기준으로 정렬하게 해두었는데, 이로 인하여 Validation 데이터셋 쪽에 변동폭이 큰 종목들이 대거 들어가게 되어 그렇게 된 것 같다.
-
가격 움직임에 대하여 변동성이 큰 종목과 변동성이 작은 종목에 대한 비율이 비슷한가?
- 변동성에 대한 지표를 바탕으로 변동성이 큰 종목과 변동성이 작은 종목에 대한 비율을 조사한다. 이것도 히스토그램으로 얼마나 분포되어 있는지 확인할 수 있어야 함.
-
수익률이 기존 가격에 근접한 종목과 큰 수익을 달성하는 종목의 비율이 어떻게 구성되어 있나?
- 히스토그램을 바탕으로 수익에 있어서 10% 단위에 대하여 데이터의 분산을 확인한다.
- 만약, 비율이 다르다면 어떻게 진행하는 것이 좋을 것 같나?
- 일단, train 과 validation 데이터를 골고루 분산시키는 것이 좋겠다. metadata.txt 에 있는 데이터들을 기반으로 각 데이터들에 대하여 sort 를 진행하고 만약 train 과 validation 사이의 관계가 10:1 이라면 (전체데이터개수)/11 (=x) 을 계산하여 10x 를 train 데이터에 넣고, x 를 validation 데이터에 집어넣는 방식으로 진행.
- 비교적 변동성이 큰 종목의 데이터 개수가 모자랄 것이라는 생각이 든다. 이에 대하여 데이터 개수가 부족한 부분에 대하여 데이터 증강을 통하여 접근할 수 있도록하면 좋겠다는 생각을 하였다.
-
데이터 증강의 경우, 정확하게 어떤 방식을 선택할 것인가?
- 현재, Time Domain 에 있어서 기본적으로 제안하는 증강 기법은 Window cropping or slicing, Window warping, Flipping, Noise injection, Label expansion 정도가 있다. 나에게 적합한 방식은 Noise Injection 가 될 것 같다. 노이즈로는 gaussian noise, spike, step-like trend, and slope-like trend 정도가 있다고 한다. 최종적으로 gaussian noise 를 적용할 예정이다.
- 당장에는 시계열 데이터의 증강을 적용하므로써 생길 데이터의 변질이 우려되어 적용하고 있지 않는 중이다.
-
결론
random.shuffle함수를 바탕으로 변동성이 큰 종목이 몰려 있는 validation 데이터셋과 training 데이터셋을 섞는 것을 목표로 하였음.- 위 방법을 통하여 Training Set 과 Validation Set 의 MSE 가 엄청나게 많이 차이나는 현상을 해결할 수 있었음.
-
결과층 데이터가
특정 구간에 몰려 있는 것을 확인 / 이러한 부분이데이터 불균형을 뜻하고학습 평가 검증이 다소 어려워질 수 있음 -
따라서,
결과값 확대 및 축소 함수(log 및 sqrt 공식)를 적용하여 다음과 같이정규 분포 형태의 데이터 분포로 구성할 수 있었다. -
데이터 분포의 문제를 해결할 수 있어 당장에는 Data Augmentation 을 적용하지 않고 학습을 진행하고자 한다.
- 데이터 수는 약 160만 개로 충분히 커버가 가능할 듯 보인다.
CNN + RNN결합한 모델을 바탕으로 학습을 돌려본 결과, 생각보다 좋은 성능이 나오질 않았다.평균 약 5~6% 내외의 오차율을 보임 /MSE 1000,MAE 28- 평가지표의 경우, 결과층에 의도적으로 Scaling 을 진행하지 않아 이런 결과가 나오게 되었음. (뒤에 모두 비슷한 스케일의 검증 결과가 나올 예정임)
- 이후,
LSTM을 바탕으로Layer Normalization 기법까지 적용하여 모델을 구성하였고 학습을 시작할 수 있었다.
- 모델 구조를 바꿨음에도
MSE 가 1000 부근으로 예상보다 높게 나옴으로하이퍼파라미터 설정과스케일링 방식을 변경하기로 하였다. - 학습률, Epoch, LSTM 레이어 개수, Hidden Dimension 에 대한 하이퍼파라미터 튜닝을 진행하였다.
- 마지막 종가를 바탕으로 모든 수치를 계산하지 않고
전날 종가를 기준으로 수치를 스케일링하여 변환하였다.
- 새롭게 결과층에 변환된 값을 해제하는 공식을 적용하여
PriceMeanSquaredError평가지표를 바탕으로PMSE 가 39.19정도가 나왔다.- 20 Epochs 에
PMSE 가 39.19(이전 MSE 와 기준이 다름) 정도가 나오며 평균적으로약 6.2% 의 오차를 가지고 있다는 것을 알 수 있다.- (23.8.25) 위의 평균 6.2% 의 오차라는 것은 데이터 분포가 한 쪽으로 너무 많이 몰려 있어 나온
편향(bias)된 검증 결과이다. 따라서,데이터 분포 변환의 필요성을 느끼게 됨.
- (23.8.25) 위의 평균 6.2% 의 오차라는 것은 데이터 분포가 한 쪽으로 너무 많이 몰려 있어 나온
- 20 Epochs 에
- 이전의 CNN + RNN 결합한 모델과 그렇게 큰 차이를 보이진 않는 것으로 보여,
LSTM 모델을 바탕으로 진행하고자 한다.
- 스케일링 방식을 바탕으로 Feature 들에 대하여
Non-Stationary 데이터가 되도록 변경할 것이다. 하이퍼 파라미터 튜닝을 계속하여 진행할 것이다.
- 스케일링 방식을 변형하여 모든 데이터들에 대하여
Non-Stationary 데이터로 변환하였음. - 이전 데이터셋은 모양만 정규분포와 유사하였고,
Shapiro-Wilk 검정을 진행한 결과, 정규분포가 아님을 확인하여 이에 대한 데이터 선정 알고리즘을 적용하고자 함. - 전처리 방식 변경
- 출력층 기준 변경 (look-ahead period)
- 데이터 선정 알고리즘 이외에도
변동성 차원에서의 지표 조건을 추가하여 데이터 선정 (도메인 지식 적용)
- 하이퍼 파라미터 설정 진행 중에
warmup steps에 관련된 실험을 진행 중이다.warmup steps를 전체 step size (모든 epochs) 의 약 10% 가량으로 설정한 것과 그것보다 훨씬 적게 약 1% 가량으로 설정하는 것과의 차이를 비교해보았다.- 그 결과,
후자의 경우가 MSE 에 있어서 비교적 빠르게 수렴하는 것을 확인할 수 있었다. - 예상되는 이유로는
warmup steps가 많을 경우, 초반에 빠르게 학습하지 못하여 이후 전체 학습이 느려지는 이유인 것 같고, 추가적으로 초반에local minima가 발생할 수 있다는 점 때문이다. - 따라서, 빠른 수렴 이후 안정성까지 어느 정도 조화를 이루는 적절한
warmup steps수치를 정하는 것이 좋겠다. - 결과적으로는 전체 epoch 에 대한 step size 의 약 1% 가량으로 설정 후 진행하고자 한다.
- 데이터 수치가
lower boundary와upper boundary를 벗어나는 경우, 제외하지 않고clipping하는 방식으로 데이터를 보존하였다. - 출력층 기준 변경 (look-back period, look-ahead period)
- 출력층 산정 방식 변경 (수식을 바탕으로 상승 확률로 표현)
- 현재 부정부터 긍정까지
0 ~ 100사이에서 표현(서비스 상에서)하도록 하였고,평균 오차 목표를전체의 10%정도로 잡았으며, 이에 따라PMSE가25정도가 되는 것이 목표이다.- (23.8.31) 현재,
-1 ~ 1사이의 출력 목표 기준으로0.1정도의 오차를 허용하며최종 목표 MSE는0.01로 재설정하였다.
- (23.8.31) 현재,
- 학습 중 Loss 가 줄어들지 않고 있는 상황임을 발견하였다.
- 모델 구조 변경 시도 (
Transpose,Dropout,Linear,Xavier Uniform,RReLU등 다방면으로 적용 시도) - Scaling 기준 변경 (입력값은
-1 ~ 1로 스케일링하였고, 출력값은0 ~ 1사이로 스케일링 진행)- 따라서,
목표 MSE는 출력층 데이터에서의0.1 정도 오차이기 때문에0.01로 재설정
- 따라서,
- 모델 구조 변경 시도 (
- 위 시도를 통하여, 이전과 비교하여
Loss 가 수렴하는 것을 확인하여발산에 대한 문제를 해결할 수 있었다.
- 평가지표를
MSE에서MAE로 변경하였다.- 따라서, MAE 목표치는
0.1로 정리 가능하다.
- 따라서, MAE 목표치는
- 데이터 학습할 때,
액면분할,액면병합등에 의해서액면가가 변화하는 것이 (불가피하게) 반영되지 않은 데이터의 경우에 대한 예외처리를 진행하지 않는 것을 발견하여 이에 대한 예외처리를 진행하였다.
- 이전까지 회귀 분석을 진행하여
0 ~ 1사이의 값으로 매핑을 진행하였지만 생각보다 성능이 나오지 않았고, 직관적인 분류를 위하여CrossEntropyLoss기반 분류 모델로 변환하였다.- 전반적인 시황 분석을 위한 목적 달성을 위하여 모델 복잡성을 낮추었다.
- 분류의 경우, 현재에는
Bullish,Bearish로 구분 짓도록 하였다. - Validation 데이터셋에 대한 정확도 목표는 약 80% 로 설정하고자 한다.
- 위 정확도는 불가능한 목표였음. 자세한 내용은 링크에서 확인할 수 있음. (55% 달성하기도 힘듦)
- 현재 수집한 데이터에 대한
seq_lengths및데이터의 복잡성이 충분히 모델을 학습시킬만큼 직관적이지 않아 이에 대한 피드백을 진행하고자 한다. - 주가 데이터의 복잡성을 단순화할 지표 적용 또한 진행할 것이다.
-
Bullish와Bearish로의 이진 분류를 위하여 단순하게 보조지표의 상승 또는 하락에 따라 매핑이 되도록 진행하였다. -
look-ahead period,look-back period재설정 진행- 약
1개월동안의 데이터를 바탕으로보름 후의 가격 방향을 예측하는 방식이다. look-ahead period의 경우에는, 너무 짧은 경우 정확도가 잘 나오지 않았다.look-back period의 경우에는, 너무 긴 경우 정확도가 잘 나오지 않았다.
- 약
-
모델의 경우,
LSTM모델 기반으로CrossEntropyLoss를 통한 학습이 가능하도록 구성하였다. -
하이퍼파라미터 설정 진행
Learning Rate,Decay Ratio,Warmup Steps,Dropout설정 진행
- 모델 구조 개선 완료
LSTM->Dropout->LayerNorm->FC->Dropout->BatchNorm->FC으로 모델을 구성하였다.- 모델 레이어 순서를 바꾸고 가중치 초기화 방식을 레이어에 맞게 (
ReLU->He,tanh->Xavier) 설정해주었더니 비교적 불안정한 학습을 개선(수렴의 속도)할 수 있었다. - Momentum 계수 설정 완료 (0.99)
- 전처리 방식 개선 완료
DIV-EACH-CLOSE방식으로 데이터를 전처리를 하되, 보조지표를 조합하여 별도의 개념을 추가하여 학습에 도움되도록 하였다.- 추가로,
MinMaxScaler방식을 적용하였다.
- Warmup Steps 수치 수정
- 1% -> 10%
- 정확도 목표 재설정 진행
- 계속해서 하이퍼파라미터 설정 및 데이터 전처리를 진행했음에도 성능이 나아지지 않아 벤치마킹할 성능을 찾아보았다.
- 해당 링크 내용(21년 기준 정확도 57.4% 가 신기록 달성)을 벤치마킹(″55% 정도만 돼도 굉장히 잘한다는 것″) 삼아 Validation Dataset 에 대하여
55%를 달성할 수 있도록 한다. - 평균적인 포트폴리오 운용의 관점으로 보는 것이라 검증 결과가 50% 이상인 것만 해도 손실이 아니라는 것이 핵심적인 내용이다.
- 해당 모델을 바탕으로 전체 시장에 대한 단기 시황을 보는데에 사용하고자 한다.
-
학습 완료 및 모델 저장
- 총 12 Epochs 에 대한 학습을 진행하였고, 이에 대한 검증 결과 Training Dataset 에 대한 정확도는
59.7%, Validation Dataset 에 대한 정확도는59.1%의 결과가 나오게 되었다. - 목표치인
55%에 비해59.1%로 약약 7.5% 향상된 성능을 구성할 수 있도록 하였다. - 결과가 높게 나온 이유로는 데이터 세팅에 대한 차이가 큰 이유라고 생각한다.
- 실제로, 전체 주식에 대한 방향성을 예측하는 것이 아닌, 수급과 변동성이 다소 있는 종목의 방향성에 대해서만 예측을 진행한다는 점이 해당 링크 실험 전제와 다르다고 할 수 있겠다.
- 모델의 경우, 약
5MB로 모델 경량화에도 힘을 쓰게 되었음.
- 총 12 Epochs 에 대한 학습을 진행하였고, 이에 대한 검증 결과 Training Dataset 에 대한 정확도는




