[투자] 새롭게 시도해보고픈 투자 전략(2020.01.27)

최근에 암호화폐 선물 투자를 활발하게 하면서, 새롭게 시도해보고픈 투자 전략들이 몇가지 떠올랐습니다. 이제까지 트레이딩을 하면서 얻게된 경험들을 바탕으로 하고 있지만, 다양한 데이터 분석을 통해서 연구해볼 가치가 있을 것 같아서 여기에 적어두고자 합니다.

1. 비트코인과 알트코인 간의 가격 상관관계 분석을 통한 비트코인 상승 추세 후행 알트코인 트레이딩
이미 비트코인의 가격이 알트코인에 영향을 주는건 너무나도 잘 알려져있는 상식입니다. 마치 비트코인이 업계 대장주처럼 시장을 뒤흔들죠. 하지만, 그중에서도 비트코인의 가격 움직임을 특정한 방식으로 추종하는 알트코인이 있을 것 같다는 생각이 듭니다. 그 대표적인 예시로 비트코인의 하락 움직임만을 추종하는 것으로 의심받고 있는 코인으로 그 유명한 리플이 있습니다. 이 바닥에는 리플은 비트코인이 오를 때는 안 오르고 비트코인이 떨어질 때만 신나게 떨어진다는 속설이 있답니다. 얼마나 수많은 사람들 사이에서 선험적인 경험치가 쌓였으면 리또속(리플에 또 속았다)라는 말이 나오겠습니까. 그러한 알트코인과는 정반대로, 비트코인의 상승 움직임을 추종하는 암호화폐를 찾아봐야겠죠. 이처럼 비트코인과 알트코인 간의 가격의 상관관계 분석을 통해 비트코인의 상승 추세를 후행하는 암호화폐를 찾아내보고자 합니다.

2. 시간대별 비트코인 거래량 분석을 통한 유동성 공급 시간대 발굴로 이상적인 트레이딩 시간대 선정
FX마진 시장에서는 미국과 영국의 거래소 개장 시간대가 겹치는 시간을 프라임 타임(Prime time)이라고 합니다. 그만큼 거래량도 많고 변동성도 큰 만큼, 수익을 추구할 수 있는 기회가 열려있는 것이죠. 암호화폐 시장에도 그러한 특정 프라임 타임이 있지 않을까 하는 생각이 문득 들었습니다. 왜냐하면 24시간 365일 거래되는 암호화폐 시장에서 분명 유동성이 더욱 많이 공급되는 시간대가 있을거란 생각이 강하게 있었거든요. 특히 2017년에 한창 암호화폐 버블이 끼었을 때, 흔히 미국이 아침 시간대가 되면 ‘햄버거 형님 들어오신다’하고 중국이 아침 시간대가 되면 ‘따거 형님 들어오신다’하면서 커뮤니티에 글이 우르르 올라왔던 기억이 나네요. 최근에는 그런 말이 적게 나오지만요. 아무튼, 그러한 유동성이 추가로 공급되는 프라임 타임을 찾아내어 알파를 추구할 기회를 포착해보고자 합니다.

3. 다양한 기술적 지표의 유효성 여부 연구를 통해 선정된 기술적 지표를 이용한 트레이딩
과연 기술적 지표가 유효한가는 오랜 논쟁 대상입니다. 주식시장에서 가치투자자들에게는 철저히 외면받는 반면, 소위 차티스트(Chartist)들에게는 모든 가격 움직임을 해석하는 열쇠같은 존재이지요. 저는 개인적으로 주식시장을 분석할 때는 기술적 분석을 왠만하면 배제합니다. 주식은 기업의 가치를 기반으로 하고 있다는 강한 믿음 때문이지요. 그런데 암호화폐 시장이라면 말이 달라집니다. 어짜피 암호화폐 시장에서는 펀더멘탈 따위는 존재하지 않기 떄문에, 믿을만한 것은 뉴스와 차트 뿐입니다. 그중에 뉴스는 당연히 예의주시 해야하기에, 과연 차트를 어떻게 분석할 것인가가 가장 중요한 과제로 남게 됩니다. 저는 트레이딩할 때 기술적 지표로 이동평균선(20, 60,120), 볼린저 밴드, MACD, 스토캐스틱 RSI를 사용합니다. 왠만한 경우에는 그럭저럭 잘 맞더라고요. 하지만, 이러한 기술적 지표가 과연 암호화폐 시장에서 유효한지는 추후 연구가 필요합니다. 그래서 다양한 기술적 지표 기반 트레이딩 전략을 토대로, 수많은 백테스팅으로 어떤 기술적 지표가 가장 유효한지 찾아보는 연구를 진행하고자 합니다.

4. S&P500 VIX 지수와 비트코인 간의 상관관계 분석을 통한 변동성 기반 트레이딩
최근들어 비트코인은 안전자산 취급을 받기 시작해서, 국제적인 정세 불안에 따른 상승세를 보이는 경우가 종종 있습니다. 사실 몇년 전에 버블로 취급받았던걸 생각해보면 신기한 일이지요. 하여튼, 일반적으로 시장에 변동성이 확대되었을 때 안전자산에 대한 수요가 증가합니다. 즉, 시장이 불안할 수록 비트코인의 가격이 오를 여지가 있다는 의미이지요. 그래서 S&P500의 변동성을 대표하는 VIX 지수와 비트코인 간의 상관관계를 분석해서, S&P500 VIX 지수가 상승할 때 비트코인의 가격이 유의미한 정도로 동반 상승하는지에 관한 연구를 진행해보고자 합니다.

