안녕하세요.
오늘은 11월이 되기도 해서 10월 투자 중인 자산배분, 메타 주식별 분석
자동화 트레이딩 중인 내역까지 공유드리고
Trading AI를 만들기 위해 필요한 데이터들을 만들어내는 방법에 대해 다뤄보려고 합니다.
10월 자산배분 수익
제가 투자중인 자산배분 자동 리밸런싱 전략의 올해 수익률입니다.
비율은 자세히 공개드리진 않지만 동적으로 변하고 있고
금, 장기채, 에너지, 달러, 주식 등으로 이루어져 있습니다.
추석 연휴 이후 10월 초부터 고금리 장기화 우려로 장기채의 큰 하락이 MDD를 신규 저점갱신하게 만들었습니다.
고점대비 -4.28% 수익이어서 손실이 좀 있었습니다.
올해 자산배분으로 쌓았던 수익률을 다 반환했었지만 그래도 MDD 저점에서 돈을 추가하기도 하고 회복이 되기도 해서
아직 2% 정도 총수익을 얻고 있습니다.
10월 주식 데이터 수익
10월에 매수했던 메타 데이터 기반한 데이터들에 대한 수익률입니다.
10월에 장기채 부분에서 많은 하락이 주식에도 이어져 시장 지수 자체는 하락했고
메타 데이터에 기반해 주식 종목을 추려내도
AI로 한 것도 아니고 단순한 데이터마이닝 정도라 어쩔 수 없이 영향을 받은 것 같습니다.
그래도 시장 수익률보다는 상회한 결과를 얻을 수 있습니다.
실적 장세보다는 모멘텀 기반 특성들 덕분이라고 생각하는데요
3분기 실적이 좋은 기업들도 시장 투자심리 둔화로 하락하는 주식이 많았는데
거시적으로 고금리 장기화 우려에 그나마 대응가능한 섹터의 기업을 많이 두었던 게 그나마 선방한 이유일까 싶습니다.
10월 한 달간 섹터별 상승 정도입니다.
사실상 평균, 중윗값 모두 상승인 섹터는 디스플레이 장비부품밖에 없는데
10월 매수종목에 운이 좋게 해당 섹터 주식을 포진시켜 둘 수 있었습니다.
11월 매수한 종목들도 공개하겠습니다.
언제나 말씀드리지만 최첨단 AI를 활용한 것도 아니고
단순한 데이터 마이닝으로 걸러낸 주식들이고 거시경제적인 분위기를 보고 참고만 하시기 바랍니다.
저는 경제 사이클이 어떤 이유로 돌아가는지 이유들에 대해 흥미는 있지만 제가 직접 찾아내고 싶지는 않은 영역이라
섬유 의류 섹터등이 왜 추천되었는지는 자세히 모르지만 주식의 메타데이터에 기반한 결과라고만 이해해 주시면 될 것 같습니다.
수동적인 자산배분은 거시경제가 좋지 않으면 내 수익률도 좋지 않은데
이렇게 조금이라도 능동적으로 데이터를 살펴보고 트레이딩을 하게 되면
시장 우위의 수익을 얻을 확률을 조금이라도 얻을 수 있는 것 같습니다.
10월 자동화 트레이딩 수익
이번달부터는 트레이딩 수익도 공개하려고 합니다.
암호화폐 선물 포지션을 고배율 레버리지를 사용해서 자동화했습니다.
투자 알고리즘은 기본적으론 추세추종으로 분류해 둘 수 있는 전략을 구현했습니다.
투자금은 전체 자산의 1% 내로 투자할 계획이고 월초에 리밸런싱 예정입니다.
첫 차트가 수익, 아래 차트가 포지션 비율입니다.
포지션은 1.0 ~ -1.0까지 존재하고
1.0은 전체 포지션 long, -1.0은 전체 포지션 short을 유지합니다.
수익률은 월초 원금 대비 2.5배 정도로 나와있어서 놀라실 수 있는데
수수료 0.04% 제외 후 10배 이상의 고 레버리지 기준 수익입니다.
실제 이더리움 선물 포지션의 10월 데이터입니다.
수익률그래프와 조금 비슷해 보이기도 합니다.
10월 동안 추세가 존재하고, 급변하는 횟수가 적고, 변하더라도 변곡이 되어 추세가 변환되는 경우
좋은 수익을 얻을 수 있는 전형적인 추세추종 알고리즘입니다.
이 전략도 다른 전략과 마찬가지로 오로지 AWS로 자동화되어 제가 한 달간 해외여행을 가던 상관없이 동작합니다.
하지만 AI가 적용되어있진 않고 단순한 추세만 이용할 뿐입니다.
다만 주기적인 리벨런싱을 통해 (흔히 출금의 중요성) 고배율의 트레이딩 전략에서 살아남을 수 있는 방법론을 적용하고 있습니다.
100만 원을 투자했을 때 잃을 수 있는 돈은 100만 원이지만
10배 고배율을 유지해서 반복한다면 100만원 버는 건 우스울 수 있습니다.
이런 방법을 계속 반복하되 확률적으로 유지하게 포지셔닝만 하는 정도입니다.
자산배분, 주식메타활용전략을 거쳐 단기적인 트레이딩 영역을 오니 시장에 반하는 능동적인 태도가 더 강해지는 경향이 있습니다.
이게 단순한 자산투자를 넘어 능동적인 트레이딩이 가지는 매력이라고 할 수 있을 것 같습니다.
수익이 매크로 환경에 종속되지 않고 트레이더의 선택에 따라 달라질 수 있기 때문입니다.
물론 인간의 심리는 워낙 취약해서 역사적으로 단순 매크로에 의존해서 시장 수익을 얻는 게 아주 우수한 투자 이기도하지만요.
그래서 Trading AI를 만들어내고 싶은 마음이기도 합니다.
아쉽지만 이번달은 첫 달로 테스트를 하느라 자산의 1%가 아니라 아주 소액을 투자한 것이라 점차 금액을 늘려나갈 예정입니다.
다음은 이런 단기적 트레이딩을 하는 AI를 만들기 위해 준비한 것들도 보여드리도록 하겠습니다.
Autoencoder를 통한 AI의 양분이 될 메타데이터 생성
제 유튜브 구독자분들, 그리고 제 영상이 추천영상에 뜨시는 분들이 개발자분들이 많으려나 생각이 들기도 해서
개발 내용은 간략히 하고 넘어갔지만
이 Autoencoder 개념은 간략히 이야기하고 넘어가려고 합니다.
Autoencoder
AI는 많은 양의 데이터로 만들어집니다.
데이터의 양도 중요하지만 데이터의 질도 중요한데요.
단순하게 데이터의 양이 많아봤자 의미 없는 데이터라면 오히려 복잡한 문제 해결에 도움이 되기는커녕 방해가 될 수 있습니다.
흔히 차원의 저주라고 하는 말들이 이 때문이기도 합니다.
풀고자 하는 문제를 위해 다양한 특성데이터가 필요하지만
또 너무 많은 특성이 있으면 안 되는 이런 Trade-off 문제는 개발을 비롯해 우리 인생에 언제나 넘쳐나는 것 같습니다.
그럼 정말 압축된, 의미 있는 특성데이터를 부여해 주면 좋을 것 같은데
이런 작업을 이미 데이터과학자들이 진행하고 있고 feature engineering이라고 부릅니다.
데이터를 분석해서 의미 있다고 판단되는 특성을 만들어내는 것이죠.
아무리 데이터과학자라고 해도 사람이고 사람이라면 주관적인 견해, 경험에 기반한 편중된 사고를 할 수 있습니다.
저는 Autoencoder가 비지도학습 기반하에 존재하는 데이터의 특징을 추출해 내는 방법으로 사용하고 있습니다.
Autoencoder의 구조입니다.
입력으로 존재하는 데이터, 출력에도 존재하는 데이터를 설정하고
모델의 레이어는 bottleneck 구조를 갖도록 설계를 하고 학습을 진행합니다.
여기서 bottleneck 레이어를 기준으로 Encoder / Decoder로 모델을 나눌 수 있습니다.
입력과 출력에 같은 데이터를 두는 이유는 핵심이기도 한데
결국 데이터를 딥러닝 모델에 집어넣고, 압축된 차원으로 정보를 담아두었다가 (Encoder 역할)
다시 원래 차원으로 데이터를 잘 해석해 내어 원본 데이터와 비교를 해내는 것을 목표로 학습하는 것입니다. (Decoder 역할)
어떻게 보면 의미 없는 짓이라고 하실 수 있는데
우리는 입력한 데이터를 의미 있는 압축된 데이터로 변환할 수 있고
이 압축된 데이터가 원본 데이터를 대신해서 표현될 수 있는 중요한 데이터가 될 수 있습니다.
그리고 이 압축된 데이터를 분석해 보면 우리가 원하는 수치와 상관관계가 있는지도 파악해 볼 수 있습니다.
그에 따라 모델을 변형해 가면서 또 다른 더 좋은 특성데이터들을 이론상 무한히 뽑아낼 수 있습니다.
Trading 데이터에 Autoencoder 적용하기
트레이더들이 차트를 보고 그들의 방법대로 투자를 하듯
AI에게도 차트데이터를 제공해주고
차트데이터에서 핵심적인 요소를 추출해낼 수 있도록 Autoencoder를 통해 데이터를 만들어내보려고 합니다.
우리가 시각적으로 차트데이터를 접하면 이 데이터는 데이터 자체는 숫자이지만
인간에게는 시각적인 정보로 받아들여집니다.
차트데이터를 시각정보로 변환해서 Autoencoder를 적용시켜보았습니다.
차트데이터 준비
저는 이더리움 선물 상품의 1시간 간격 데이터를 준비했습니다.
존재하는 종가 데이터에 모멘텀이나 간단한 기술적 지표들을 특징으로 추가해서 18개의 특징들을 만들어냈습니다.
1일의 경우 24시간 데이터가 모이니 하루에 (24, 18) 형태의 데이터가 모이게 됩니다.
우리가
그리고 몇년간의데이터를 모으다 보면
(1394, 24, 18)
import numpy as np
from sklearn.preprocessing import StandardScaler
# 데이터를 (24, feature 수) 크기의 데이터 세트로 나누어 리스트에 저장
data_sets = [data[i] for i in range(data.shape[0])]
# 스케일러 초기화
scaler = StandardScaler()
# 각 데이터 세트에 스케일러를 적용하고 스케일링된 데이터를 저장
scaled_data_sets = [scaler.fit_transform(data_set) for data_set in data_sets]
# 다시 (N, 24, feature) 모양으로 데이터를 복원
scaled_data = np.array(scaled_data_sets)

