프로그래밍/파이썬

[Python] 파이썬 pandas(판다스) 활용 - 일간 변동률, MDD 구하기

매 석 2022. 10. 2. 15:39
반응형

 

1. Pandas란 ?

- 금융 데이터 분석을 목적으로 개발되었으며, 구조화된 데이터를 쉽고 빠르게 가공할 수 있다.

- 시리즈와 데이터프레임 자료형 객체를 제공한다.

+ 시리즈 : 인덱스 처리가 된 1차원 벡터 형태의 자료형, 시계열 데이터 다루는 데 적합

   시계열 : 시간의 흐름에 따라 기록한 데이터

   데이터프레임 : 여러 시리즈가 한 가지 인덱스를 기준으로 합쳐진 형태

 

2. Pandas의 명령어 예시

import pandas as pd 
#시리즈 생성
s = pd.Series([0.0,3.6,2.0,5.8,4.2,8.0])

#시리즈의 인덱스 변경
s.index = pd.Index([0.0,1.2,1.8,3.0,3.6,4.8])
s.index.name = 'MY_IDX' #맨 위에 인덱스명 출력됨

#시리즈명 설정
s.name = 'MY_SERIES' #맨 뒤에 시리즈명 출력됨

#데이터 추가
s[5.9] = 5.5
#데이터 추가 (append)
ser = pd.Series([6.7,4.2],index=[6.8,8.0])
s= s.append(ser)

#인덱스와 데이터 출력
s.index[-1]
s.values[-1]
s.loc[8.0] #4.2
s.iloc[-1] #4.2 (시리즈로 반환)
s.values[:] # iloc와 비슷하지만 배열로 반환

#데이터 삭제
s.drop(8.0) #인덱스 8.0 라인 삭제
#시리즈 정보 보기
s.describe() #원소 개수, 평균, 표준편차, 최솟값, 제1~3 사분위수, 최댓값

 

3. Pandas 데이터프레임

import pandas as pd
#딕셔너리를 이용한 데이터프레임 생성
df = pd.DataFrame({'KOSPI':[1925,1941],
'KOSDAQ':[552,642]},index=[2020,2021])
df.describe()
df.info()

#시리즈를 이용한 데이터프레임 생성
kospi = pd.Series([1915,1991], index=[2020,2021], name='KOSPI')
kosdaq = pd.Series([522,622],index=[2020,2021], name='KOSDAQ')
df = pd.DataFrame({kospi.name:kospi,kosdaq.name:kosdaq})

#리스트를 이용한 데이터프레임 생성
columns = ['KOSPI','KOSDAQ']
index = [2020,2021]
rows= []
rows.append([1951,580])
rows.append([1942,620])

df = pd.DataFrame(rows,columns=columns,index=index)
print(df)

#데이터프레임 순회 처리
for i in df.index: #인덱스 사용
    print(i,df['KOSPI'][i],df['KOSDAQ'][i])
#튜플 형태로 반환
for row in df.itertuples(name='KRX'):
    print(row)
for row in df.itertuples():
    print(row[0],row[1],row[2])
for idx, row in df.iterrows():
    print(idx, row[0], row[1])

 

4. Pandas 활용 - 일간 변동률 구하기

from pandas_datareader import data as pdr
import yfinance as yf
yf.pdr_override()
 
sec = pdr.get_data_yahoo('005930.KS', start='2021-05-04')
#일간 변동률 = ((오늘종가) - (어제종가))/(어제종가) * 100
day_change = (sec['Close']-sec['Close'].shift(1)) / sec['Close'].shift(1) * 100
day_change.dropna()
day_change_cp = ((100+day_change)/100).cumprod()*100-100 # 일간 변동률 누적곱 계산

msft = pdr.get_data_yahoo('MSFT', start='2018-05-04')
msft_day_change = (msft['Close'] / msft['Close'].shift(1) -1) * 100
msft_day_change.dropna()
msft_day_change_cp = ((100+msft_day_change)/100).cumprod()*100-100

 

5. Pandas 활용 - MDD(최대 손실 낙폭) 구하기

from pandas_datareader import data as pdr
import yfinance as yf 
yf.pdr_override()

#코스피 지수 데이터 다운로드
kospi = pdr.get_data_yahoo('^KS11','2015-01-01')

#1년 동안의 개장일을 255일로 설정
window = 255
#KOSPI 종가 칼럼에서 1년 기간 단위로 최고치 peak를 구한다. (데이터 최소 개수 지정)
peak = kospi['Adj Close'].rolling(window, min_periods=1).max()
#최고치 대비 현재 KOSPI 종가가 얼마나 하락했는지 구한다.
down = kospi['Adj Close']/peak
#1년 기간 단위로 최저치 max_dd를 구한다. 마이너스값이기 때문에 최저치가 바로 최대 손실 낙폭이 된다.
max_mdd = down.rolling(window, min_periods=1).min()

#정확한 MDD 값
max_mdd.min()
#MDD를 기록한 기간 구하기 (위에서 나온 값)
#max_mdd[max_mdd==값]

퀀트 투자에 있어서 높은 수익률보다 낮은 MDD가 더욱 낮다.

즉 돈을 잃지 않는 것이 돈을 버는 것보다 더 중요하다는 것이다.

 


+ 더 자세한 개념들 

- 일간 변동률 : 가격이 다른 두 주가의 수익률을 비교할 수 있다.

- 최대 손실 낙폭 : 특정 기간에 발생한 최고점에서 최저점까지의 가장 큰 손실
  (퀀트 투자에서는 수익률을 높이는 것 보다 MDD를 낮추는 것이 더 낫다.)

- 회귀 분석과 상관관계 : 독립 변수라고 불리는 하나 이상의 변수와 종속변수라 불리는 하나의 변수 간의 관계를 회귀식으                                          로 도출하여 예측
- 지수화 : 오늘 종가를 과거의 종가로 나눈 뒤 100을 곱한 것, 일간 변동률의 누적곱보다 더 수월하게 처리할 수 있다.
- 산점도 : 독립변수 x와 종속변수 y의 상관관계를 확인할 때 쓰는 그래프. ->

                plt.scatter (nan제거해야함 -> df.fillna(method='bfill'))

- 선형 회귀 분석 -> stats.linregress 함수 이용
y1 = b0 + b0x1 + c1(i=1,2,...,n) -> 선형 회귀 모델

y1: i번째 종속변수의 값 
xi: i번째 독립변수의 값
b0: 선형 회귀식의 절편
b1: 선형 회귀식의 기울기
c1: 오차항(종속변수Y의 실제값과 기대차의 차이)

- 결정계수 : 관측된 데이터에서 추정한 회귀선이 실제로 데이터를 어느 정도 설명하는지를 나타내는 계수 = 상관계수**2