본문 바로가기

Data & AI

3월 주식시장 리뷰와 블록체인

반응형

YouTube : https://youtu.be/GOg0bxtfAnA

 

지난달 시장리뷰를 한지 한 달이 벌써 지나고 3월도 지나 벚꽃이 무르익은 지금에서야 글을 씁니다. 

다른 일들로 바쁘기도 했고 주식 말고 블록체인에 대한 이야기도 담겨있기 때문에 준비하는데 시간이 좀 들었습니다. 

 

3월 주식 시장의 가장 큰 이벤트는 SVB파산이겠죠. 

솔직히 저는 여러 경제 전문가들이 이야기해 주는 내용들만큼 전통 금융 시장에서의 여파나 파생되는 사건들을 설명하는 능력은 부족합니다. 그런 부분은 다른 글들과 영상을 참고하시면 더욱 좋을 것 같습니다. 저는 제가 재미있고 흥미롭게 연구했던 내용들을 소개하고자 합니다.

 

 

저는 데이터를 통해서 더 나은 투자를 수행하는 AI를 만들기 위해 데이터를 분석하고 음미해 보는데 집중하고 있습니다. 

3월도 어김없이 시장데이터를 수집했고, 그에 기반한 알고리즘 전략대로 시장에 진입해있습니다. 

3월엔 추가로 모멘텀 지표를 업데이트 해서 알고리즘에 접목했습니다. 그리고 기존 가치지표 데이터들 외에 매수한 종목들과 월별 모멘텀들을 추가로 적재하여 더 긴 시계열동안 투자전략의 성과지표를 측정할 수 있도록 했습니다. 

 

그리고 저의 알고리즘 전략들이 어떤 종목을 선택하는지, 어떤 포지션에 진입하는지 공유할 수 있는 데이터 대시보드 사이트를 만들까 합니다. 종목은 물론 알고리즘들의 수익률, 알고리즘을 연구하기 위한 다양한 데이터들의 분석도 제공해보려고 합니다. 사이트 이야기는 진행하면서 조금씩 더 이야기하도록 하겠습니다. 

 

이번달도 간단한 가치지표들과 모멘텀 지표에 기반한 3월 수익률을 분석해 볼까 합니다. 

3월1일 PBR 그룹별 3월 평균 수익률

PER/PBR 모두 비슷한 양상을 띄어서 pbr 지표로 설명하겠습니다. 그리고 이번달부터는 그룹을 10개에서 20개로 늘려서 더욱 세분화된 그룹별 수익률을 집계하였습니다. 3월 1일 집계된 PBR 데이터를 기반, 3월 한 달간 수익 평균을 나타내었습니다. 

가치지표 특성상 저PBR이 상대적으로 더 가치 있음을 이번달에는 보여주었습니다. 

 

3월 1일 모멘텀 그룹별 3월 평균 수익률

3월 1일에 집계된 모멘텀(20230201~20230301) 그룹별 3월 한 달 평균 수익률입니다. 

3월에서 가격 모멘텀은 유지되었음을 볼 수 있습니다. 2월에 많이 올랐던 종목들이 3월에도 많이 올랐음을 알 수 있습니다. 

 

저는 주식을 비롯하여 여러 자산에 알고리즘 전략을 접목합니다. 그중 주식 지표로 삼을 데이터들이 많았기 때문에 주식을 가장 먼저 다루었습니다. PER, PBR 등의 대표적인 지표들로 데이터를 분석해 보고 모멘텀과 같은 트레이딩에 쓰이는 지표로 확장하면서 더 다양한 대안데이터를 탐색하고자 합니다. 그 이유는, 블록체인 투자에서는 전통 금융시장과 다르게 자리 잡은 대표적인 지표랄 게 없고 투기적 성향이 아직 자리 잡고 있기 때문에 의미 있는 해석이 가능한 데이터들을 집계하는데 노력이 필요했습니다. 

 

아래는 이번 실리콘밸리사건당시 주가와 비트코인의 가격차트입니다. 

3월SVB 주가차트와 비트코인 차트

미국의 은행이 파산되는날 비트코인의 가격이 상승한다는 것은 무엇을 의미할까요

저는 전통금융과 web3기반 금융시장의 가치가 조금씩 교환되는 순간이라고 느끼고 있습니다. 