사실 이렇게 적어놓고선 데이터 분석은 안해볼 것 같다는 생각이 문득 드네요. 그만큼 작업이 어렵기도 하지만, 제가 몸을 움직이기 싫어하는 게으른 성격 탓이 더욱 큽니다. 어쨌든, 여기에 적어둔 새로운 투자 전략들을 추후에 연구해보고자 합니다.

[투자] 첫 바이낸스 거래소에서의 암호화폐 선물 거래

제가 오늘 홍콩의 암호화폐 거래소인 바이낸스(Binance)에서 첫 선물 거래를 개시해보았습니다. 선물 계좌 개설은 클릭 하나면 가능하더라고요. 즉시 최대 125배 레버리지까지 가능한 계좌를 받게 되었습니다. 다만, 제 리스크 회피성 투자성격상 125배의 레버리지를 제정신이라면 모두 사용하는 일은 없을 것 같습니다. 그래서, 선물거래를 시작하는 제게 암호화폐 시장에 대한 이제까지의 개인적인 판단은 다음과 같습니다. 아, 그에 앞서서 저는 암호화폐를 블록체인 기술의 파생이 아닌 하나의 트레이딩 가능한 상품의 관점에서 접근하고 있다는 점을 먼저 말씀드리고 싶습니다. 사실 블록체인 기술이 하이프 사이클(Hype-Cycle) 속에서 너무나도 고평가 되어있고, 블록체인의 분산화 기술이 중앙화된 데이터 센터를 과연 대체할 수 있을까하는 생각을 지울 수가 없거든요.

1. 비트코인만이 VIX 지수와 동기화되어 안전자산의 역할을 한다.
다만, 이 부분은 제가 데이터 분석을 통해서 회귀분석으로 실질적인 결정계수값을 구해봐야 알 수 있을 것 같습니다. 아직까지는 제 심리적인 추측입니다. 이전에도 그렇고, 어제에도 이란의 솔레이마니 사령관에 대한 미국의 공습이 파장을 일으키면서 급격한 상승장을 보여주고 있습니다. 분명 시장의 공포심리와 일정정도 상관관계가 있을 것으로 생각하고 있습니다.

2. 알트코인은 비트코인을 후행한다
어떻게 보면 당연한 얘기이지만, 특정 코인들은 그러한 성향을 더 많이 보이더라고요. 나중에 이 부분도 데이터 분석을 통해, 타임프레임을 쪼개서 비트코인과 상관관계를 보면서 가격추이를 후행하는 코인 몇개를 선정해서 트레이딩하는 것도 괜찮을 것 같습니다.

3. 암호화폐 시장에서 뉴스 트레이딩보다 차트 기반 트레이딩이 유효하다
물론 위에서 말한 시장 전체에 영향을 줄만한 뉴스들은 암호화폐 시장에 큰 영향을 줍니다. 하지만, 개별 코인들의 작은 호재들은 큰 영향을 주지 못하는 것 같습니다. 워낙 가짜 전문가들과 트위터발 가짜뉴스가 많은 판이라서 그런걸까요. 하여튼, 차트 중심의 접근이 더욱 유효해보입니다. 이점은 데이터 분석을 하는 입장에서는 유리한 점입니다. 가격 데이터만 분석해도 충분하다는 뜻이니깐요.

여기까지는 일반적인 암호화폐 트레이딩에서도 적용되는 점들입니다. 이러한 생각을 바탕으로, 저는 선물거래에서는 적정한 레버리지(5배 ~ 10배)를 바탕으로 1분 ~ 5분봉 차트를 기반으로 단타를 할 예정입니다. 암호화폐 선물투자에서 포지션을 오래 가져가기에는 리스크가 많이 클 것 같더라고요. 다만 단타를 시작하려 보니 수수료가 문제이네요. 그래도 최대한 많은 트레이딩을 통해서 경험을 익히고, 거래빈도수를 높혀서 수익 가능성을 최대한 높혀보고자 합니다. 아직까지는 초보 트레이더로써, 수익률은 양수값만 된다면 그 이후에는 적중률(Hit Ratio)로 제 성과를 평가해보고자 합니다.

아, 그리고 아침에 하는 선물 트레이딩이 생각보다 괜찮네요. 현실에서 기분이 이상하고 무언가 나쁜 것 같은 순간에 하는 것도 좋습니다. 선물 트레이딩이 아드레날린과 도파민을 자극하는 것 같습니다. 제대로 된 트레이더라면 이런걸 느낄게 아니라 트레이딩에 집중해야 하지만, 저는 아직 초보이니깐요. 이렇게나마 도박사의 심리로 스릴넘치는 순간을 즐기면서 행복감을 느껴보고자 합니다.

[일상] PORT IT정보보호 ETF – 신규 금융상품 연구 보고서

20191114_신규 금융상품 연구 보고서_리서치1팀_임세준

제가 새내기 시절부터 몸담고 있는 동아리는 한국외대 증권투자연구회, 포스트레이드입니다. 비교적 어린 나이에 동아리에 입회하여 1학년 2학기에 리서치1팀(퀀트팀)의 팀장이 되었습니다. 기존에 없던 새로운 정량분석(Quantitative analysis) 중심의 팀인 만큼, 무언가 새로운 연구를 직접 리드해야겠다는 생각이 문득 들었어요. 그래서 세 달전인 10월에 새로운 금융상품에 대한 선행연구를 진행하고 직접 모델 포트폴리오를 설정해보자는 목표를 설정하게 되었습니다.

