본문 바로가기
파이썬과 주식

10. 파이썬 반복문을 이용한 주가 데이터 한꺼번에 다운로드 (2)

by 에쓰지 2022. 9. 6.

지난회차에서 반복문을 이용하여 여러 종목을 한꺼번에 다운로드 받아봤습니다.

2022.09.01 - [파이썬과 주식] - 9. 반복문을 이용하여 여러 종목 주가 데이터 받기(1)

 

9. 반복문을 이용하여 여러 종목 주가 데이터 받기(1)

※ 늦게라도 "코딩을 배워여겠다는 사람이 있다면 혹시라도 도움일 될까해서 그 동안 알게 된 내용을 공유하려고 합니다. 지난 회차에 판다스 describe( ) 함수와 resample( ) 함수를 이용해 데이터의

pmxsg.tistory.com

이번 회차에는 반복문을 이용하여 이동평균 및 그래프를 한꺼번에 생성하는 법을 알아보겠습니다.

지난 회차 완성된 코드 입니다.

import FinanceDataReader as fdr

stocks = { "sk이노베이션" : "096770", "현대모비스":"012330","SK":"034730" }

for i in stocks:
    code = stocks[i]
    df = fdr.DataReader(code,'2021-01-01','2022-08-31')
    df.to_csv(f"{i}.csv")

 


1. 이동평균 추가하기

 

이동평균을 추가하는 코드는 아래와 같습니다.

2022.06.15 - [파이썬과 주식] - 4. 주가 데이터에 이동 평균 추가하기 feat. 판다스 Pandas

 

4. 주가 데이터에 이동 평균 추가하기 feat. 판다스 Pandas

※ 늦게라도 "코딩"을 배워봐야겠다는 사람이 있다면 혹시라도 도움이 될까 해서 그 동안 알게 된 내용을 공유하려고 합니다. 저는 50대이고 코딩시작은 2021년 11월 부터입니다. 이제 코딩이란 것

pmxsg.tistory.com

import FinanceDataReader as fdr

df = fdr.DataReader('034730','2021-01-01','2022-08-31')
df.rename(columns={"Close":"종가","Volume":"거래량"},inplace = True)
df.insert(5,'등락',df['종가'].diff())
df['5일_이동평균']=df['종가'].rolling(5).mean().round(0)
df['20일_이동평균']=df['종가'].rolling(20).mean().round(0)
df['60일_이동평균']=df['종가'].rolling(60).mean().round(0)
df['120일_이동평균']=df['종가'].rolling(120).mean().round(0)
df = df[['종가','등락','거래량','5일_이동평균','20일_이동평균','60일_이동평균','120일_이동평균']]
df

 

원래의 코드에서 종목코드를 SK의 종목코드를 넣었습니다.

소숫점 이하 자리를 반올림 하기 위해서 round( 0 ) 함수를 추가했습니다. 


나온 결과에서 보면 이동평균에 NaN으로 결측치들이 있는 것이 보입니다.

이 결측치를 제거하는 함수가 있습니다.

▶ dropna ( ) : 결측치가 있는 행을 제거해 줍니다. 

  - how = "any" : 1개라도 결측치(NaN)이 있다면 행 제거 

  - how = " all " : 모두 결측치(NaN)라면 행제거

 -  default 값은 "any" 입니다. dropna( )를 이용해서 결측치를 없애보겠습니다.

import FinanceDataReader as fdr

df = fdr.DataReader('034730','2021-01-01','2022-08-31')
df.rename(columns={"Close":"종가","Volume":"거래량"},inplace = True)
df.insert(5,'등락',df['종가'].diff())
df['5일_이동평균']=df['종가'].rolling(5).mean().round(0)
df['20일_이동평균']=df['종가'].rolling(20).mean().round(0)
df['60일_이동평균']=df['종가'].rolling(60).mean().round(0)
df['120일_이동평균']=df['종가'].rolling(120).mean().round(0)
df = df[['종가','등락','거래량','5일_이동평균','20일_이동평균','60일_이동평균','120일_이동평균']]
df = df.dropna()
df


 

이제 반복문 코드에 위 코드를 넣고 한꺼번에 자료를 생성해보겠습니다.

import FinanceDataReader as fdr

stocks = { "sk이노베이션" : "096770", "현대모비스":"012330","SK":"034730" }

for i in stocks:
    code = stocks[i]
    df = fdr.DataReader(code,'2021-01-01','2022-08-31')   
    df.rename(columns={"Close":"종가","Volume":"거래량"},inplace = True)
    df.insert(5,'등락',df['종가'].diff())
    df['5일_이동평균']=df['종가'].rolling(5).mean().round(0)
    df['20일_이동평균']=df['종가'].rolling(20).mean().round(0)
    df['60일_이동평균']=df['종가'].rolling(60).mean().round(0)
    df['120일_이동평균']=df['종가'].rolling(120).mean().round(0)
    df = df[['종가','등락','거래량','5일_이동평균','20일_이동평균','60일_이동평균','120일_이동평균']]  
    df = df.dropna(how='any')
        
    df.to_csv(f"{i}_이동평균.csv")

sk이노베이션_이동평균.csv
0.02MB
현대모비스_이동평균.csv
0.02MB
SK_이동평균.csv
0.02MB

