Alpha를 찾아서 > 금융 데이터 다루기

2023. 8. 1. 23:40금융 데이터 분석

반응형

금융 데이터는 기본적으로 시계열적으로 이루어져 있습니다. 이러한 시계열성을 가진 데이터를 다루기 위한 아주 기본적인 pandas활용 방법과 금융 Factor들을 쉽게 계산할 수 있도록 도와주는 패키지에 대해서 다루어보도록 하겠습니다.

[Pandas]

사실 Pandas와 Numpy는 너무나도 잘 알려져 있는 패키지이기 때문에 익숙한 내용이지만, 예전에 했던 것을 다시 복기해보는 의미에서 시계열 데이터를 다룰때 유용하게 쓸 수 있는 method들을 정리해보겠습니다.

시계열 데이터를 다루기 위해서는 기본적으로 시차별로 수익률을 계산한다거나, 이번달 주가와 저번달 주가의 차이를 구한다거나 하는 시간의 축을 비교하거나 변경하는 일을 많이 하게 됩니다.

Resample method를 활용하면 일별 자료를 월별 자료로 변경할 수 있고 여기서는 .last() 즉 최신의 정보를 월 대표 정보로 가지고 왔습니다.

## 카카오 주가
df = fdr.DataReader('035720','2022-01-01', '2023-06-30')
df.head(10)                                                                                                                                                                                                                        

price = df["Close"]

## 일자료 -> 월자료
monthly_price = price.resample('M').last()
monthly_price.head(20)


"""
Date
2022-01-31     85000
2022-02-28     94100
2022-03-31    106500
2022-04-30     89900
2022-05-31     85000
2022-06-30     69900
2022-07-31     74800
2022-08-31     73400
2022-09-30     57100
2022-10-31     50700
2022-11-30     56400
2022-12-31     53100
2023-01-31     61400
2023-02-28     62400
2023-03-31     61100
2023-04-30     58100
2023-05-31     56200
2023-06-30     49100
Freq: M, Name: Close, dtype: int64
"""

시차별로 수익률을 계산해보겠습니다. 이 때는 pct_change() method를 이용하면 되고, 예를 들어 lag가 3이면 3개월전값과 비교해서 수익률을 계산하게 됩니다. (예: 4월값과 1월값 비교 -> (4월 주가 -1월 주가)/1월 주가)

pipe()는 해당 dataframe 전체에 함수를 활용할 때 사용합니다. (apply는 행이나 열별로 적용할 때 사용하기 때문에 쓰임이 다릅니다.)  

clip()은 winsorization이라고 하는 outlier을 넘어가는 값은  outlier 경계값으로 변경해주는 함수입니다. 예를들어 상위 1% outlier 경계값이 99라고 한다면 100이상의 값들은 다 99로 변경해서 다시 저장해주게 됩니다.

## multiple historical periods
outlier_cutoff = 0.01
data = pd.DataFrame()
lags = [3,6,9]

for lag in lags:
    col_name = "return_{}".format(lag)
    data[col_name]=  monthly_price.pct_change(lag)\
                    .pipe(lambda x: x.clip(lower = x.quantile(outlier_cutoff), 
                                       upper=x.quantile(1-outlier_cutoff)))\

마지막 shift는 데이터를 이동하는 방법으로, 1을 입력하면 첫번째 데이터가 두번째 데이터가 되고 두번째 데이터가 세번째가 됩니다. 이를 활용해서 월별 차이를 계산할 수 있습니다.  monthly_price에 shift를 적용하면 기존에 1월 값이였던 85000이 2월 값으로 된 것을 확인할 수 있습니다.

monthly_price.shift(1)

"""
Date
2022-01-31         NaN
2022-02-28     85000.0
2022-03-31     94100.0
2022-04-30    106500.0
2022-05-31     89900.0
2022-06-30     85000.0
2022-07-31     69900.0
2022-08-31     74800.0
2022-09-30     73400.0
2022-10-31     57100.0
2022-11-30     50700.0
2022-12-31     56400.0
2023-01-31     53100.0
2023-02-28     61400.0
2023-03-31     62400.0
2023-04-30     61100.0
2023-05-31     58100.0
2023-06-30     56200.0
Freq: M, Name: Close, dtype: float64
"""

[TA-Lib]

TA-Lib은 금융 지표들을 쉽게 계산하게 도와주는 패키지입니다. 예를들어 볼린저밴드나 기존에 다루었던 RSI를 쉽게 계산할 수 있게 해줍니다.

TA-Lib은 기존에 pip install를 활용해서 설치가 어렵고 whl 파일을 다운로드 받아서 설치해주시면 됩니다.

- 설치 경로: https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib

- 설치 파일: python 버전을 확인해서 다운로드
(예시: python 버전: 3.7, 윈도우 64비트 -> TA_Lib‑0.4.24‑cp37‑cp37m‑win_amd64.whl)

사용법은 너무나도 간단합니다. 볼린저밴드와 RSI를 TA-:Lib을 이용해서 구해보겠습니다. TA-lib에서 제공하는 지표들은 아래 사이트에서 확인하실 수 있습니다.

https://github.com/TA-Lib/ta-lib-python

import talib

## 볼린저 밴드
upper, middle, lower = talib.BBANDS(price, timeperiod=20)

## RSI
rsi = talib.RSI(price, timeperiod=14)


fig, axes = plt.subplots(nrows = 2, figsize = (15,8))
pd.DataFrame([upper, middle, lower]).T.plot(ax = axes[0], lw=1, title = 'Bollinger Bands')
rsi.plot(ax = axes[1], lw=1, title = 'RSI')
axes[1].axhline(70, lw=1, c='r')
axes[1].axhline(30, lw=1, c='r')

plt.show()

반응형