그래서 한 달 간의 고민과 시행착오 끝에 ‘PORT IT정보보호 ETF’라는 금융상품을 개발하게 되었습니다. ETF(Exchange Traded Fund)는 상장지수펀드로, 지수를 추종하는 펀드를 주식처럼 증권시장에서 쉽게 매매할 수 있도록 설계된 상품입니다. 최근에 패시브 투자가 트렌드인 만큼, 증시에 다양한 ETF가 상장되어 있죠. 그렇지만, 저희 팀은 4차산업혁명의 후방산업이자 진정한 수혜자로 예상되는 IT정보보호 산업에 대한 ETF가 없다는 점에 주목하여 해당 연구를 진행하게 되었습니다. 아, 그리고 PORT라는 ETF 브랜드는 포스트레이드(Postrade)의 약자이자 ETF의 바다를 여행하는 투자자들의 항구와도 같은 역할을 하겠다는 비전을 바탕으로 지어냈습니다. 어짜피 선행연구인데, 제도권 자산운용사들을 카피해서 브랜드 이름이라도 멋있게 지어주기로 했죠.

저희 연구에 대해 관심이 있으신 분들은 자세한 내용은 위에 업로드한 보고서에서 확인해주시면 감사하겠습니다. 다만, PORT IT정보보호 ETF를 한줄로 요약하자면 ‘국내 IT정보보호 테마 내 상장주식을 시가총액 가중방식으로 편입하여 KOSDAQ 지수를 아웃퍼폼 하는 것을 목표로 하는 ETF’로 설명할 수 있을 것 같습니다. 

사실 이번 연구를 진행하면서 정말 힘들었습니다. 국내에는 없는 IT정보보호 테마에 대한 선행연구인지라 정보가 없을 뿐만 아니라, ETF를 개발하는 것은 저희 동아리 내에서 전례가 없었던 일인지라 모든 것을 처음부터 시작해야 했습니다. 그래서 미래에셋자산운용의 ETF 제작과정을 벤치마크하여 투자 유니버스(Investment Universe)와 모델 포트폴리오(PDF)를 순서대로 구성하는 방식을 사용했지만, 1학년 학부생으로써 진행과정에서 지적 한계를 마주해야만 했습니다. 특히 모델 포트폴리오 구성방식에 대해 CAPM, MPT, Efficient Frontier과 같은 다양한 포트폴리오 구성 방법론들을 적용해야할지 고민이 많았습니다. 그 뿐만 아니라, 설정한 모델의 백테스팅을 위한 시뮬레이터를 직접 파이썬으로 코딩하는 과정도 만만치 않았죠. 그리고 무엇보다, 팀장으로써 팀을 리드한다는 것 또한 많은 도전이 있는 일이었습니다. 아직 열아홉이었던 제게 너무나도 많은 과제들이 주어졌다는 생각이 들었죠.

그래도 무사히 보고서를 완성하고 나니, 좋은 기회들이 제게 찾아왔습니다. 시립대 법학관에서 시립대 증권연구회 UoStock과의 연합 세션에서 시립대 학생들과 정보를 교류하고(사실 우리 윤화 누나의 ‘한국기업평가’ 리서치 보고서와 제 ‘PORT IT정보보호 ETF’로 압살하고 왔다고 생각하고 있습니다), 저희 포스트레이드의 홈커밍데이에서 현직 증권맨 선배님들 앞에서 직접 제 연구에 대해 발표할 기회도 가지게 되었습니다. 그리고, 하나금융투자에 재직중이신 한 유튜버 선배님께서 제 연구를 유튜브 채널에 소개까지 해주셨습니다.

아무튼, 이번 선행연구는 제게 금융상품의 제작 뿐만 아니라 IT정보보호 산업에 대한 이해까지 넓혀준, 지적성장을 이끌어준 프로젝트였습니다. 그 뿐만 아니라, 제 커리어에도 많은 도움을 줄 수 있는 결과물까지 만들 수 있었죠. 제가 노력한 만큼의 결과가 따라와줘서 다행입니다. 다음에는 더욱 액티브한 운용이 가능한 ‘스마트 베타 ETF’와 함께, IT정보보호 산업에 대한 이해도를 더욱 높히는 과정을 걷고자 합니다.

[일상] 미국 세무사(USEA) 1차 개인세법 시험 후기

미국 세무사(US Enrolled Agent)는 미국 내 50개 주에서 세무보고, 피감사 대리, 조세소송 대리 등의 직무를 볼 수 있도록 미국 국세청에서 공인하는 자격증입니다. 시험은 1차 개인세법, 2차 법인세법, 3차 윤리규정으로 나누어져 있습니다. 이렇게 써놓으니 대단한 것처럼 보이지만, 사실 한국 세무사 시험의 난이도에 비하면 매우 쉽습니다. 한국 세무사에 비해 조세소송 대리와 같은 더욱 많은 권한을 가짐에도 시험은 더욱 쉽다는 점에서 무언가 잘못됬음을 느끼지만, 제가 시험 보는 입장이니 그러려니하고 넘어갑니다. 

아무튼, 얼마전에 미국 세무사 1차 시험을 치르고 왔습니다. 제 기억을 위해 기록으로 남겨두고자, 이것저것 글로 써봅니다.