결국 자본주의의 중앙화된 전통금융에서는 그 어느 은행도 예금자들이 돈을 찾아가게 될 때 버티는 은행은 없습니다.
은행이란 것이 예금과 대출 간격으로 돈을 버는데 그런 은행이라면 돈을 벌고 있지 않은 은행이겠죠.

 

하지만 전문가를 비롯하여 많은 사람들이 뱅크런에 견딜 은행은 없다는것은 알면서도 일단 일상을 살아갑니다. 태양도 언젠간 죽어서 지구도 지금 같지 않는다는 것처럼 마치 우리에게 오지 않을 일이라고 생각하면서 말이죠. 그러나 자본주의의 역사는 우주와 태양의 역사만큼 길지 않습니다. 자본주의가 좋고 잘 유지되길 희망하는 사람이지만 상위층만 누리기 쉬웠던 전통경제적 해자와 그로 인한 빈부격차, 화폐의 패권경쟁과 그로 인한 전쟁 등 자본주의를 위험에 다가서게 할 요인들은 많습니다. 

 

그렇기 때문에 분산되어있는 신뢰할 수 있는 플랫폼인 블록체인에 대한 수요가 전통 은행들의 파산과 함께 부상한 것으로 저는 생각합니다. 

블록체인에 대해 꾸준히 공부하고 투자를 한다고 했을때, Defi, NFT 등의 서비스들도 있지만 가장 많이 알려진 것은 아무래도 암호화폐를 통한 시세차익이 아닐까 싶습니다. 요즘엔 많은 데이터들이 공개되어 있고 그런 데이터를 다룰 수 있다면 널리 알려진 전략들을 백테스트 해볼 수 있습니다. 저는 Trading View에 올라오는 투자전략들을 보면서 알고리즘으로 구현했을 때 백테스트를 진행하곤 합니다. 오늘은 Trading View에서 가장 인기가 많은 Squeeze Momentum 지표 백테스트를 해보도록 하겠습니다. 

가장 인기가 많은 Squeeze Momentum Indicator

Squeeze Momentum은 Trading View 커뮤니티 내에서 잘 알려진 사용자이자 맞춤형 지표 제작자인 LazyBear가 개발했습니다. 스퀴즈 모멘텀 지표는 시장 모멘텀과 변동성을 결합하여 트레이더가 잠재적인 거래 기회를 식별하는 데 도움을 줍니다.

지표에는 크게 두 가지 구성요소가 있는데, 히스토그램과 x축에 표시된 스퀴즈여부 입니다. 

히스토그램은 시장의 모멘텀을 나타냅니다. 장기 가격이동평균과 단기 가격이동평균의 차이를 기반으로 히스토그램이 0보다 크면 양의 모멘텀, 0보다 작으면 음의 모멘텀을 갖습니다. 

스퀴즈여부는 볼린저밴드와 켈트너 채널을 사용하여 계산됩니다. 볼린저밴드가 켈트너 채널내에 있을 시 스퀴즈 off상태, 볼린저밴드가 켈트너 채널 밖으로 가게 되면 스퀴즈 on 상태가 됩니다.

 

일단 간단하게 모멘텀 히스토그램을 통해서만 전략을 구현해보았습니다. 양의 모멘텀이 되면 Long, 음의 모멘텀이 되면 Short으로 진입합니다. 

# df <- binance api를 통해 이더리움 데이터 조회

# 아래는 볼린저밴드, 켈트너 채널을 만드는 코드 
length = 20
mult = 2.0
length_KC = 20
mult_KC = 1.5

df['returns'] = df['close'].pct_change()

m_avg = df['close'].rolling(window=length).mean()
m_std = df['close'].rolling(window=length).std(ddof=0)

df['upper_BB'] = m_avg + mult * m_std
df['lower_BB'] = m_avg - mult * m_std

df['tr0'] = abs(df['high'] - df['low'])
df['tr1'] = abs(df['high'] - df['close'].shift())
df['tr2'] = abs(df['low'] - df['close'].shift())
df['tr'] = df[['tr0', 'tr1', 'tr2']].max(axis=1)

range_ma = df['tr'].rolling(window=length_KC).mean()
df['upper_KC'] = m_avg + range_ma * mult_KC
df['lower_KC'] = m_avg - range_ma * mult_KC

