[투자] 암호화폐 선물 투자 시장을 떠나며 배운 원칙

“아마 저보다 날리신 돈이 적으실텐데, 그만두시는게 이기는겁니다. 공부 열심히 하셔서 지키는 방식으로 투자하시길 권합니다. 100배 마진으로 하셨다면 진짜 도박하신건데, 이정도면 손도 대면 안됩니다.”

– 홍차넷에서 보게된 투자 조언

현재 비트코인 가격은 코로나-19에 인한 영향으로 6000달러 선이 무너지면서 24시간 동안 20% 이상 급락한 상태입니다. 어제까지도 그렇게 7500달러가 지지선이라고 외치고 다니던 애널리스트들은 다들 어디로 숨었는지 모르겠습니다.

그렇습니다. 이 글은 제가 암호화폐 선물 투자에 100배 마진을 쓰고선 포지션을 세 번 청산당하고선 배운 교훈들을 정확히 기억해두기 위해서 씁니다. 나의 총 재산의 약 25%을 손해봤으니 매우 비싼 교훈이라고 할 수 있을 것 같습니다.

1. 한번의 선택으로 대박치는 투자는 존재하지 않는다.
아니, 사실 대박치는 투자는 아마 있을 것입니다. 지금같은 시황을 예측하고 한 달 전에 S&P 500나 비트코인에 레버리지를 끌어다가 공매도를 쳤다던지 했다면 한방에 대박쳤겠죠. 제가 대략 계산해보니, 올해 초에 100배 레버리지를 끌어다가 1BTC에 숏포지션을 쳤다면 약 5억원 정도를 벌 수 있었습니다. 근데 그렇게 벌 사람이 얼마나 될까요? 최소한 내가 그렇게 벌 것이라고 상상하는 개꿈은 버리는 것이 좋습니다. 왜냐면 아주 높은 확률로 그렇게 벌기 전에 포지션이 청산될 확률이 훨씬 높기 때문이죠. 한마디로 비용-편익 분석해보면 결국 로또나 다를게 없다는 뜻입니다. 이것만 기억해도 돈을 잃지는 않는다.

2. 절대로 고배율 레버리지는 사용하지 않는다.
10배 이상의 레버리지를 끌어다 쓰는건 그야말대로 미친 짓입니다. 아무리 좋은 기회가 와도 제가 했던 것처럼 100배 레버리지를 끌어다 쓰면 안됩니다. 이건 카지노에 가서 전부 베팅하는 것이나 마찬가지입니다. 일단 100배 레버리지를 끌어다 쓰는 순간, 작은 변동성에도 청산 가격이 다가오면서 포지션 청산 위험에 노출되게 됩니다. 절대 르네상스 테크놀로지의 제임스 사이먼드가 와서 완벽한 퀀트 알고리즘을 개발해준 것이 아닌 이상, 10배 이상의 레버리지를 사용하지 말아야겠습니다.

3. 매매원칙을 세워두고 기계처럼 지킨다.
매매할 때 진입 시점만큼이나 중요한 것은 탈출 시점입니다. 언제 손절하고 익절할지 탈출 계획을 정해두고, 기계처럼 따르는 것이 중요합니다. 그 뿐만 아니라, 물타기를 할 것이라면 언제 얼만큼 물타기를 해서 평단가를 조정할 것인지도 계획을 세워둬야만 합니다. 그렇지 않으면 심리적인 변화에 따라서 뇌동매매를 하게 됩니다. 물론 특정 시점에 손절하거나 익절하는 것이 안타깝게 여겨질 수도 있습니다. 그치만 그렇게나마 매매원칙을 정해두지 않으면 시장을 이길 수 없는 것 같습니다. 이건 포지션을 세 번 청산 당해보고선 알게된 원칙입니다. 제발 미래에 임세준이 꼭 따라줬으면 좋겠습니다.

이번에 비싼 수업료를 내고 선물 투자 시장에서 도망가면서, 투자에 대한 많은 것들을 다시 배우게 되었습니다. 실전에서 배우는건 감회가 남다릅니다. 정말 워렌 버핏이 그렇게 주장하듯 잃지 않는 투자를 하는 것이 매우 중요하다는 것을 다시금 마음 아프게 배웁니다. 투자는 도박이 아니라 돈을 벌기 위한 수단이라는걸 상기하면서 투자해야겠습니다. 성투하시길 바랍니다.

[투자] 새롭게 시도해보고픈 투자 전략(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)로 제 성과를 평가해보고자 합니다.

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

[기술] 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()로 새 딕셔너리를 업데이트하여 더해줘야 합니다.

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