왜 준비했는가
정말 우연히 나무위키 페이지를 보고 시험을 준비하기 시작했습니다. 연초에 아무 생각없이 나무위키에 ‘세무사’를 검색하고 내용을 읽는데, 미국 세무사에 관한 내용이 나오더라구요. 미국도 세무사가 있다는게 신기했는데, 시험 내용도 간단해보이고 할만할 것 같다는 아주 단순한 생각에 준비해보기로 마음을 먹었습니다. 그때 얼른 마음을 접고 조기에 때려쳤어야 했다는 후회를 종종 해보기도 합니다.

사실 개인적인 이유도 있었는데요. 제가 지금 19살인데, 올해 안으로 시험을 통과하면 10대에 ‘전문직 자격증’을 딸 수 있다는 판단이 섰습니다. 항상 남들보다 앞서나가야한다는 강박이지만, 무언가를 공부해보는건 나쁘지 않다는 판단이 들어서 시작했습니다.

시험 공부

KAPLI 학원의 온라인 강의와 교재를 바탕으로 인강을 들으며 시험 공부를 했습니다. 제가 수강한 코스는 EA 종합반이였고, 가격은 $650 정도였습니다. 저는 교재를 2회독하고선 시험 문제를 풀고, 다시 오답을 체크하며 중요한 내용을 암기하는 방식으로 공부를 했습니다.

1차 시험은 개인세법에 관한 내용인 만큼, 다양한 현실 사례를 바탕으로 문제가 출제되기 때문에 이해하는 것이 크게 어렵지는 않았습니다. 언제나 상식적인 선에서 이해하면서 암기하다보면 문제를 푸는데 어려움이 없습니다. 물론 감가상각분 재인식(Depreciation recapture)과 같은 일반적이지 않은 내용들도 있지만, 이러한 부분은 특별히 표시해두고 암기를 했습니다. 

시험을 준비하면서 가장 힘들었던 부분은 TCJA tax reform이었습니다. 트럼프 행정부는 세율을 낮추고 조세부담을 경감하겠다는 미명하에, 근 30년만에 최대 규모의 세제개혁인 TCJA(Tax Cut and Jobs Act)를 단행했는데요. 이 제도가 반영된 내용을 하필이면 제가 시험을 치루는 시점부터 새롭게 적용하기로 정해졌습니다. 기존에 시험과는 전혀 다른 내용들이 다수 적용되는 만큼, 혼란스러울 수 밖에 없었죠. 그래서 일일히 웹사이트에서 TCJA 이후 변동된 사안들에 대해 검색해보면서, 제가 배웠던 내용들과 대조해보며 공부했습니다. 다행히 생각보다는 변동된 부분들이 엄청나게 복잡하지는 않았습니다.

사실 말은 이렇게 하지만, 그다지 열심히 공부하지는 않았습니다. 괜히 주변 사람들에게 힘든척만 많이 했습니다. 역시 시험이 며칠 앞으로 다가오고서야 미친듯이 공부를 했죠. 결국에 전날 밤에도 온라인으로 문제를 풀면서 내용을 정리했습니다. 

시험 후기
먼저 시험은 동대문역사문화공원역 인근에 있는 프로메트릭(Prometric) 센터에서 봤습니다. 프로메트릭은 ETS에서 운영하는 기관인데요. 개인적으로 토플 보면서 ETS에 대한 악감정이 있는지라, 많은걸 바라지 않고 갔습니다. 근데 생각보다 시험 환경이 좋더라고요. 잘 정리되어 있는 공간에서 상태가 좋은 PC로 시험을 본다는 점이 마음에 들었습니다.

시험은 예상치 못한 곳에서 많은 내용이 나와서 당황스러웠습니다. 저는 레딧에서 본 시험 후기 내용들 을 바탕로, IRA threshold 관련 계산과 FBAR에 관련한 내용을 중점적으로 준비했습니다. 하지만, IRA에 관한 세세한 내용을 묻는 질문들이 여러개 출제되어 당황했었습니다. 특히 Saver’s account에 관한 내용은 거의 찍었던 것 같습니다. 

나름 독특한 문제도 많이 출제되었습니다. 동성부부에 합산세금신고 방법과 같이, 최근에 화제가 되고있는 사안과 세무를 결합한 문제도 출제됬습니다. 물론 상식선에서 풀면 맞출 수 있는 문제입니다.

아무튼, 많은 준비를 했음에도 어려운 문제들이 있었던 시험이었습니다. 최대한 많이 문제를 풀어보고 오답을 통해서 빈틈을 매꿔나가는 공부를 더욱 해야겠다는 생각이 들었습니다.

시험 결과

정말 다행히도 시험을 합격했습니다. 컴퓨터 기반 시험인 만큼, 시험이 종료되는 즉시 그자리에서 바로 결과를 받아보게 되는데요. Passed라는 단어가 떴을 때 순간 자리에서 일어났던 기억이 납니다. 1회차만에 시험에 합격하기 힘들 것이라고 예상했는데, 이렇게 합격을 하니 기분이 너무 좋았습니다.

이제부터 2차 법인세법 시험을 준비해야 하는데요. 사람들에 의하면 법인세법이 가장 어렵다고 합니다. 1차 시험을 치루면서 얻은 소소한 시험 공부팁들을 바탕으로, 2차도 동차합격으로 통과 해야겠습니다.

[일상] 회계관리 2급 후기

회계관리 2급을 치른지 한달이 지나서야 시험 후기를 올려봅니다. 삼일회계법인이 주최한 국가공인 민간자격증 시험으로, 재경분야의 실무 전문가를 양성하기 위한 시험이라 하네요. 사실 그런거 없고, 회계원리 이해도 측정 시험 정도의 수준입니다.

