Python/금융 데이터 분석 FDR

[FinanceDataReader] 이동평균선 및 골든&데드크로스

비전공생's 2022. 3. 3. 18:39

 

라이브러리 불러온 후, 데이터 살펴보기

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import FinanceDataReader as fdr
  • 네이버주식 코드번호: 035420
#네이버주식
df = fdr.DataReader("035420")
df.head()
df.tail()

 

종가(Close)를 이용해 이동평균선 값 구하기

이동평균선(Moving Average)

: 일정기간 동안의 주가를 산술 평균한 값인 주가이동평균을 차례로 연결해 만든 선으로, 장기(120일), 중기(60일), 단기(5,20일) 이동평균선이 있다.

df=df[['Close']]

df['MA_5'] = df['Close'].rolling(window=5).mean()
df['MA_10'] = df['Close'].rolling(window=10).mean()
df['MA_20'] = df['Close'].rolling(window=20).mean()
df['MA_60'] = df['Close'].rolling(window=60).mean()
df['MA_120'] = df['Close'].rolling(window=120).mean()

df

  • 이동평균선 120일과 종가 2가지만 비교해보기
fig = plt.figure(figsize=(20,10))

plt.plot(df.index, df["MA_120"])
plt.plot(df.index, df["Close"])

  • 그래프에 legend, 컬러, 라벨 등 추가해주기
fig = plt.figure(figsize=(20,10))

plt.plot(df.index, df["MA_120"], label="Moving Average")
plt.plot(df.index, df["Close"], label="Close")
plt.xlabel("Date")
plt.ylabel("Price")
plt.title("NAVER: Close and Moving Average")
plt.legend(loc="upper left")

 

골든크로스&데드크로스

이동평균선을 그려나가다 보면 서로 교차하게 된다. 단기선이 장기선을 뚫고 오르거나 내리거나 한다. 교차로처럼 평균선들이 만나기에 크로스라고 하고, 골든크로스나 데드크로스가 나타나는 것이다.

 

  • 이동평균선 데이터프레임만 따로 만들어 그래프 출력해보기
column_list = ["MA_20", "MA_120", "Close"]
stock_df = fdr.DataReader("035420")
plt.figure(figsize=(20,10))
plt.plot(stock_df.Close)

 

  • 단기/장기 이동평균선과 종가 그래프 출력해보기
def SMA(data, period=30, column="Close"):
    return data[column].rolling(window=period).mean()

stock_df["ShortSMA"] = SMA(stock_df, 20)
stock_df["LongSMA"] = SMA(stock_df, 120)

column_list = ["ShortSMA", "LongSMA", "Close"]
stock_df[column_list].plot(figsize=(20,10))
plt.title("Death/Golden Cross")

 

  • 골든&데드크로스 알림 만들기

: for문을 이용하여 분석하려는 종가 데이터 전체 중에 단기 이동평균이나 장기 이동평균이 교차되는 지점이 오면, print문으로 그때의 날짜와 함께 특정 문구를 출력하게 한 것이다.

def death_golden_cross():
    first_cross = 0
    for i in range(0, len(stock_df)):
        if stock_df["ShortSMA"][i] < stock_df["LongSMA"][i] and first_cross==0:
            print("Death crosss on day", stock_df.index[i], ":하락예상")
            first_cross=1
        elif stock_df["ShortSMA"][i] > stock_df["LongSMA"][i] and first_cross==1:
            print("Golden cross on day", stock_df.index[i], ':상승예상')
            first_cross=0

death_golden_cross()

→ 2021년 10월에 데드크로스가 있었으니, 그 이후 하락했을 것으로 예상된다.