highest = df['high'].rolling(window = length_KC).max()
lowest = df['low'].rolling(window = length_KC).min()
m1 = (highest + lowest)/2
df['value'] = (df['close'] - (m1 + m_avg)/2)
fit_y = np.array(range(0,length_KC))
df['value'] = df['value'].rolling(window = length_KC).apply(lambda x:
                                                            np.polyfit(fit_y, x, 1)[0] * (length_KC-1) +
                                                            np.polyfit(fit_y, x, 1)[1], raw=True)

df['squeeze_on'] = (df['lower_BB'] > df['lower_KC']) & (df['upper_BB'] < df['upper_KC'])
df['squeeze_off'] = (df['lower_BB'] < df['lower_KC']) & (df['upper_BB'] > df['upper_KC'])
df['position'] = np.where(df['value'] > 0, 1, -1)
df['position_returns'] = df['position'].shift(1) * df['returns']

저는 시간봉을 기준으로 히스토그램상 변화가 발생하면 그 다음 시간봉시작시 직전 히스토그램의 방향대로 진입합니다. 즉 히스토그램 흐름상 2번째 봉에 진입하게 됩니다. 모멘텀이 발생할 때 진입하고 스퀴즈가 발생하기를 기다려 수익을 얻는 전략입니다. 

position이란 변수로 현재 모멘텀을 보고 다음에 진입할 포지션을 설정합니다. 

position_returns로 이전에 정해진 데이터 기반하여 진입한 position이 어느정도의 수익을 내는지 계산하였습니다. 

 

이제 전략을 테스트해볼건데 아래는 2023년 1월 1일부터의 포지션들의 수익그래프입니다. 

하늘색선은 이더리움 가격, 주황색선이 저희의 squeeze momentum 전략입니다. 

 

import matplotlib.pyplot as plt
fig, axes = plt.subplots(figsize=(20, 10))

_df = df
_df = _df.set_index('datetime')
_df = _df[datetime(2023,1,1):]
axes.plot(_df['returns'].cumsum().apply(np.exp), label='base')
axes.plot(_df['position_returns'].cumsum().apply(np.exp), label='target')
axes.grid()
axes.legend()

 

선물거래 시 매수매도 시 수수료 0.04%가 발생하지만 매수매도 포지션 변경이 빈번한 전략은 아니기 때문에 크게 영향을 주지는 않는 것 같습니다. 짧은 기간임에도 수익률이 괜찮습니다. 제가 제공하는 코드들로 2023년 전의 데이터들도 살펴보시면 수익률이 우수한 것을 볼 수 있습니다. 혹은 코드를 다루기 힘드신 분들을 위해 제가 말했던 데이터 대시보드 사이트에서도 여러 알고리즘들의 수익률을 시각화하여 제공하기 위해 노력하고 있습니다. 

 

하지만 단순한 가격데이터를 가지고 투자를 하면 변동성에 알고리즘 전략들이 힘을 쓰지 못하기도 합니다. 특히 투기성이 강한 투자자들이 모여있는 암호화폐 선물거래시장에서는 특정 가격구간대 (1000달러, 2000달러 등)에 변동성이 너무 심해지기도 합니다. 그런 상황에서도 흔들리지 않고 보탬을 줄 수 있는 대안데이터를 설명하고자 합니다. 

 

여러분들은 블록체인이 왜 가치가 있다고 하는지 아시나요

사실 이더리움이란 암호화폐는 물리적으론 디지털 데이터 뭉치에 물과합니다. 인류 역사상 실질적인 가치를 가지는 금과 같은 금본위제를 만들어 살아왔단 걸 뒤돌아보면 이더리움의 가치를 생각해 보긴 더욱 힘듭니다. 하지만 블록체인은 탈중앙화라는 특성으로 물리적으론 의미 없는 가치를 가질진 몰라도, 더 큰 영향력을 행사하고 있습니다. 

 

