ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [파이썬] 가상화폐 포트폴리오 만들기
    기타/가상화폐 2021. 11. 28. 18:26
    반응형

    가상화폐를 단기 트레이딩 관점에서 접근하는 사람이 대다수이긴 하지만, 포트폴리오 관점에서 접근하는 사람도 있을 것이다. 

    그 경우 임의로 포트폴리오를 구성해서 수익률 추이를 확인하고 싶을텐데,

    파이썬을 활용하여 가상화폐의 포트폴리오를 만들어서 수익률 추이를 확인하는 방법을 알아보자. 

     

    사용할 라이브러리는 

    1. ccxt 

    2. matplotlib 

    3. datetime

    세 가지가 있다. 

     

    ccxt의 사용법을 잘 모른다면, 아래 글을 참고하면 된다. 

     

    파이썬으로 바이낸스에서 데이터 크롤링하기

    CCXT(CryptoCurrency eXchange Trading) 라이브러리를 이용하면 코인거래소에서 가격을 불러올 수 있다. 바이낸스뿐만 아니라 FTX나 고팍스, 빗썸 등도 지원하는데 코드 한 줄 바꾸는 것만으로 서로다른 거

    dndi117.tistory.com

    포트폴리오 구성 

    그레이스케일은 위와 같은 디파이 펀드를 운용 중이다. 시가총액 비중으로 10개의 종목을 포트폴리오에 담고 있다.

    나는 FTX를 통해서 이 포트폴리오를 복제해서 운용할 생각인데, 

    1. FTX에 없는 UMA를 제외하고 

    2. 총 9개의 종목을 동일가중으로 

    구성해볼 생각이다. 

    방법

    1. 각각의 종목의 데이터를 불러오기(일봉 종가 이용)

    ccxt의 사용법에 나온 함수대로 계산했다. 

    나는 set_period라는 함수를 정의해서 임의로 기간을 바꿔가며 계산하는 방법을 이용하는데 

    이 방법보다는 자기가 투자를 시작한 날로 설정해도 좋을 것이다. 

    그러는 경우에는 x대신에 해당 날짜를(예: 20211128) datetime 자료형으로 넣어주면 된다.

    그리고 포트폴리오의 전체 수익률을 저장할 portfolio_reutrn 리스트를 만들어서 전체 기간에 날마다 1을 입력해줬다. 

     

    crypto.get_df_ftx는 위의 데이터 크롤링 글에 나온 것과 동일한 함수다. FTX의 데이터를 이용한다는 것만 다르다. 

    def get_df_ftx(ticker,time_interval):
        '''
        ccxt를 이용해서 ftx에서 데이터 조회 후 df 반환 
        '''
        import ccxt 
        import pandas as pd 
        import datetime
        ftx = ccxt.ftx() 
        data = ftx.fetch_ohlcv(ticker,time_interval)
        df = pd.DataFrame(data)
        df.columns = (['Date','Open','High','Low','Close','Volume'])
        def parse_dates(ts):
            return datetime.datetime.fromtimestamp(ts/1000.0)
        df['Date'] = df['Date'].apply(parse_dates)
        df = df.set_index(df['Date'])
        del df['Date']
        return df

     

    2. 가격을 수익률로 고치고, 누적곱 이용해서 누적수익률 계산

    pct_change메서드를 이용하면 간단하게 일별 수익률을 계산할 수 있다. 

    어느 날 5%가 올랐다면 수익률은 0.05다. 여기에 1을 더한 1.05는 잔고의 변화를 나타낸다. 

    100달러만큼 투자했다면 거기에 1.05를 곱한 105달러가 그날의 잔고가 되는 것이다. 

     

    cumpord메서드는 누적곱을 계산해준다. 1.xxx형태로 일별 수익률이 저장된 데이터를 넘겨주면

    매일의 수익률에 수익률을 곱하면서 일별로 누적수익률을 알 수 있다.

     

    우리는 포트폴리오를 동일가중으로 투자할 것이므로,

    수익률을 종목 수로 나눠준 것이 어느 한 종목에서의 수익률이 될 것이다. 

    따라서 pct_change로 구한 수익률을 종목 개수로 나눠주고 1을 더한 값을 cumprod한 값이 포트폴리오에서의 개별 종목의 수익률이고

    이를 전부 portfolio_return에 곱하면 포트폴리오 전체의 수익률이 나오게된다 

     

    이를 모두 정리하면 아래와 같다 

    def get_portfolio_return(portfolio,period=1):
        x,y = set_period(period)
        portfolio_return = [1 for _ in range((datetime.datetime.today() - x).days + 1)]
        for i in portfolio:
            df = crypto.get_df_ftx(i,'1d')['Close'][x:]
            portfolio_return *= (1+df.pct_change()/len(portfolio)).cumprod()
        return portfolio_return

    3. 결과

    티커를 리스트에 넣어서 함수에 전달해주면 아래와 같이 플롯할 수 있다.

    FTX의 경우 무기한선물계약의 티커는 '-PERP'의 형태로 되어있다. 

    반응형

    댓글

Designed by Tistory.