728x90

2023-12-08 67th Class

XGBOOST를 이용한 종가에 가장 영향을 많이 주는 TA 지표 찾기

#️⃣ 테마주 선별?

[공유] 종목 빠르게 찾기(엑셀)_종목요약, 테마, 주요제품등 정리파일 (tistory.com)

#️⃣ XGBOOST

XGBOOST로 전체 TA 지표를 X, Close를 y로 학습시켜 y값을 찾기위해 가장 중요한 피처를 정렬하여 확인하였음
이 결과를 참고하여 actie ETF의 +alpha 수익을 위한 테마주 트랜스포머 주가 예측 모델의 feature을 조합해 테스트 할 것임

Pasted image 20231210074320.png


Transformer CrossAttention Model v1 개발

#️⃣ 모델 구조

  • linear_layers
    • (sequence_length-기준 날짜인 x일 , 동시에 보는 종목 개수 n개 x 선택 피처 개수 m개)의 데이터를
    • mlp로 (x, n)으로 축소하여 각 종목별 hidden states로 변환
  • performer_ticker
    • 종목간 어텐션 수행 (가로 어텐션)
    • 종목간에 중요도를 self attention함
  • performer_time
    • 시간단위 어텐션 수행 (세로 어텐션)
    • 시간간에 중요도를 self attention함
  • pos_embeding_ticker
    • 종목별 positional encoding으로 위치정보 계산
  • pos_embedding_time
    • 시간별 positional encoding으로 위치정보 계산
  • lstm
    • v1에서는 안씀
  • forward의 outputs.mean
    • 최종 결과를 1st dimension기준 평균값을 구함

#️⃣ 학습 기준

class Config:  
    device = get_device()  
  
    # data  
    base_dir = '../../data/tf_dataset/'  
    file_paths = ['20_SK이노베이션_2010.csv',  
                  '51_롯데케미칼_2010.csv',  
                  '43_대한항공_2010.csv',  
                  '225_아시아나항공_2010.csv']  
    # file_paths = ['20_SK이노베이션_2010.csv', '51_롯데케미칼_2010.csv']  
  
    # file_paths = [base_dir+i for i in file_paths]    n_files = len(file_paths)  
  
    use_cols = ['Open', 'High', 'Low', 'Close', 'Volume',  
                'Change', 'pct_change', 'volume_adi', 'volume_obv', 'volume_cmf']  
  
    len_feature_columns = len(use_cols)  
    label_columns = [3]  
    n_labels = len(label_columns)  
  
    shuffle_train_data = True  
  
    train_data_rate = 0.8  
    test_data_rate = 0.2  
  
    # train  
    predict_day = 1  
  
    input_size = 40  
    output_size = 4  
  
    dropout_rate = 0.2  
    seq_len = 10  
    heads = 8  
  
  
    batch_size = 8  
    learning_rate = 0.00001  
    epochs = 300  
    random_seed = 42  
  
    do_continue_train = False    # 每次训练把上一次的final_state作为下一次的init_state,仅用于RNN类型模型,目前仅支持pytorch
  • file_paths: 테마주 목록 (이부분에 리스크 테마주 목록을 넣고, 이것이 학습대상임)
  • use_cols: 사용 지표 (open~pct_change는 필수로 포함하고, 그 이후의 ta지표는 xgboost에서 나온 features importance를 활용해 여러가지 경우의 수 조합으로 테스트해보아야 함)
  • label_columns: 예측할 y의 column index 리스트( 3이면 close), [1, 2, 3]이면 [high, low, close]
  • predict_day: 예측일 수 (직전 seq_len일수로 향후 1일 예측)
  • seq_len: 기준일 수 (예측하기위해 기준 input으로 들어가는 날짜, 10일보고 1일 예측)
  • heads: CrossAttn 모델의 트랜스포머의 head 개수 (지금은 연동 안되어있음, 이 dim_head와 heads, dim을 잘 조절해서 최적의 파라미터를 찾는 테스트가 필요함)

v1 기준 head

self.performer_time = Performer(  
    dim=config.n_files,  
    depth=4,  
    heads=int(config.n_files/2),  
    dim_head=4,  
    causal=False  
).to(config.device)
  • 종목이 4개일때는 학습후 loss가 낮아서 적당했음
  • epoch: 299 loss: 0.0038085797713279935
  • 종목이 늘어날 때는 변동이 생길 수 있으니
  • 2배씩 곱하거나, 잘 조정해서, 이것처럼 과적합이 아닌 선에서 낮은 loss가 나오게 하면 됨