데이터를 살펴보면 우리는 알 수 없는 숫자들로 이루어져 있습니다.
차트데이터를 수치데이터로 변환시켜두었다고 볼 수 있습니다.
이렇게 보면 숫자데이터들의 집합이지만 사실 사진데이터도 숫자들의 집합입니다.
흑백이미지의 경우 한 픽셀에 0 ~ 255의 숫자로 나타내어집니다.

저도 차트데이터를 한판의 이미지로 변환해서 2차원 데이터를 처리할 수 있는 Conv 레이어를 적용하여 Autoencoder를 구성했습니다.
한 판의 차트데이터 이미지는 (24, 18) 이고
이 형태의 데이터를 Conv1 D 혹은 flatten 후 Dense 레이어로 변환하여 인코더와 디코더를 만들었습니다.
그리고 Autoencoder에서 차트데이터를 어떤 형식으로 특징들을 기억해 내는지 시각적으로 살펴보았습니다.
위쪽이 원본 차트데이터, 아래쪽이 압축된 특징만을 이용해 원복 시킨 차트데이터입니다. 전체적으로 픽셀의 밝기는 다르지만
특징적으로 보이는 패턴은 그래도 캐치해 낸 모습입니다.
사실 중요한 것은 잘 복원해 내느냐가 아니라 압축된 특징이 수익률과 상관관계를 찾아낼 수 있는지
그러면서 비지도학습으로 feature engineering을 해낼 수 있는가도 알아봐야겠습니다.
인코더를 통해 차트데이터를 입력하면 3개의 특징을 만들어냅니다.
각 특징을 축으로 3차원 공간에 만들어진 데이터를 흩뿌리고
각 차트데이터들마다 미래 24시간의 수익률을 밝기로 나타내었습니다.
우리가 딥러닝으로 만들어낸 차트데이터에서 뽑아낸 특징들과 수익률을 3차원 산점도로 나타내었습니다.
인간이 보았을 땐 명확히 밝혀낼 순 없는 상관관계라고 볼 수 있으나
복잡한 문제 해결을 위해 고차원의 데이터가 아니라 압축된 데이터를 제공할 수 있고
이런 실마리들을 제공하면 복잡한 고차원의 문제를 저 차원의 데이터 수준에서 해결가능하게 되는 지점이 가까워질 수 있습니다.
마무리
이렇게 만들어진 데이터들은 시계열 데이터들을 클러스터링 하여 시계열들의 분류 모델을 위한 라벨링 데이터에도 생성될 수 있습니다.
이렇게 된다면 지난번 강화학습에서 한계를 맞이한 상태공간의 전이가 행동에 비례하여 확률적이었기 때문에 학습이 잘 되지 않던 부분을
Trajectory learning으로 차츰 해결할 실마리를 제공할 수 있습니다.
복잡한 고차함수를 미분하는 느낌이랄까요? 이런 것들을 모아가는 게 훌륭한 AI를 만들기 위한 밑거름이라고 저는 늘 생각합니다.
더 다양한 조합으로 클러스터링을 진행해 보고
트레이딩에 적용할 아이디어나 콘셉 등이 떠오르거나
AI 모델의 구조에 도움이 될만한 것들이 떠오르면
블로그와 영상으로 공유드릴 수 있도록 하겠습니다.
감사합니다.
'Data & AI' 카테고리의 다른 글
11월 수익 공개, 시장 데이터 리뷰 (1) | 2023.12.01 |
---|---|
cosine similarity를 활용한 자산배분 전략과 응용 (0) | 2023.11.23 |
딥러닝 트레이딩 - Timeseries Forecast (ICLR 2023 Timesnet) (3) | 2023.10.15 |
자산시장 추가매수 타이밍 (1) | 2023.09.24 |
월간 시장분석과 알고리즘 트레이딩의 핵심 도구 (6) | 2023.09.10 |