탈중앙화 플랫폼이라는건 그 자체로 믿을 수 있는 중개자를 갖는 것입니다. 제가 컴퓨터 보안 수업을 들을 때 생각이 납니다. 많은 보안 알고리즘들이 믿을 만한 중개자가 있다는 가정이라면 이렇게 어렵고 많은 자원을 들려 보안에 필요한 것들을 유지할 필요도, 전문적일 필요도 수요도 없는 분야겠다 생각했습니다. 믿을 수 있는 중개자가인 블록체인 기반 플랫폼으로 옮겨가게 되면 우리는 기존의 자원들을 많이 아낄 수 있습니다. 보안을 유지하기 위한 여러 장치나 요소들이 모두 다른 가치로 전이된다면 그 가치가 얼마나 클지 생각해 보셨나요

 

결국엔 이런 신뢰가능한 분산 플랫폼에 대한 수요가 늘면 블록체인 서비스들이 나오고, 블록체인에선 서비스를 제공하기 위해 스마트 컨트랙트라는 함수집합코드를 네트워크에 적재하는 과정이 필요합니다. 이때 필요한 화폐가 이더리움입니다. 대중의 수요가 늘어나면 스마트컨트랙트가 이더리움 네트워크에 더 많이 생성되고, 개발과정의 90%를 차지하는 유지보수 단계에서도 꾸준히 이더리움을 소비하여 스마트컨트랙트를 수정해야 하고 필요한 이더리움은 더 많아지며 이더리움은 더욱 가치를 가지게 됩니다. 

 

하지만 대중의 수요를 예측할 순 없습니다. 저는 여기서 실질적으로 이더리움 네트워크에 오고 간 트랜잭션을 분석하여 이더리움의 가치를 추정해 나갈 수 있는 도구가 될 수 있습니다. 트랜잭션이 늘어난다는 건 이더리움 네트워크에 대한 행동이 늘어나는 것으로 볼 수 있고 더 많은 이더리움들이 필요하기 때문이죠. 

믿을 수 있는 중개자답게 우리는 블록체인의 공개된  많은 데이터들을 볼 수 있습니다. 

기존의 세상에선 어느 서비스를 제공하는 회사의 로그를 우리가 마음대로 볼 수 없습니다. 예를 들어 개인에 불과한 제가 전 세계에서 오는 Visa의 결제 트랜잭션을 볼 순 없겠죠. 블록체인에선 가능합니다. 이더스캔이 블록체인 데이터를 제공하는 대표적인 사이트 중하나입니다. 

 

이더스캔에서 일별 트랜잭션 데이터를 가져오겠습니다. 
그리고 데이터들의 유사도를 Pearson 상관계수로 분석할 예정이며 단위가 다르기 때문에 Scaling을 진행해 주었습니다. 

import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler

df['close'] = StandardScaler().fit_transform(df[['close']])
df['Value'] = StandardScaler().fit_transform(df[['Value']])

fig, axes = plt.subplots(figsize=(20, 15), nrows=2)

axes[0].plot(df.dt, df.close)
axes[1].plot(df.dt, df.Value, color='red')
for ax in axes:
    ax.grid()

위 그래프가 가격데이터, 아래그래프가 트랜잭션 데이터입니다. 

아주 유사하다곤 할 순 없지만 추세는 비슷하게 움직이는 걸 확인할 수 있습니다. 

유사도가 비슷한 구간에서 0.75 정도의 강한 양의 상관관계를 가지고
긴 시계열로 가면서 낮을 때는 0.35 정도로 약해지긴 하지만 양의 상관관계를 가지는 것을 확인할 수 있었습니다. 

트랜잭션이 양의 상관관계를 가지고, 이더리움 가치보다는 선행하는 특성이 있기 때문에 트랜잭션이 하락하는 추세인데 알고리즘이 Long 포지션 신호를 보내면 이를 기각할 수 있는 작은 근거 하나를 우리는 얻게 되었습니다. 

저는 이런 지표들을 하나씩 모아가면서 튼튼한, Robust 한 알고리즘을 만들고 있습니다.

이전에 말한 데이터 대시보드 사이트에서 이런 알고리즘들을 소개하기도 하고 수익률을 공개하는 것도 생각하고 있습니다. 시장은 계속 변하고 시기마다 최적의 알고리즘이 있기 때문에 큰 무리는 없다고 생각했기 때문입니다. 

 

3월도 바쁘게 지나가서 비록 4월이 되어서야 주식시장 리뷰와 데이터 분석글을 작성했는데요.

더 탐구하고 분석한 것들을 자주 공유 드릴 수 있도록 노력하겠습니다. 

반응형