2021. 8. 2. 19:53ㆍSoft_Ware/Python
이번 블로그는 파이썬을 이용한 주식 데이터 분석에 관한 글이다.
우선 주식에 관해서 기초적으로 알아야 하는 지식이 있는데, 주식에는 주식마다 종목 코드가 존재한다.
또한 그 종목코드는 6자리로 정해져 있다.
ex)134123, 002345 등
따라서 우리가 다룰 주식 데이터에 대해서도 종목코드가 존재하는데 코드의 숫자가 6자리라는 것을 유의해야한다.
필자가 가지고 있던 주식 데이터에는 회사명, 종목코드, 업종, 주요 제품 등 여러가지 칼럼이 있었고, 회사명, 종목코드 칼럼만 추출하는 파이썬 문법은 다음과 같다.
import pandas as pd
import matplotlib.pyplot as plt
아, 우선 가장 상단에 패키지를 import 해줘야 한다.
code = cd.read_csv('data path')
code = code[['회사명', '종목코드']]
대괄호 [] 를 통하여 사용자가 원하는 칼럼의 데이터만 추출이 가능하다.단, 여기서 칼럼 명은 정확히 기입해줘야 한다.
그 후에 사용자가 원하는 칼럼의 이름으로 바꾸는 문법인 rename 도 있다.
code_result = code.rename(columns = {'회사명':'corp', '종목코드':'Code'}
여러가지 주식 데이터 중에 우리가 흔히 아는 회사인 카카오의 주식에 관한 데이터를 추출하는 예제를 보자
corp_name = "카카오"
condition = "corp == '{}'".format(corp_name)
kakao = code_result.query(condition)
kakao = kakao['Code']
kakao_string = kakao.to_string(index = False)
kakao_string = kakao_string.strip()
kakao_string = kakao_string.rjust(6,'0')
코드를 한줄씩 들여다 보면, 변수에 카카오라는 string 변수를 대입해주고 format와, query 문법을 통하여 카카오라는 회사명의 주식 데이터를 추출한다.
format, query문법
- format
파이썬 문자열 함수인 format함수는 format앞의 중괄호{} 안에 포매팅을 지정하고 format함수의 인자로 값들을 넣는 형식이다.
ex) '{index1}, {index2}.format(value1, value2)'
위와 같은 표현은 {value1},{value2}의 표현을 만든다.
우선 위와 같은 format함수를 통하여 condition에는 "crop = '카카오'"라는 문자열이 대입된다.
- query
파이썬 라이브러리인 pandas의 query함수는 조건에 부합하는 데이터를 추출할 때 사용한다.
query함수는 다음 6가지 기능을 포함한다.
1) 비교 연산자( ==, >, >=, <, <=, != )
2) in 연산자( in, ==, not in, != )
3) 논리 연산자(and, or, not)
4) 외부 변수(또는 함수) 참조 연산
5) 인덱스 검색
6) 문자열 부분검색
code.result.query(condition)이라는 코드는 code.result라는 변수, 즉 우리가 위에서 추출한 주식 데이터에서 corp가 '카카오'인 데이터를 추출하는 코드인 셈이다.이는 5번 기능에 해당한다.
이 외의 예로는
str_if = "code > 40030"
data_code = data.query(str_if)
와 같은 코드가 있으며 , str_if에 조건이 되는 문자열을 대입하고 이를 query함수 인자로 넣어주면 DataFrame에서 원하는 조건의 데이터를 추출하는 기능을 해준다.
이어서 코드를 보면,
kakao_string = kakao.to_string(index = False)
-->to_sting(index = False)는 정수 형태의 코드를 문자열로 바꾼 후 맨 앞 칼럼의 인덱스가 자동적으로 생성되는 것을 막아준다.
kakao_string = kakao_string.strip()
-->pandas의 strip함수를 통하여 앞뒤 공백을 제거해준다.
kakao_string = kakao_string.rjust(6,'0')
-->pandas의 rjust함수를 통하여 첫번째 인자는 지정길이이고,두번째 인자는 빈 자리를 채울 문자이다.따라서 필자는 6자리로 길이를 지정하고 빈 자리를 0으로 채우도록 하였다.
--> 주식코드가 6자리이고 340과 같은 6자리가 안되는 문자들은 앞에 0을 붙여줘야 하기 때문이다.
- Pandas_datareader
파이썬, 판다스에는 웹 상에 존재하는 데이터를 판다스에서 제공하는 데이터 프레임으로 만들어주는 기능을 하는 Pandas_datareader패키지가 있다.
우리가 주식 데이터와 같이 방대하고 실시간으로 변화하는 데이터에 대해서는 제공되어 있는 웹사이트의 데이터를 이용하면 수월하게 데이터를 불러올 수 있다.
우선 필자는 아나콘다를 이용하여 파이썬을 이용하기에 다음과 같은 명령어를 주피터 노트북 상에서 실행해 주었다.
conda install -c anaconda pandas-datareader
-c anaconda라는 conda install의 옵션은 채널 옵션에 anaconda를 주어 패키지를 다운로드 한다는 의미이다.
-c의 의미는 channel
anaconda는 default channel로 이해하면 될 것이다.
채널은 참고로 아나콘다 상에서 패키지가 저장되어 있는 위치이다.
import pandas_datareader.data as web
kakao_stock_df = web.DataReader(kakao_code,'naver')
pandas의 datareader.data 패키지를 import 하고 DataReader함수를 통하여 카카오의 종목코드를 가지고 naver에서 주식 데이터를 가져오는 코드이다.
다음과 같이 Open, High, Low, Close, Volume 그리고 Date까지 여러 정보가 담겨져 있다.
자, 여기까지 이제 데이터 추출은 거의 끝났고 사용자가 원하는 데이터, 즉 여기서는 칼럼을 가지고 시각화를 진행하면 된다.
이전까지는 matplotlib를 가지고 시각화를 진행하였다면 이번에는 pandas에서 제공하는 dataframe의 plot함수를 이용하여 시각화를 진행해보았다.
시각화 전에, 필자는 Close칼럼을 이용하여 데이터 시각화를 하기 위해서 Close칼럼을 추출하는 코드를 작성하였다.
kakao_stock_df['Close'] = kakao_stock_df['Close'].astype(int)
##여기서 astype(int)라는 타입변환 함수를 추가하지 않으면 plot함수의 타입 에러가 발생한다.
다음과 같이 Date에 따른 주식의 Close 데이터를 확인할 수 있다.(Close데이터는 하루의 주식 시장(?)이 닫혔을때의 데이터를 의미)
이제, 카카오의 주식이 아닌 여러 회사들의 주식정보를 얻어오는 코드를 작성해보자.
앞서 진행한 회사의 종목코드를 얻어오는 과정에 있어서 필자는 함수가 필요하다고 생각하였다.
def get_code(code_result, corp_name):
condition = "corp=='{}'".format(corp_name)
code = code_result.query(condition)['code'].to_string(index = False)
code = code.strip()
code = code.rjust(6, '0')
return code
get_code라는 함수는 corp_name이라는 회사명을 두번째 인자로 주게 되면 회사명에 맞는 종목코드를 반환한다.
여기서 첫번째 인자인 code_result는 미리 엑셀 데이터상에서 존재하는 회사명과 종목코드를 매칭시켜서 만든 Pandas DataFrame이다.
또한 우리는 시간에 따른 주식의 흐름을 보기 위해서 시간이 필요한데 관련된 모듈을 추가해주었다.
from datetime import datetime
다음과 같은 <from 모듈 import 이름> 형식으로 패키지를 추가한다.
여기서 import에 관해 간략히 설명하면, 우선 import에는 두가지 방법이 있다.
- import 모듈
첫번째로는 import + 모듈의 이름이다.이 방법은 모듈 전체를 가져오는 형식이다.
- from 모듈 import 이름
두번째로는 모듈에서 필요한 것만 가져오는 방식이고 필요한 것을 <이름> 자리에 작성하면 된다.
그리고 우리가 앞서 사용한 import + as는 임포트한 모듈을 사용자가 원하는 이름으로 부르겠다는 의미이다.
파이썬은 위와 같은 방식으로 모듈을 임포트함으로써 필요한 함수를 쓰고 이에 대한 자세한 설명은 추후에 따로 블로깅하도록 한다.
이제 여러 회사의 주가를 네이버에서 가져와서 데이터프레임 형태로 확인하는 코드를 살펴보겠다.
companies = ['삼성전자','LG전자','카카오','NAVER','CJ','한화','현대자동차','기아자동차']
companies
start = datetime(2019, 1, 1)
end = datetime(2019, 12, 31)
stock_of_companies = pd.DataFrame({'Date':pd.date_range(start = start, end = end)})
for company in companies:
company_code = get_code(code_result, company)
stock_df = web.DataReader(company_code,'naver',start,end)
stock_of_companies = stock_of_companies.join(pd.DataFrame(stock_df['Close'].astype(int)).rename(columns={'Close':company}),
on='Date')
코드를 살펴보면,
start = datetime(2019, 1, 1)
end = datetime(2019, 12, 31)
위 코드는 날짜를 처리하는 함수로 주식의 흐름을 확인할 때 2019년 1년간의 흐름을 확인하기 위해서 시작과 끝을 지정하는 변수를 생성한다.
stock_of_companies = pd.DataFrame({'Date':pd.date_range(start = start, end = end)})
위 코드는 pandas의 DataFrame을 생성하는 함수로 Date 칼럼으로 생성하고 pandas의 date_range함수를 이용하여 일정기간 생성하는 코드이다.
for company in companies:
company_code = get_code(code_result, company)
stock_df = web.DataReader(company_code,'naver',start,end)
stock_of_companies = stock_of_companies.join(pd.DataFrame(stock_df['Close'].astype(int)).rename(columns={'Close':company}),
on='Date')
마지막으로 실제 네이버의 데이터를 가져와 만들어 놓은 데이터 프레임에 추가하는 코드이다.
앞서 만든 함수를 바탕으로 각 회사의 종목코드를 구하고 종목코드를 이용하여, 네이버에서 데이터를 추출한다. 이후엔 Close 데이터, 즉 하루의 주식시장이 닫혔을 때의 주식 데이터를 가지고 데이터 프레임에 추가한다.
여러 회사의 데이터이므로 반복문을 사용하였다.
이렇게 데이터 프레임을 생성하고 수정하고 덧붙이는 과정을 거쳐 우리가 원하는 데이터 프레임을 생성하였다.
항상 하던대로 데이터 프레임을 완성시킨 후에는 시각화를 진행하였는데, 이번에는 다른 모듈을 임포트하여 진행해보기로 하자.
우선 이번에 사용할 모듈은 seaborn 모듈로 matplotlib에 비해서는 그래프를 손쉽게 그릴수 있고, 그래프 스타일을 다양하게 설정할수 있다는 장점이 있지만, 정교하게 그리는 부분(크기 조절,축 등)에서는 matplotlib에 비해 부족하다.
conda install -c anaconda seaborn
다음과 같이 아나콘다에 seaborn 패키지를 설치해준다.
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.family'] = 'Malgun Gothic'
plt.rcParams['axes.unicode_minus'] = False ##그래프 그릴때 -기호를 붙여주는 것
이후 시각화를 진행할 라이브러리를 임포트 해주고 폰트 에러방지를 위해 미리 폰트설정도 진행한다.
여기서 마지막 코드는 주석에 달아놓은것처럼 그래프를 그릴때 기호를 확인하기 위해서 추가해준것이다.
이제 시각화를 위한 그래프,맵 등을 그릴건데, 이번 블로그에서는 seaborn 모듈의 히트맵 함수를 이용하여 히트맵을 생성하는 코드를 살펴보겠다.
plt.figure(figsize=(10,10))
sns.heatmap(data = corr_data, annot = True, fmt = '.2f',
linewidths = .5, cmap = 'Blues')
plt.show()
앞서 matplotlib와 seaborn 모듈의 차이점에서 정교한 부분은 matplotlib가 좀 더 적합하다고 설명한 바 있다.따라서 크기는 matplotlib를 이용하여 sizing한 모습이다.
그 다음으로 히트맵 함수가 등장하는데, 여기서 corr_data는 주식데이터의 상관관계를 구하여 히트맵에 표현하기 위해서 위에서 구한 stock_of_companies변수에 대해서 corr() 메소드를 적용시켜준다.이렇게 되면 피어슨 상관계수에 따라서 값이 계산이 된다.간단히 피어슨 상계수에 대해서 설명하면, 두 값이 완전히 동일하면 1.0, 그리고 반대방향으로 완전히 동일하면 -1.0, 마지막으로 정 반대라면 0의 값을 갖는다.
-->앞서 그래프를 그릴 때 (-)기호가 필요했던 이유가 이것 때문이다.
seaborn의 hitmap함수를 자세히 살펴보면 annot은 각 셀에 숫자를 기입할지 정하는 인자이고, fmt는 기입되는 형태이다.그리고 linewidth는 셀 간의 너비이고 마지막으로 cmap은 map의 Color이다.
결과적으로 필자는 주식의 상관관계 데이터에 대해서 소수점 둘째 짜리까지 각 셀에 값을 기입해주고 셀 간거리 0.5의 파란색 히트맵을 만든 것이다.
다음과 같은 결과를 출력하며, 같은 회사에 대해서는 완전히 동일한 1.00을 출력하며 진한 컬러로 표시된 것을 확인할 수 있다.
이번 블로그는 파이썬 데이터 분석에서 주식데이터를 다루는 법을 알아보았고 이에 따른 간단한 문법, 그리고 또 다른 시각화 방법, 마지막으로 우리가 항상 해왔던 데이터 프레임 처리에 관한 내용을 다뤄보았다.
'Soft_Ware > Python' 카테고리의 다른 글
Python 데이터 분석(2) (0) | 2021.07.17 |
---|---|
Python 데이터 분석(3) (0) | 2021.07.17 |
Python 데이터분석(1) (0) | 2021.07.05 |
Python 기초 문법 (0) | 2021.07.03 |