FinanceDataReader를 사용하여 증권 데이터를 수집하는 단계별 코드입니다. FinanceDataReader는 한국 주식 및 미국 주식 등 다양한 금융 데이터를 제공하는 파이썬 라이브러리입니다. 아래는 FinanceDataReader를 설치하고 사용하여 삼성과 애플의 주가 데이터를 수집하는 예제 코드입니다.
FinanceDataReader 설치하기
먼저, FinanceDataReader 라이브러리를 설치합니다. 이것은 pip를 사용하여 쉽게 수행할 수 있습니다.
pip install finance-datareader
FinanceDataReader 가져오기
FinanceDataReader를 가져옵니다.
import FinanceDataReader as fdr
삼성과 애플의 주가 데이터 수집
아래 코드를 사용하여 삼성과 애플의 주가 데이터를 수집합니다. 삼성의 시작일을 기준으로 애플의 데이터를 가져오겠습니다.
# 삼성과 애플의 주가 데이터 수집
samsung = fdr.DataReader("005930") # 삼성 주가 데이터 가져오기
samsung_first_date = str(samsung.index[0])[:10] # 삼성의 첫 데이터의 날짜
apple = fdr.DataReader("AAPL", samsung_first_date) # 애플 주가 데이터 가져오기
위 코드에서 주요 부분을 설명하면:
fdr.DataReader("005930")
: "005930"은 삼성전자의 종목 코드입니다. 이 코드를 사용하여 삼성 주가 데이터를 가져옵니다.samsung_first_date
: 삼성의 첫 데이터의 날짜를 얻습니다. 이를 기반으로 애플 데이터를 가져올 시작일을 결정합니다.fdr.DataReader("AAPL", samsung_first_date)
: "AAPL"은 애플의 종목 코드입니다.samsung_first_date
를 기준으로 애플 주가 데이터를 가져옵니다. "티커", "시작일", "종료일" 순으로 입력하고, 시작일이나 종료일은 입력하지 않아도 됩니다.
데이터가 성공적으로 가져와지면 samsung
및 apple
데이터프레임에 저장됩니다.
결과 확인
삼성과 애플의 주가 데이터가 samsung
및 apple
데이터프레임에 저장됩니다. 결과를 확인하려면 다음과 같이 사용할 수 있습니다.
# 삼성의 주가 데이터 출력
print("삼성의 주가 데이터:")
print(samsung)
# 애플의 주가 데이터 출력
print("애플의 주가 데이터:")
print(apple)
이제 위의 코드를 실행하면 삼성과 애플의 주가 데이터를 비교하고 분석할 수 있습니다. 주가 데이터는 데이터프레임 형식으로 제공되며, Pandas를 사용하여 데이터 분석 및 시각화를 수행할 수 있습니다.
데이터 분석을 위해 결측치를 처리하는 단계별 코드와 설명입니다.
결측치 확인
결측치가 데이터 분석에 방해가 되므로 먼저 결측치를 확인합니다. isna().sum()
메서드를 사용하여 결측치의 개수를 계산합니다.
samsung_isna = samsung.isna().sum()
apple_isna = apple.isna().sum()
이 코드를 실행하면 samsung_isna
와 apple_isna
에 각 데이터프레임의 열 별 결측치 개수가 저장됩니다.
결측치 처리
결측치는 데이터 분석에서 문제를 일으킬 수 있으므로 어떻게 처리할지 결정해야 합니다. 여기서는 결측치를 0으로 대체하는 방법을 사용합니다.
samsung = samsung.fillna(0)
위 코드에서 fillna(0)
메서드는 데이터프레임의 모든 결측치를 0으로 대체합니다. 이 경우, 삼성의 첫 데이터에서 발생한 결측치를 0으로 처리했습니다. 이 결정은 변동률을 삼성의 첫 데이터 시작일에서 구할 수 없는 상황에서 결측치를 0으로 가정하기 때문입니다.
결측치를 다른 값으로 대체하는 경우, 그 값이 해당 상황에 맞도록 결정되어야 합니다.
이제 결측치가 처리된 데이터프레임 samsung
을 사용하여 데이터 분석을 계속 진행할 수 있습니다.
시각화를 통해 두 주식을 비교하는 과정을 단계별로 코드와 설명입니다.
맷플롯립 가져오기
시각화를 구현하기 위해 matplotlib.pyplot
을 가져옵니다.
import matplotlib.pyplot as plt
종가로 두 주식의 수익률 비교하기
주식 데이터의 시각화를 시작합니다. 두 주식의 종가를 비교하는 코드를 작성합니다.
plt.figure(figsize=(15, 10)) # 그래프의 크기 설정
plt.plot(samsung["Close"], label="SAMSUNG") # 삼성 주가 데이터를 그래프로 표시
plt.plot(apple["Close"], label="APPLE") # 애플 주가 데이터를 그래프로 표시
plt.legend(fontsize=16) # 레전드(설명) 추가
plt.show() # 그래프를 화면에 출력
위 코드의 주요 부분을 설명하면:
plt.figure(figsize=(15, 10))
: 그래프의 크기를 가로 15인치, 세로 10인치로 설정합니다. 그래프의 크기는 화면에 어떻게 표시될지를 제어합니다.plt.plot(samsung["Close"], label="SAMSUNG")
: 삼성 주가 데이터의 종가를 그래프로 표시하며, 레이블(legend)은 "SAMSUNG"으로 설정합니다.plt.plot(apple["Close"], label="APPLE")
: 애플 주가 데이터의 종가를 그래프로 표시하며, 레이블(legend)은 "APPLE"로 설정합니다.plt.legend(fontsize=16)
: 레전드(설명)를 추가하고, 폰트 크기를 16픽셀로 설정합니다.plt.show()
: 그래프를 화면에 출력합니다.
단계 3: 결과 확인
코드를 실행하면 삼성과 애플의 종가 데이터가 같은 그래프에 나타납니다. 그러나 두 주식의 가격대가 크게 다르므로 종가로 비교하는 것은 적절하지 않을 수 있습니다. 주가 데이터의 스케일을 맞추거나 다른 지표를 사용하여 더 유용한 비교를 할 수 있습니다.
일간 변동률을 사용하여 두 주식을 비교하는 단계별 코드와 설명입니다.
일간 변동률 계산
주식의 일간 변동률을 계산합니다. 이전의 코드에서 일부 데이터를 수정하였으므로, 아래 코드를 사용하여 일간 변동률을 계산합니다.
# 이상한 데이터 수정
apple.loc["2016-02-29"]["Change"] = -0.025
# 일간 변동률 계산
samsung["Change"] = samsung["Close"].pct_change() # 삼성 주식의 일간 변동률 계산
apple["Change"] = apple["Close"].pct_change() # 애플 주식의 일간 변동률 계산
위 코드에서 pct_change()
메서드를 사용하여 종가 데이터를 이용하여 일간 변동률을 계산합니다.
일간 변동률로 두 주식 비교
일간 변동률을 사용하여 두 주식을 비교하는 그래프를 그립니다.
plt.figure(figsize=(15, 10)) # 그래프의 크기 설정
plt.plot(samsung["Change"], label="SAMSUNG") # 삼성 주식의 일간 변동률 그래프로 표시
plt.plot(apple["Change"], label="APPLE") # 애플 주식의 일간 변동률 그래프로 표시
plt.legend(fontsize=16) # 레전드(설명) 추가
plt.show() # 그래프를 화면에 출력
일간 변동률로 두 주식을 비교하는 그래프가 생성됩니다.
이러한 방식으로 주식의 일간 변동률을 비교하면 주식의 상대적인 성과 및 변동성을 더 잘 파악할 수 있습니다.
일간 변동률의 누적곱을 사용하여 두 주식을 비교하는 단계별 코드와 설명입니다.
일간 변동률 계산 및 이상한 데이터 수정
주식의 일간 변동률을 계산하고 이상한 데이터를 수정합니다.
# 이상한 데이터 수정
apple.loc["2016-02-29"]["Change"] = -0.025
# 삼성 주식의 일간 변동률 계산
sam_change_cp = ((samsung["Change"] + 1).cumprod() - 1)
# 애플 주식의 일간 변동률 계산
aapl_change_cp = ((apple["Change"] + 1).cumprod() - 1)
위 코드에서는 먼저 이상한 데이터를 수정하고, 누적곱을 계산하기 위해 각 주식의 일간 변동률에 1을 더하고 cumprod()
메서드로 누적곱을 계산한 다음 1을 빼줍니다.
단계 2: 누적곱으로 두 주식 비교
누적곱을 사용하여 두 주식을 비교하는 그래프를 그립니다.
plt.figure(figsize=(15, 10)) # 그래프의 크기 설정
plt.plot(sam_change_cp, label="SAMSUNG") # 삼성 주식의 누적 변동률 그래프로 표시
plt.plot(aapl_change_cp, label="APPLE") # 애플 주식의 누적 변동률 그래프로 표시
plt.legend(fontsize=16) # 레전드(설명) 추가
plt.show() # 그래프를 화면에 출력
누적 변동률을 사용하여 두 주식을 비교하는 그래프가 생성됩니다.
누적곱을 사용하면 일간 변동률이 0인 경우에도 데이터를 올바르게 비교할 수 있으므로 시계열 데이터의 상대적 성과를 파악하는 데 유용합니다.
지수화(indexation)를 사용하여 두 주식을 비교하는 단계별 코드와 설명입니다.
지수화 계산
지수화를 계산합니다. 이를 위해 각 주식의 종가 데이터를 첫 날짜의 종가 데이터로 나눕니다.
# 삼성 주식의 지수화 계산
sam_exp = (samsung["Close"] / samsung["Close"][samsung_first_date])
# 애플 주식의 지수화 계산
aapl_exp = (apple["Close"] / apple["Close"][samsung_first_date])
위 코드에서 samsung_first_date
는 삼성의 데이터 시작일을 나타냅니다. 이를 기준으로 지수화를 계산합니다.
지수화로 두 주식 비교
지수화를 사용하여 두 주식을 비교하는 그래프를 그립니다.
plt.figure(figsize=(15, 10)) # 그래프의 크기 설정
plt.plot(sam_exp, label="SAMSUNG") # 삼성 주식의 지수화 그래프로 표시
plt.plot(aapl_exp, label="APPLE") # 애플 주식의 지수화 그래프로 표시
plt.legend(fontsize=16) # 레전드(설명) 추가
plt.show() # 그래프를 화면에 출력
지수화를 사용하여 두 주식을 비교하는 그래프가 생성됩니다.
지수화를 통해 첫 날짜를 기준으로 주식의 성과를 추적하므로, 상대적 성과 및 변동성을 파악하는 데 유용합니다.
누적곱과 지수화를 사용한 그래프를 비교하는 단계별 코드와 설명입니다.
누적곱 및 지수화 계산
첫 번째 그래프에는 누적곱을 사용하여 변동률을 비교하고, 두 번째 그래프에는 지수화를 사용하여 종가 데이터를 비교하겠습니다.
# 누적곱 계산
sam_change_cp = ((samsung["Change"] + 1).cumprod() - 1)
# 지수화 계산
sam_exp = (samsung["Close"] / samsung["Close"][samsung_first_date]) - 1
그래프 비교
이제, 두 그래프를 비교합니다.
plt.figure(figsize=(15, 10)) # 그래프의 크기 설정
plt.plot(sam_change_cp, label="cumulative product") # 누적곱 그래프로 표시
plt.plot(sam_exp, "--", label="indexation") # 지수화 그래프로 표시 (점선 스타일)
plt.legend(fontsize=16) # 레전드(설명) 추가
plt.show() # 그래프를 화면에 출력
첫 번째 그래프는 누적곱을 사용한 그래프로 표시되고, 두 번째 그래프는 지수화를 사용한 그래프로 표시됩니다.
두 그래프를 비교하면 거의 일치하는 것을 확인할 수 있습니다. 누적곱 및 지수화는 상대적인 성과 및 변동성을 파악하는 데 유용한 방법 중 하나입니다.
두 데이터 간의 차이를 확인하고 일치하는 소수 자릿값을 찾는 과정의 단계별 코드와 설명입니다.
데이터프레임 생성과 오차 확인
import pandas as pd
# 두 데이터의 오차 확인 (몇 번째 소수 자릿값까지 일치하는지)
compare_df = pd.DataFrame({"CP": sam_change_cp, "INDEX": sam_exp})
i_list = [] # 소수 자릿값 리스트
for date, cp, index in compare_df.itertuples():
for i in range(1, 15):
if round(cp, i) != round(index, i): # i번째 소수까지 반올림
i_list.append(i)
print(i, date, cp, index)
print(min(i_list)) # 소수 자릿값의 최소값
데이터프레임 생성
누적곱과 지수화로 생성한 데이터를 비교하기 위한 데이터프레임 compare_df
를 생성합니다.
오차 확인
데이터프레임을 이용하여 소수 자릿값을 반올림하면서 두 데이터 간의 오차를 확인합니다. i_list
리스트에 각 날짜별로 일치하지 않는 소수 자릿값을 기록하고 출력합니다.
결과 확인
min(i_list)
를 사용하여 소수 자릿값의 최소값을 출력합니다.
이 결과를 통해 두 데이터가 소수 10번째 자릿값까지 일치한다는 것을 확인할 수 있습니다. 이는 크롤링 과정에서 발생한 약간의 오차가 있을 수 있지만, 주식 데이터의 비교에 있어서 큰 문제가 없음을 의미합니다.
출처 : 경제와 데이터 bigdata-doctrine.tistory.com
댓글