이동평균 코드를 그대로 반복문 안에 넣어주면 3 개의 이동평균을 포함한 CSV 파일이 생성되는 것을 확인할 수 있습니다.

주의할 점은 들여쓰기 간격을 똑같이 맞추어야 합니다.


2. 그래프 추가하기

 

이동평균 그래프를 그리는 법은 아래에서 알아봤습니다.

2022.07.16 - [파이썬과 주식] - 7. 주가 데이터 그래프 그리기(2) feat. Matplotlib

 

7. 주가 데이터 그래프 그리기(2) feat. Matplotlib

※ 늦게라도 "코딩"을 배워야겠다는 사람이 있다면 혹시라도 도움이 될까해서 그동안 알게 된 내용을 공유하려고 합니다. 지난 회차에 맵플로립(Matplotlib)을 이용하여 주가 데이터의 그래프를 그

pmxsg.tistory.com

 < 실행 코드 >

import pandas as pd

import matplotlib
matplotlib.rcParams['font.family'] ='Malgun Gothic'
matplotlib.rcParams['font.size'] = 15 
matplotlib.rcParams['axes.unicode_minus'] = False 

import matplotlib.pyplot as plt

df = pd.read_csv("SK_이동평균.csv")

plt.figure(figsize=(15,10))
plt.plot(df["Date"],df["종가"], color="navy" , linewidth = 3)
plt.plot(df["Date"],df["5일_이동평균"],label = "5일")
plt.plot(df["Date"],df["20일_이동평균"],label = "20일")
plt.plot(df["Date"],df["60일_이동평균"],label = "60일")
plt.plot(df["Date"],df["120일_이동평균"],label = "120일")
plt.title("SK 주가", color = "blue", fontsize = 25, fontweight = "bold")
plt.xticks([1,30,60,90,120,150,180,210,240],rotation = 45 )
plt.xlabel("기간", color= "green" , loc = "right")
plt.ylabel("단위 : 원", color = "red", loc = "top")
plt.legend(loc = "upper right",labelcolor = 'linecolor')
plt.grid(axis='y')
plt.savefig("SK.png")

 

이동평균 코드를 반복문 안에 넣었듯이, 그래프 그리는 코드를 반복문 안에 넣어주면 됩니다.

import FinanceDataReader as fdr
import pandas as pd
import matplotlib
matplotlib.rcParams['font.family'] ='Malgun Gothic'
matplotlib.rcParams['font.size'] = 15 
matplotlib.rcParams['axes.unicode_minus'] = False 
import matplotlib.pyplot as plt

stocks = { "sk이노베이션" : "096770", "현대모비스":"012330","SK":"034730" }

for i in stocks:
    code = stocks[i]
    df = fdr.DataReader(code,'2021-01-01','2022-08-31')   
    df.rename(columns={"Close":"종가","Volume":"거래량"},inplace = True)
    df.insert(5,'등락',df['종가'].diff())
    df['5일_이동평균']=df['종가'].rolling(5).mean().round(0)
    df['20일_이동평균']=df['종가'].rolling(20).mean().round(0)
    df['60일_이동평균']=df['종가'].rolling(60).mean().round(0)
    df['120일_이동평균']=df['종가'].rolling(120).mean().round(0)
    df = df[['종가','등락','거래량','5일_이동평균','20일_이동평균','60일_이동평균','120일_이동평균']]  
    df = df.dropna(how='any')
        
    df.to_csv(f"{i}_이동평균.csv") 
    
    df = pd.read_csv(f"{i}_이동평균.csv")
    
    
    plt.figure(figsize=(15,10))
    plt.plot(df["Date"],df["종가"], color="navy" , linewidth = 3)
    plt.plot(df["Date"],df["5일_이동평균"],label = "5일")
    plt.plot(df["Date"],df["20일_이동평균"],label = "20일")
    plt.plot(df["Date"],df["60일_이동평균"],label = "60일")
    plt.plot(df["Date"],df["120일_이동평균"],label = "120일")
    plt.title(f"{i} 주가", color = "blue", fontsize = 25, fontweight = "bold")
    plt.xticks([1,30,60,90,120,150,180,210,240,270,300],rotation = 45 )
    plt.xlabel("기간", color= "green" , loc = "right")
    plt.ylabel("단위 : 원", color = "red", loc = "top")
    plt.legend(loc = "upper right",labelcolor = 'linecolor')
    plt.grid(axis='y')
    plt.savefig(f"{i}.png")

sk이노베이션.png
0.12MB
현대모비스.png
0.11MB
SK.png
0.12MB

 

종목명이 들어갈 자리에 f-string을 이용하여 f"{ i } " 를 삽입해 주면, 반복문이 실행될 때, 변수 stocks 안에 key값을 하나씩 반환합니다.


반복문은 프로그램 내에서 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어하는 실행문입니다.

아마도 컴퓨터가 제일 잘하는 것이 반복하는 것일 겁니다.  사람은 반복을 하다보면 싫증이 나기도 하지만, 컴퓨터는 프로그램만 입력해 주면 불평없이 끊임없이 반복할 수 있습니다.

위 코드 stocks 안에 원하는 종목과 종목코드만 추가로 넣어주면 원하는 만큼 주가 데이터를 얻을 수 있을 것입니다.  또한 반복시키고 싶은 작업을 반복문안에 넣으면 더 많은 데이터를 얻을 수 있습니다.

댓글