시험을 준비한데는 여러가지 이유들이 있었지만, 무엇보다 회계를 전문적으로 공부해보고 싶었습니다. 주식 투자를 하다보면 수많은 사업보고서를 접하게 되는데, 대부분 사업 개요 정도만 읽어보고선 PBR이나 ROE같은 투자지표의 정량적인 수치만 확인하고 넘어가는게 현실이었습니다. 재무제표를 통해서 기업의 현황을 이해하고 해석하기엔 모르는게 너무 많았던거지요. 그래서 회계를 공부하면 기업을 보는 눈이 정확해질 것이라 생각했습니다.

더해서, 개인적인 이유도 있었습니다. 대학 입시를 치르고 나니, 대학을 붙었다는 행복감보다 허탈감이 더 크게 왔습니다. 무언가 생산적인 일을 안하는 것에서 오는 무기력감 같은게 오더라구요. 제가 잘 못 노는 성격이라 그런 것 같은데, 워커홀릭 증세라면 차라리 좋겠습니다. 그래서 제 능력을 증명하려 하다보니깐 단기간에 딸 수 있는 회계관리 2급 자격증이 눈에 들어왔습니다.

그리고 한가지 플러스 요소라고 한다면, 공군에서 특기 배정을 할때 회계관리나 재경관리사 자격증을 보유하고 있으면 회계나 총무 쪽으로 빠질 확률이 높다고 합니다. 이제 내근직도 더 이상 꿀보직이라고 부르기는 힘들어졌다고 하지만, 헌급방보다는 훨씬 나을테니 일단 군 문제의 리스크를 헷지하는 차원에서라도 한번 준비해보기로 했습니다.

   
처음에는 회계원리 교재부터 사놓고 공부하다가, 12월 말부터 에듀윌 인강을 들으면서 본격적으로 준비했습니다. 강의료가 3개월에 7만원 정도인데, 90% 이상 수강 이후에도 불합격하면 다음 시험까지 강의를 연장해서 들을 수 있어서 괜찮다 생각했습니다. 물론 한번에 붙어야 겠다는 생각으로 준비하는게 정신건강에 좋습니다.


사실 저는 주식 투자를 하면서 재무제표를 대략 읽을줄은 알았던지라 초반에 개념을 잡는건 쉬웠습니다. 물론 그건 시작일 뿐이고, 분개부터는 순전히 반복적인 학습과 암기가 필요합니다. 특히 거래의 8요소를 완전히 이해하는게 중요합니다. 어느 계정항목이 차변 또는 대변으로 가야하는지 알아야만 분개가 맞아떨어지기 때문지요. 결국에는 모든 계정항목의 특성을 암기해서 분개를 할때 정확히 적용하는게 중요합니다. 그리고 이걸 가능케 하는건 반복적인 기출문제 분개 연습입니다.

참고로 말씀드리자면, 저는 분개에서 재고자산의 평가 부분에서 감모손실이나 평가손실환입을 하는 부분과 대손상각비를 설정하는 부분이 힘들었습니다. 무언가를 공정가치로 평가해서 깎는 부분이 어려웠는데, 이것도 몇번 샘플 문제를 풀어보니 감이 잡혔습니다.

더해서, 각각의 회계 용어들도 많이 암기해둬야 합니다. 항상 기출문제에 재고자산의 단가 계산이 출제가 되는데, 선입산출이나 후입산출법 같은 용어의 뜻을 모르면 계산도 할 수가 없습니다. 그 이외에도 미착상품, 시송품, 적송품 같이 재고자산의 종류도 자주 나옵니다. 물론 이것도 몇번 보고나니 괜찮았습니다.

그래서 제가 위에 말한 것처럼 성실하고 열심히 공부했냐고 묻는다면, 그랬을리가 없지요. 매일 컴퓨터 앞에 앉아서 몇번 책에 끄적이다가 잤습니다. 결국에 시험 전날까지 결산 마무리 부분을 진도를 빼고선 시험을 보러 갔습니다.


결론부터 말하자면, 몇가지 헷갈리는 문제들 이외에는 난이도는 평이했습니다. 회계관리 2급은 40문제 4지선다형에 시험 응시시간은 50분이고, 70점을 넘기면 합격입니다. 백석예대에서 시험을 봤는데, 시설은 그럭저럭 괜찮았습니다.

시험 문제에 대해서 얘기해보자면, 초반에는 기출문제에 나온 문제 유형들이 그대로 출제되서 많이 놀랐습니다. 특히 재고자산 단가 산출법은 매년 출제가 되더니, 올해도 선입산출법으로 방식만 바꿔서 물어봤습니다. 다른 문제들도 분개에 대해서 잘 이해하고 있다면 쉽게 풀 수 있었던 문제였습니다.

다만, 많이 어려웠던 문제도 몇개 있었습니다. 대부분 자본 부분에서 출제가 됬는데, 신주발행비의 차감 방식이나 미처분이익잉여금에서 현금 배당을 할때 분개하는 방법과 같은 부분에서 많이 헷갈렸습니다. 그리고 자산의 감가상각에서 정률법으로 감가상각하는 문제가 나와서 놀라기도 했습니다.

그래도 전반적으로 시험 난이도는 어렵지 않은 편이었고, 문제 수가 많아서 배점이 작아 합격은 확정짓고 있었습니다. 그래도 사람이란게 시험을 치고나니 불안한건 사실인지라, 결과를 기다리기로 마음 먹었습니다.

