ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [2강] 데이터 시각화(Matplotlib을 활용)
    기초지식/Quantopian(강의노트) 2024. 11. 2. 09:19
    반응형

    데이터 시각화 : Matplotlib 라이브러리

    Matplotlib은 파이썬의 데이터 시각화 라이브러리로, 데이터를 차트나 그래프 형태로 시각적으로 표현하는 데 사용된다. 설치는 anaconda prompt 나 cmd 창에서 "pip inatall matplotlib" 명령어를 입력하면 된다. 

    데이터 입수 : yfinance 라이브러리 사용

    yfinance는 야후 파이낸스 데이터를 파이썬에서 활용할 수 있게 해주는 라이브러리이다. 야후 파이낸스 (https://finance.yahoo.com/)를 직접 검색하여 찾아야 하는 정보를 파이썬에서 함수를 사용해서 받아볼 수 있게 되는 것이다. anaconda prompt 나 cmd 창에서 "pip inatall yfinance" 명령어를 통해서 설치가 가능하고, 라이브러리가 제공하는 세부 함수에 대한 설명은 yfinance 공식문서(https://pypi.org/project/yfinance/)에서 찾아볼 수 있다.

    이제 데이터 입수 작업을 하기 위해서 matplotlib 과 yfinance 라이브러리를 참조한다. matplotlib에서는 pyplot이라는 클래스 부분만 사용할 것이기 때문에 아래와 같이 matplotlib.pyplot이라고 참조를 걸어 준다. 

    import matplotlib.pyplot as plt
    import yfinance as yf

    데이터 입수는 yfinance 가 제공하는 download 함수를 사용하면 되는데, 변수에는 내가 찾고자할 종목의 ticker(종목별 티커는 야후파이낸스 홈페이지에서 알 수 있다), 데이터 시작일, 데이터 종료일을 넣어주면 된다. 데이터를 입수하면 아래 그림 1과 같이 조정 종가, 종가, 최고가 등 각 종목의 여러 가격이 나온다.

    그림1: yfinance 주가 추출하기

    데이터 시각화 작업에서 "조정 종가"만을 사용할 것이기 때문에 yfinance 의 download 함수로 얻어낸 데이터에서 "조정 종가"컬럼만 선택하는 부분까지 넣어주면, S&P500 ETF와 엔비디아의 2024년 조정 종가를 찾아오는 코드를 아래와 같이 완성할 수 있다. 

    start = "2024-01-01"
    end = "2024-09-30"
    data = yf.download(["SPY", "NVDA"], start=start, end=end)
    data = data["Adj Close"]
    data.head()

    히스토그램 활용

    수익률의 빈도 수 구하기

    S&P500 ETF 와 엔비디아의 2024년 조정 종가 데이터를 시각화하기 위해서 matplotlib을 사용해야 한다. 라이브러리를 사용해서 만든 그래프는 기본적으로 한글지원이 되지 않기 때문에 파라미터에 폰트를 추가해 주고, plt.hist 함수에 종목명과 구간의 수(bins)를 설정해 주면 히스토그램을 만들어볼 수 있다.

    # 종가의 빈도 수 구하기
    # 히스토그램
    plt.rcParams["font.family"] = "Malgun Gothic"
    plt.rcParams['axes.unicode_minus'] = False
    plt.hist(data["SPY"], bins=20)
    plt.xlabel("가격")
    plt.ylabel("대상일수")
    plt.title("가격의 빈도 수")

    data["SPY"]는 일자별 조정 가격을 나타내는 데이터이기 때문에 가로축은 가격이 된다. 위 코드에서 bins를 20으로 설정했기 때문에 가장 낮은 가격과 가장 높은 가격 범위에서 20개의 구간으로 그래프가 만들어진다. 그리고  data["SPY"]에서 일자별 조정 가격이 어느 구간에 들어가는지 분류를 한 결과가 아래 그림 2이다. 그림 2를 통해 가격이 어느 구간에 가장 많이 이 머물렀는지, 어느 가격의 빈도가 가장 적었는지 한 눈에 파악할 수 있다. S&P500은 500 초반 가격대, 540 가격대에 많이 분포해 있었다는 것을 알 수 있다.

    그림2: S&P500 ETF 히스토그램

    수익률의 빈도 수 구하기(누적분포 함수)

    S&P500 ETF의 일일 수익률을 이용해서 누적분포를 구할 수도 있다. data[""SPY"]에 pct_change()를 통해서 수익률데이터를 만들고 plt.hist 에 cumulative 조건을 통해서 누적분포를 그려볼 수 있다.  

    returns = data["SPY"].pct_change()[1:]
    plt.hist(returns , bins=20, cumulative=True)
    plt.xlabel("수익률")
    plt.ylabel("대상일수")
    plt.title("수익률의 누적 분포 수")

    아래 그림 3의 주황색 부분 막대기는 대상일 수가 75를 나타내고 있는데, 대상 기간 중에서 수익률이 0.00 이하인 일수의 누적치가 75일이라고 해석하면 된다.

    그림3: S&P500 수익률 누적분포 함수

    산점도 활용

    matplotlib의 scatter 기능을 이용해서 산점도를 그려볼 수도 있다. plt.scatter 함수에 S&P500의 일자별 데이터(data["SPY"])와 엔비디아의 일자별 데이터(data["NVDA"])를 넣으면 X축에는 S&P500의 일자별 데이터가 Y축에는 엔비디아의 일자별 데이터가 나온다. 이 데이터를 통해서 일자별 S&P500과 엔비디아 주가의 상관관계를 추측할 수 있다.

    # 산점도 데이터
    plt.scatter(data["SPY"], data["NVDA"])
    plt.xlabel("SPY")
    plt.ylabel("NVDA")
    plt.title("2024년 일일 가격")

    아래 그림 4를 보면, 삼성전자가 주가에 따라서 코스피가 같이 움직이는 것처럼 엔비디아와 S&P500 지수는 양의 상관관계가 있는 것을 알 수 있다.

    그림4: 산점도 그래프

    선형그래프 활용

    선형그래프를 활용하면 개별 주가의 일자별 움직임을 한 눈에 볼 수 있다. 선형그래프는 plt.plot 함수를 쓰면 되는데, 함수 안에 S&P500의 일자별 데이터(data["SPY"]) 등을 넣으면 된다.

    # 선형 그래프
    plt.plot(data["SPY"])
    plt.plot(data["NVDA"])
    plt.ylabel("가격")
    plt.legend(["SPY","NVDA"])

     

    아래 그래프를 통해 S&P500과 엔비디아 모두 2024년에 주가가 우상향했고, 두 종목의 가격이 비슷한 상관관계를 갖고 움직인다는 것을 파악할 수 있다. 

    그림5: 선형그래프

     

    반응형
Designed by Tistory.