TIL | FinanceDataReader를 통한 여러 종목 수익률 비교

Table of Contents

TIL | FinanceDataReader를 통한 여러 종목 수익률 비교

👩🏻‍💻 오늘코드 실시간 강의 _ 박조은 강사님

FinanceDataReader 라이브러리를 이용해 실시간 주식 데이터를 가져올 수 있다.


📑 이론 및 개념

  • Jupyter lab은 좀 더 진화된 버전
  • 실습은 Jupyter notebook으로 진행
  • ais7-likelion > ais7 > ‘경로 확인.ipynb’
    • %pwd : 현재 작업 중인 디렉터리 확인
    • 강의 교안 보고 jupyter extension 설치해보기
  • Jupyter notebook에서 도움말 보기 : Shift + Tab + Tab
FinanceDataReader를 통한 수익률 비교를 위해 필요한 조각 코드
  • esc + o : output 숨기기
  • FinanceDataReader
    • 설치 : !pip install -U finance-datareader
    • 버전 확인
      import FinanceDataReader as fdr
      fdr.__version__
      
  • KRX 일부 종목 가져오기
    fdr.StockListing(KRX)
    
  • 일별 시세 수집 위해 종목코드 찾기
    • left -> df_top10 / right -> df_krx
        df_top10.merge(df_krx, left_on = "종목별", right_on = "Name")
      
  • 일별 시세 수집
    # 카카오 035720 
    fdr.DataReader("035720", "2022")["Close"]
    
  • 여러 종목의 종가 수집
    • list comprehension을 이용하자
      item_list = [fdr.DataReader(sym, "2022")["Close"] for sym in df_10["Symbol"]]
      
시각화를 위한 폰트 설정
  • Koreanize-matplotlib
  • 설치 코드 : !pip install koreanize-matplotlib
      import koreanize_matplotlib
      # 그래프에 retina display 적용
      %config InlineBackend.figure_format = 'retina'
    
Graph로 시각화하기
  • 가능한 style 종류 보기
    import matplotlib.pyplot as plt
    print(plt.style.available)
    
  • 그래프 그리기
    plt.style.use("ggplot")
    df.plot(figsize = (10,5), title = "2022년 TOP 10 종목 종가")
    
  • 범례 위치 바꾸기
    plt.legend(bbox_to_anchor = (1,1))
    
  • 기준선 표시
    plt.axhline(0, c = 'k')
    
    • k : black
    • r : red
    • b : blue

2022_top10

🤔 pandas plot VS matplotlib

pandas plot이 matplotlib보다
더 한 눈에 알아보기 쉽고 좀 더 간단하게 그래프를 그릴 수 있다.

왜도와 첨도 skewness and kurtness
  • 왜도 : 양의 값이면 오른쪽 꼬리가 길고, 음의 값이면 왼쪽 꼬리가 길다.
    df_norm.skew()
    
  • 첨도 : 3보다 작으면 완만 납작, 3보다 크면 뾰족한 분포
    df_norm.kurt()
    
Resampling
  • 월별로
    df_norm.resample(M).median()
    
  • 분기별로
    df_norm.resample(Q).median()
    

    df_norm_Q

    df_norm['삼성전자'].resample("Q").agg(["mean", "median"])
    

    df_norm_Q_agg


🚗 실습 예제 코드 🚙

여러 종목 한 번에 시각화하기
# 2개의 종목 비교하기 : "삼성전자", "LG화학" 을 plot으로 시각화 합니다.
df[["삼성전자", "LG화학"]].plot()

sam_lg

삼성과 LG화학의 종가 scale이 다르기 때문에 위처럼 시각화하면 LG화학의 변화를 알기 어렵다. scale을 맞춰주기 위해 추가로 보조축을 지정해주자.

# secondary_y를 사용해 2축 그래프 그리기
df[["삼성전자", "LG화학"]].plot(secondary_y = "LG화학")

sam_lg_secondary

전체 종목 수익률 시각화

1. 상장종목 목록 가져오기

url = "https://finance.naver.com/sise/entryJongmok.naver?&page=1"
df_top10 = pd.read_html(url)[0].dropna()
df_top10

df_top10

2. 전체 상장종목에서 종목코드와 종목명만 가져오기

df_krx = fdr.StockListing("KRX")
df_krx

df_krx

df_krx = df_krx[["Name", "Code"]]
df_krx

df_krx_name_code

3. 국내 TOP 10 종목만 가져오자.

for sym in df_10["Code"]:
    print(sym)

item_list = [fdr.DataReader(sym, "2022")["Close"] for sym in df_10["Code"]]

# 수집한 리스트를 axis=1(컬럼)을 기준으로 병합(concat) 합니다.
df = pd.concat(item_list, axis = 1)
df.columns = df_10["Name"]
df

df_merge_item_lst

4. 전체 DataFrame 값에 대한 수익률 계산하기

LG에너지솔루션은 최근에 상장해서 이전의 데이터가 없다. 계산할 때 따로 처리를 해주자.

df_norm = df / df.iloc[0] - 1
df_norm["LG에너지솔루션"] = df["LG에너지솔루션"].dropna() / df["LG에너지솔루션"].dropna()[0] - 1
df_norm

df_norm

# df_norm 변수에 담긴 전체 종목에 대한 수익률을 시각화 합니다.
df_norm.plot(figsize = (10,5), title = "2022년 TOP 10 종목 수익률")
plt.axhline(0, c = 'k') # black -> k
plt.legend(bbox_to_anchor = (1,1))

2022_top10

다음 포스트에서 만나요 🙌

뒷 내용은 TIL | FinanceDataReader를 통한 여러 종목 daily price 비교에서 이어서 작성한다. FinanceData를 이용해 여러 종목 수익률을 plotly로 시각화를 해볼 예정이다.

 

Related Posts



💙 You need to log in to GitHub to write comments. 💙
If you can't see comments, please refresh page(F5).