그리고 당연하게도, 시험장을 나오는 순간부터 회계에 관한 지식들은 실시간으로 삭제됬습니다. 지금은 이제 계정항목들도 몇개 기억이 안나고, 거래의 8요소조차도 가끔 차대변이 헷갈립니다.


다행히 예상대로 합격을 했습니다. 졸업식날 광림교회 벤치에 앉아서 연사 듣는동안 결과를 확인했는데, 졸업하는 것보다 더 행복했습니다. 무언가를 합격하는건 별것 아니더라도 기분 좋은 일입니다. 모의고사 풀때는 서너문제 밖에 안틀렸었는데, 이번에는 여섯 문제 정도를 틀려서 총 85점을 받았습니다.

만약 회계에 대해서 관심을 가지고 있고, 3주 정도의 시간을 투자할 생각이 있는 사람이라면 추천해주고 싶은 자격증입니다. 회계원리를 바탕으로 시험을 보는 만큼, 회계에 첫 입문을 하기 좋은 방법이라 생각이 듭니다.

이제 회계 자격증을 하나 처음으로 땄는데, 중급이나 고급회계를 공부해서 회계관리 1급과 재경관리사를 자격증을 따야할지는 고민입니다. 회계를 공부하면서 재미는 있었지만, 이게 과연 제 길인가는 아직 고민이 많거든요. 그래서 지금은 일단 보류해두고, 외환전문역 1종이나 US Enrolled Agent 같은 자격증들도 알아보면서 제 관심사를 찾아볼 예정입니다.

[기술] Binance 암호화폐 자산 현황을 파이 차트로 만들기

최근에 제 자산이 어떻게, 얼마나, 어느 비중만큼 있는지 다시 확인하는 작업을 하고 있었습니다. 사실 지난 고등학교 3년동안 투자는 해놓고선, 정작 자산이 어떻게 변동되는지 살펴보지 않았던게 사실입니다. 체크카드로 긁을 때마다 날라오는 통장 잔고만 보고선, 충분하다 생각하면 넘어가는 경우가 대부분이였죠.

이제서야 정신차리고 확인해보니, 암호화폐와 미국 증시는 대폭락장을 겪고 있었습니다. 세상은 변하는데 내 포트폴리오는 과거에 머물고 있었던 거죠. 당연히 리스크 헷지 같은 것이 될리가 없었고, 그대로 손실을 껴안고 있었습니다. 더 이상 이럴순 없다는 생각에, 주기적으로 자산 현황을 추적하는 일을 해야겠다는 생각이 들었습니다.

특히, 가장 시급한건 변동성이 큰 암호화폐였습니다. 대충 코딩을 해서라도, 내가 어떤 코인을 얼마나 가지고 있는지 시각화 해서 결과를 알아보고 싶어서 작업을 바로 시작하게 되었습니다. 올해 봄 즈음, 나름 알고리즘 트레이딩에 관심이 많아 Binance API를 만지작거린 경험이 있었습니다. 이동평균선 크로스와 볼린저 밴드를 이용한, 아주 단순한 알고리즘이었고, 당연히 수익은 내지 못했습니다. 그래도 잘 보관해놔서, 이번에 빠르게 꺼내다 쓸 수 있었습니다.

패키지 불러오기 및 설정
Binance API 데이터를 가져오기 위해 python-binance 패키지를 사용했습니다. 패키지 설명서는 여기서 확인할 수 있습니다. 사실 RESTful API를 통해서 직접 POST해서 가져올 수도 있지만, 이미 좋은 패키지가 있는데 그럴 이유가 전혀 없었습니다. 아무튼, 필요한 패키지들을 불러오고선 기본적인 설정들을 해줬습니다.

from binance.client import Client
import warnings
warnings.filterwarnings("ignore")
from matplotlib import pyplot as plt


그다음에는 가장 기본적으로 Client()에 API Key와 Secret 키를 입력해줘서 접근 권한을 얻도록 해줬습니다. 너무 빨리 타임아웃이 발생하지 않도록 넉넉히 100ms으로 잡아뒀습니다.

client = Client('Binance API Key', 'Binance Secret Key', {"verify": False, "timeout": 100})

 

비트코인 최근 가격 불러오기
이제부터 다양한 정보들을 직접 불러오는데, 가장 먼저 비트코인의 최신 가격을 불러왔습니다. 방법은 간단하게, 1분 단위 OHLCV Kline 과거 데이터 중에서 가장 최근 Close 가격을 가져오도록 해두었습니다. 즉, 가장 최근의 가격 정보를 쿼리하는 것입니다.

BTCPrice = float(client.get_klines(symbol='BTCUSDT',
                            interval=client.KLINE_INTERVAL_1MINUTE,
                            limit=1,
                            requests_params={'timeout':100})[0][4])


참고로 OHLCV 정보가 list in list 형태로 제공되기 때문에, 적절히 리스트에서 골라 써야 합니다. [0]을 통해서 첫번째이자 유일한 값에 접근하고, [4]로 1분 봉 마감가격인 Close에 접근했습니다.

# get_klines 출력값
[[
1499040000000, # Open time
"0.01634790", # Open
"0.80000000", # High
"0.01575800", # Low
"0.01577100", # Close -> List[0][4]
"148976.11427815", # Volume
1499644799999, # Close time
"2434.19055334", # Quote asset volume
308, # Number of trades
"1756.87402397", # Taker buy base asset volume
"28.46694368", # Taker buy quote asset volume
"17928899.62484339" # Can be ignored
]]

 

