파이썬과 주식/파이썬으로 주식하기

[파이썬 주식 분석] 3. 종목의 일간 변동률(등락률)과 누적 값 계산하고 그려보기

by seokii 2022. 3. 23.
728x90
반응형

[작성 글 목록]


주식의 가격은 종목별로 다르기 때문에 상대적으로 비교할만한 척도가 필요합니다.

단순 종가의 오르내림을 비교하는 것보다는 일간 변동률을 구해 비교하면 훨씬 알아보기 편합니다.

 

당일 변동률 = (당일 종가 - 전일 종가) / (전일 종가) * 100의 수식을 통해 구할 수 있습니다.

 

간단히 설명하면, 전날과 비교해 오늘 몇 퍼센트(%)나 오르거나 혹은 내렸는지를 구하기 위함입니다.

 

주피터 노트북

In [1] : 

import pandas as pd
df = pd.read_excel("samsung_price.xlsx")​

사용할 라이브러리인 판다스(pandas)를 import 합니다.

전에 작성한 글에서 구했었던 삼성전자의 파일을 통해 이번 실습을 진행하겠습니다.

 

In [2] : 

df.head()

먼저 .head() 함수를 통해 지난번에 구했었던 삼성전자 시세에 대한 정보를 시각적으로 확인합니다.

변동률을 구하기 위해서는 종가의 정보가 필요합니다.

종가의 정보만 추출해서 일간 변동률을 계산해보도록 하겠습니다.

 

In [3] : 

close = df['종가']
close

close라는 변수에 종가의 정보만 정의했습니다.

왼쪽은 인덱스 번호이며, 오른쪽의 실제 종가 정보에 대한 데이터입니다.

 

In [4] : 

close.shift(-1)

.shift() 함수는 전체 데이터를 지정한 수만큼 이동시키는 함수입니다.

.shift(-1)을 통해서 전체 데이터를 한 칸씩 앞으로 당겨옵니다.

 

In [5] : 

daily_rate = (close / close.shift(-1)-1) * 100
daily_rate

앞서 처음에 설명했던 공식에 대입해 일간 변동률을 구해줍니다.

인덱스 별 각 수치는 전날에 비해 얼마나 오르거나 내렸는지를 알려주는 등락률 수치입니다.

값을 한 칸씩 당겨왔기 때문에 마지막 행은 빈 값이 생기게 됩니다.

이 값은 다음 코드를 통해 0으로 지정하겠습니다.

 

In [6] : 

daily_rate.iloc[-1] = 0
daily_rate.tail()

 

In [7] : 

df['일간변동률(%)'] = daily_rate
df

'일간변동률(%)'의 이름으로 데이터프레임에 새로운 열(column)을 만들고 구했던 데이터를 추가했습니다.

 

 

삼성전자 종목에 대한 일간 변동률을 구했는데,

일간 변동률에 대한 누적 합을 구하고 특정 기간에 구입했을 때, 얼마나 수익이 났는지 구해보고 그래프로 그려보도록 하겠습니다.

300 거래일 전을 기준으로 데이터프레임을 나누고 누적합을 구해 수익률을 계산해보겠습니다.

 

In [8] : 

df_target = df.loc[0:300]
df_target = df_target.loc[::-1]
df_target.reset_index(drop=True, inplace=True)
df_target

위에서 300 거래일이라고 했는데, 0행부터 300행까지이므로 301 거래일입니다.

2022년 3월 23일 기준으로 301 거래일 전은 2021년 1월 4일입니다.

일단 과거에서부터 일간 변동률을 더해 누적합을 구하고 그래프를 그려야 하기 때문에

.loc 함수에서 [::-1]를 범위로 지정해 인덱스와 데이터를 거꾸로 뒤집어 역순으로 재 정렬합니다.

그 이후, .rest_index() 함수를 통해 역순의 인덱스 번호를 다시 새로 부여합니다.

그 결과 위의 사진처럼 2021년 1월 4일부터 2022년 3월 23일까지의 데이터를 구할 수 있습니다.

 

In [9] : 

cs = df_target['일간변동률(%)'].cumsum()
cs

.cumsum()함수를 통해서 '일간변동률(%)' 열에 있는 값들의 누적합을 구합니다.

이 데이터를 통해 해당 기간 동안의 수익률을 그래프로 그려보겠습니다.

 

In [10] : 

import matplotlib.pyplot as plt
%matplotlib inline

In [11] : 

plt.figure(figsize=(10,8))
plt.plot(df_target['날짜'], cs, 'b', label='daily change(Samsung)')
plt.ylabel('Change %')
plt.grid(True)
plt.legend(loc='best')
plt.xticks(range(0, 301, 50))
plt.show()

matplotlib는 데이터프레임의 내용들을 쉽게 그래프로 나타낼 수 있게 해주는 라이브러리입니다.

%matplotlib inline 명령어는 그래프를 새 창이 아닌 기존의 주피터 노트북 내에 그리겠다고 선언하는 것입니다.

 

plt.figure(figsize=()) 함수를 통해 그래프의 전체 크기를 지정합니다.

plt.plot() 함수를 통해 어떤 데이터를 지정해 그래프를 그릴지 설정합니다.

첫 번째 인자는 x축의 값, 두 번째 인자는 y축의 값, 'b'는 색상을 의미합니다.

label=''은 범주에 나타낼 내용입니다.

plt.ylabel()을 통해서 y축의 제목을 나타낼 수 있습니다.

마찬가지로 .xlabel을 이용한다면 x축의 제목 또한 나타낼 수 있습니다.

plt.grid(True)를 통해 격자를 나타냅니다.

plt.legend(loc='best')를 통해 가장 최적의 위치에 범주를 나타냅니다.

. xticks() 함수를 통해 x축의 간격(빈도)을 직접 설정할 수 있습니다.

저는 50번째마다 나타나게 설정한 값입니다.

(모든 날짜를 x축에 적는다면 그래프의 크기에 비해 글자가 너무 많아 지저분한 그래프가 생성됩니다.)

마지막으로 plt.show()를 통해 그래프를 최종적으로 그릴 수 있습니다.

 

최종적으로 나온 결과의 모습입니다.

2021년 1월 4일에 삼성전자의 주식을 매수해 아직까지 홀딩하고 있었다면,

안타깝게도 -11% 정도의 손실을 보고 있다는 의미입니다.

 

 

728x90
반응형

댓글