지난회차에서 반복문을 이용하여 여러 종목을 한꺼번에 다운로드 받아봤습니다.
2022.09.01 - [파이썬과 주식] - 9. 반복문을 이용하여 여러 종목 주가 데이터 받기(1)
이번 회차에는 반복문을 이용하여 이동평균 및 그래프를 한꺼번에 생성하는 법을 알아보겠습니다.
지난 회차 완성된 코드 입니다.
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
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")
이동평균 코드를 그대로 반복문 안에 넣어주면 3 개의 이동평균을 포함한 CSV 파일이 생성되는 것을 확인할 수 있습니다.
주의할 점은 들여쓰기 간격을 똑같이 맞추어야 합니다.
2. 그래프 추가하기
이동평균 그래프를 그리는 법은 아래에서 알아봤습니다.
2022.07.16 - [파이썬과 주식] - 7. 주가 데이터 그래프 그리기(2) feat. Matplotlib
< 실행 코드 >
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")
종목명이 들어갈 자리에 f-string을 이용하여 f"{ i } " 를 삽입해 주면, 반복문이 실행될 때, 변수 stocks 안에 key값을 하나씩 반환합니다.
반복문은 프로그램 내에서 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어하는 실행문입니다.
아마도 컴퓨터가 제일 잘하는 것이 반복하는 것일 겁니다. 사람은 반복을 하다보면 싫증이 나기도 하지만, 컴퓨터는 프로그램만 입력해 주면 불평없이 끊임없이 반복할 수 있습니다.
위 코드 stocks 안에 원하는 종목과 종목코드만 추가로 넣어주면 원하는 만큼 주가 데이터를 얻을 수 있을 것입니다. 또한 반복시키고 싶은 작업을 반복문안에 넣으면 더 많은 데이터를 얻을 수 있습니다.
'파이썬과 주식' 카테고리의 다른 글
11. 파이썬 반복문을 이용한 주가 비교 (1) | 2022.09.13 |
---|---|
9. 파이썬 반복문을 이용하여 여러 종목 주가 데이터 받기(1) (1) | 2022.09.01 |
8. 주가 데이터 분석하기 feat. Pandas-describe( ),resample( ) (0) | 2022.07.29 |
7. 주가 데이터 그래프 그리기(2) feat. Matplotlib (0) | 2022.07.16 |
6. 주가 데이터 그래프 그리기 (1) feat. Matplotlib (0) | 2022.07.11 |
댓글