Binance 자산 현황을 불러 데이터 전처리하기
그 다음에는 내 Binance 거래소 지갑에 있는 자산 현황을 불러온다. 간단하게 get_account()를 통해 내가 가지고 있는 코인들과 잔고 수량을 확인할 수 있습니다. 자산 현황 정보는 dict in list in dict 형태로 주기 때문에, 적절히 내가 보유한 코인들과 잔고 수량을 볼 수 있게 접근해줘야 합니다.

AssetBalance = client.get_account()
#get_account 불러오기 샘플
{'makerCommission': 10,
'takerCommission': 10,
'buyerCommission': 0,
'sellerCommission': 0,
'canTrade': True,
'canWithdraw': True,
'canDeposit': True,
'updateTime': 1539110138808,
'balances': [{'asset': 'NEO', 'free': '0.00000000', 'locked': '0.00000000'}, {'asset': 'LTC', 'free': '0.00000000', 'locked': '0.00000000'}...]


간단하게는 Dict[‘balances’]로 먼저 접근하고선, for문으로 개별 딕셔너리를 조회하는 방법이 있습니다. 여기서 if절로 잔고 수량이 0 이상인 코인들만 거른 다음에 AvailableAsset이라는 리스트에 저장시켜줬습니다.

AvailableAsset = []
for Asset in AssetBalance['balances']:
    if float(Asset['free']) > 0:
        AvailableAsset.append(Asset)

 

그 다음에는 for문으로 AltPricePair라는 딕셔너리에 {코인명 : 코인 잔고 수량} 페어를 만들어 저장시켜줬습니다. 이를 위해, PairName에 000BTC 형식으로 환율 거래쌍 이름을 만들어 검색했습니다. 여기서 문제는 BTCBTC나 USDTBTC와 같은 거래쌍은 없는지라, 그대로 돌리면 BTC 잔고를 검색하려다 ‘그런 거래쌍은 없다’라는 에러가 뿜어져 나옵니다. 이를 해결하기 위해서, try-except문을 이용해서 에러가 나타나면 바로 패스하도록 만들었습니다.

이렇게 거래쌍을 통해 OHLCV 값을 불러오면, 해당 코인의 비트코인 기준 가격이 나옵니다. 이걸 해당 코인 수량만큼 곱해주면, 잔고 금액이 비트코인 기준으로 얼마나 있는지 알 수 있습니다. 하지만 우리는 비트코인보다 미국 달러가 익숙하기 때문에, 이전에 BTCPrice에 불러온 비트코인 가격을 여기다 곱해주면 미국 달러 기준 잔고량으로 변환 가능합니다. 이 값을 AltPricePair딕셔너리에 키-벨류 페어로 저장시켜 주도록 했습니다.

AltPricePair = {}
for Asset in AvailableAsset:
    PairName = Asset['asset'] + 'BTC'
    try:
        MinuteKlineRaw = client.get_klines(symbol=PairName,
                                           interval=client.KLINE_INTERVAL_1MINUTE,
                                           limit=1,
                                           requests_params={'timeout': 100})
        CurrentPrice = MinuteKlineRaw[0][4]
        AltPricePair[Asset['asset']] = float(CurrentPrice) * float(Asset['free']) * BTCPrice
    except:
        continue

이전에 BTCBTC나 USDTBTC와 같은 환율 거래쌍은 존재하지 않아 불러올 수 없다고 했습니다. 그렇다고 비트코인이나 미국 달러 자산 값을 빼고 알트코인들의 가치만 더할 수는 없습니다. 다행히도, get_asset_balance()라고 개별 코인에 대한 잔고 수량을 불러오는 함수가 있습니다. 비트코인은 잔고 수량을 불러서, 비트코인의 미국 달러 가격에 곱해줘서 잔고 금액을 MyBTCBalance에 저장합니다. 미국 달러화는 당연히 잔고 수량이 잔고 금액과 동일하니, 그대로 사용해 MyUSDTBalance에 저장합니다. 그리고 가장 중요한 알트코인의 가격, AltPricePair에 수많은 키-벨류 페어에서 values()를 통해 벨류 값들의 리스트를 구합니다. 그리고선 바로 sum()으로 그 합들을 MyAltBalance에 저장합니다.

마지막으로 MyBTCBalance, MyUSDTBalance, MyAltBalace 이 셋을 모두 더해주면, 내 Binance 자산의 총 합계를 미국 달러화 기준으로 볼 수 있습니다.

MyBTCBalance = BTCPrice * float(client.get_asset_balance('BTC')['free'])
MyUSDTBalance = float(client.get_asset_balance('USDT')['free'])
MyAltBalance = sum(AltPricePair.values())


먼저 AltPricePair에 있는 {코인명: 코인의 미국 달러 기준 잔고 금액} 딕셔너리 페어처럼, 비트코인과 미국 달러화도 똑같이 업데이트하여 저장해줍니다. 그러고선 혼동이 없도록, 이렇게 업데이트된 딕셔너리를 PricePair이라고 다시 이름 지어줍니다.

AltPricePair.update({'BTC' : MyBTCBalance})
AltPricePair.update({'USDT' : MyUSDTBalance})
PricePair = AltPricePair


Matplotlib을 통한 파이 차트 만들기
이제 데이터 전처리가 끝났으니, 자산의 코인별 비중을 시각화 시켜야합니다.
PricePair 딕셔너리에 코인명을 담고 있는 키 부분을 keys()를 통해, PriceKey에 리스트 형태로 저장한다. 또한, 코인의 미국 달러 기준 잔고 금액이 담겨있는 벨류 부분은 PriceValue에 values()로 리스트 형태로 저장합니다. 그러고선, 다시 PriceValue는 for문으로 소수점 2자리 이하 값으로 반올림을 시켜 예쁘게 만들어줍니다. 그럼 각각의 PriceKey와 PriceValue가 순서에 맞게 정갈한 리스트를 내놓습니다.

PriceKey = PricePair.keys()
PriceValue = PricePair.values()
PriceValue = [round(elem, 2) for elem in PriceValue]
#PriceKey와 PriceValue 리스트
dict_keys(['BNB', 'GAS', 'BAT', 'XRP', 'XLM', 'BTC', 'USDT'])
[0.04, 0.0, 212.14, 219.99, 129.67, 165.62, 0.0]


마지막으로 Matplotlib의 pie()를 통해 플롯해주는데, 그냥 PriceValue만 넣으면 아무 것도 없는 밍밍한 파이 차트가 나옵니다. 여기에 퍼센테이지를 값과 실제 잔고 금액을 표시하고 싶었습니다. 퍼센테이지는 autopct에 적당히 설정해주면 되지만, 실제 잔고 금액은 어떻게 넣나 고민이 많았습니다. 결국 Stackoverflow에 한 함수를 끌어와서, 잘 모르지만 일단 사용하게 됬습니다.

def make_autopct(values):
    def my_autopct(pct):
        total = sum(values)
        val = int(round(pct*total/100.0))
        return '{p:.2f}%  ({v:d})'.format(p=pct,v=val)
    return my_autopct


이걸 autopct에 넣어주고선, 레전드를 설정해줬더니 투박하지만 제 역할은 하는 파이 차트를 결국 띄울 수 있었습니다.


전체 코드

from binance.client import Client
import warnings
warnings.filterwarnings("ignore")
from matplotlib import pyplot as plt

client = Client('A94G89HZGqMF8niazexzsN7Vo8ygzVmvxAFbxtYH6IossrzIAtuPTgoj1k4iAXyq', 'wG18VxuQjGb8F33opQKJQX6EmWMuz0cwZPEh4aYTjxYmOF6NBNasUys5G6sEvOGa', {"verify": False, "timeout": 100})

BTCPrice = float(client.get_klines(symbol='BTCUSDT',
                            interval=client.KLINE_INTERVAL_1MINUTE,
                            limit=1,
                            requests_params={'timeout': 100})[0][4])

AssetBalance = client.get_account()
print(AssetBalance)

AvailableAsset = []
for Asset in AssetBalance['balances']:
    if float(Asset['free']) > 0:
        AvailableAsset.append(Asset)

AltPricePair = {}
for Asset in AvailableAsset:
    PairName = Asset['asset'] + 'BTC'
    try:
        MinuteKlineRaw = client.get_klines(symbol=PairName,
                                           interval=client.KLINE_INTERVAL_1MINUTE,
                                           limit=1,
                                           requests_params={'timeout': 100})
        CurrentPrice = MinuteKlineRaw[0][4]
        AltPricePair[Asset['asset']] = float(CurrentPrice) * float(Asset['free']) * BTCPrice
    except:
        continue



MyBTCBalance = BTCPrice * float(client.get_asset_balance('BTC')['free'])
MyUSDTBalance = float(client.get_asset_balance('USDT')['free'])
MyAltBalance = sum(AltPricePair.values())

AltPricePair.update({'BTC' : MyBTCBalance})
AltPricePair.update({'USDT' : MyUSDTBalance})

PricePair = AltPricePair

PriceKey = PricePair.keys()
PriceValue = PricePair.values()
PriceValue = [round(elem, 2) for elem in PriceValue]

print(PriceKey)
print(PriceValue)

def make_autopct(values):
    def my_autopct(pct):
        total = sum(values)
        val = int(round(pct*total/100.0))
        return '{p:.2f}%  ({v:d})'.format(p=pct,v=val)
    return my_autopct

plt.pie(PriceValue, labels=PriceKey, autopct=make_autopct(PriceValue))
plt.legend(PriceKey)
plt.show()

print(MyAltBalance + MyUSDTBalance + MyBTCBalance)

 

배운점
먼저, 코딩도 당분간 두통 때문에 그만둬야겠습니다. 정말 모니터 앞에 오래 앉아있으면 심한 번아웃이 옵니다. 블루라이트 때문인가도 싶습니다. 파이썬의 문법 면에서 배운점은, 딕셔너리는 리스트처럼 + 만으로 합쳐지지 않는다는 것입니다. 기존의 딕셔너리에 update()로 새 딕셔너리를 업데이트하여 더해줘야 합니다.

마지막으로, 사실 나는 초보자로 데이터 과학을 접하면서 허탈하다는 생각이 종종 듭니다. 그렇게 데이터 수집과 전처리 과정을 거쳐 내놓은 결과물이 고작 차트와 같은 시각화 자료입니다. 물론 데이터 과학에서 시각화는 일부분이고, 무엇보다 시각화된 자료에서 유의미한 상관관계를 찾아 사용자의 의사결정에 도움이 된다면 그 역할을 다한 셈이죠. 하지만, 개인적으로 짧은 프로젝트를 하면서 내가 데이터 과학이 정말 하고싶은지에 대해 다시 고민하게 된 것 같습니다.