다음 주에 할 일

#️⃣ To Do List

[1] 트랜스포머 모델 시각화 자료 제작 & 하이퍼파라미터 튜닝

  • 모델 아키텍처 그림 그리기 필수(윤하야 부탁해✨)
    https://jaeminyoo.github.io/resources/slides/YooSPK21.pdf
    https://www.notion.so/Accurate-Multivariate-Stock-Movement-Prediction-via-Data-Axis-Transformer-with-Multi-Level-Contexts--a1d3022fe01245c3b4c91d9cca0f8601
    참고
  • train, validation 으로 구분해서 early stopping 코드 작성
  • test set에 대한 visualization 코드 작성 (윤하 베이스코드 활용해서 할 수 있을 듯)
  • 모델 save & load 코드 작성 - 모델 저장시 config 반드시 함께 저장, -> 버전별 관리 필수
  • feature importance 조합으로 트랜스포머 모델의 피처 경우의 수 테스트
  • 테마주 목록 조합으로 트랜스포머 모델의 file_paths 일일 종가 거래 대상인 테마주 변경해가며 테스트
    • 테마주 선정은 대장주만으로 구성할지
    • 크롤링해서 모든 테마주를 전부 포함할지
    • 그외 다른 아이디어로 선정할지 3가지 경우의 수를 모두 테스트해서 버전별로 모델과, 학습대상과, config에 설정된 하이퍼 파라미터 전부 버전관리 필요
    • github에는 모델 업로드 하지 말것 -> 용량 없음
  • LSTM, RNN등 다른 모델 univariate(변수1개, 종목1개) 학습 코드 작성 및 CrossAttn 모델과 비교 시각화 자료 제작
    • LSTM 모델로 종가 1개로 1종목 모델 1번 2번 총 2개 학습시키고
    • CrossAttn 모델에서 여러 feature로 2종목 모델 1개를 학습시켜서
    • 두 개의 종가 예측 performance 비교하는 csv 생성
    • python에서 시각화까지 해서 자료 저장하여 ppt에 첨부
    • 종가 1개 1종목 트랜스포머 모델과도 비교
    • 시간이 되면 RNN도 비교하여 4종 모델의 주가 예측 퍼포먼스 비교

[2] 일일 종가매매 수익률 계산기 개발

  • 다음 날의 예상 종가가 +면 매수, -면 매도로 3시 20분에 일괄 거래되는 종가매매 거래방법으로 계산
  • 모든 테마주를 동일한 비율로 매도할지, 가격을 반영해 가장 큰 수익율을 내는 것기준으로 n개만큼만 거래 할지 여부는 테스트해봐야함
  • 매도는 떨어지면 무조건 매도하는 것으로 하는 것이 제일 공수가 적게 들 듯
  • 최대한 빠르게 개발할 수 있는 단순한 알고리즘으로 계산해서 전체 테마주의 일일 수익률의 상계 가격을 시간단위로 나와야함
  • 이 값을 민지가 시각화 대시보드에 수익률 곡선으로 그릴 수 있도록
날짜 수익률
23.8.1 0.5%
23.8.2 -1.2%
23.8.3 0%
23.8.4 2.8%
  • 이런식으로 나오면 수익률 곡선 시각화가능

[3] ETF 검증

  • 클러스터링 한 결과로 ETF 구성 해서 아래의 두 링크 참조하여 현대 포트폴리오 이론 및 샤프지수등으로
  • 포트폴리오 검증하는 코드 작성 및 시각화
  • 날짜별로 혹은 기간별로라도 수익률 혹은 수입 계산해서 표+시각화 자료 제작 필수
  • 목표 1년 수익률 5% 기준으로 유사한 결과 나오도록 할 것
  • 보유 포트폴리오로 목표수익률 달성이 어려울 시 국채, 미국국채 섞어도 무관

파이썬으로 최적의 포트폴리오 비율 찾기 (한국 주식,국채 + 미국 주식,국채)

python 증권데이터 분석 - 현대 포트폴리오 이론, 효율적 투자선 python 구현

[4] 태블로 ETF 대시보드 구축

  • 주요 메타데이터 (ETF내 포트폴리오 종목 개수, x월x일 기준 평균 주가, 1좌 가격 등) 제일 상단에 노출
  • 자산구성 파이차트 1개
  • 구간별 수익률 표 1개
  • 수익률 곡선 1개
  • 는 포함하고, 기타 항목은 서치를 통해 추가
반응형