-
파이썬을 활용한 주가 변동성 구하기: ELS Valuation1금융퀀트/자산평가&프로그램매매 2023. 12. 14. 22:17반응형
환경 세팅: yfinance, pandas_market_calendars, matplotlib 설치
ELS 가치평가 하기: ELS는 진짜 위험할까?에서 살펴본 것처럼 S&P500 지수를 기초자산으로 하는 ELS를 평가하는데 있어서 중요한 변수는 기초자산인 S&P500 지수의 변동성과 기초수익률 부분이다. 기초수익률은 계약시점의 3개월 CD금리 정도로 단순 확인이 가능한데, 기초자산인 S&P500 지수의 변동성은 기초 데이터를 받아서 표준편차를 계산해 주어야 한다.
기초자산 데이터를 가장 손쉽게 받을 수 있는 방법이 yfinance라이브러리를 사용하는 방법이다. 다만, yfinance를 그냥 base 환경에서 설치하면 현재 나의 numpy 버전과 안 맞을 수 있기 때문에 "conda env list"명령어로 먼저 나의 가상환경 리스트를 확인하고, "conda create --name 가상환경명 python=파이썬최신버전" 명령어로 최신버전의 가상환경을 만든 뒤 pip install yfinance를 통해서 라이브러리를 설치하는 것이 좋다.
추가적으로 S&P500지수가 나오는 날짜리스트 확인을 위해서 해당 시장의 영업일을 쉽게 구할 수 있는 pandas_market_calendars 라이브러리, 주가지수 시나리오를 시각적으로 쉽게 확인할 수 있게 해 주는(=그래프를 그려주는) matplotlib 라이브러리를 각각 아나콘다 프롬프트에서 가상환경을 활성화시킨 뒤 아래 명령어로 설치해 준다.
conda activate 가상환경명 pip install pandas_market_calendars pip install matplotlib
주요 데이터 입수를 통한 변동성 산출
데이터 입수
데이터 입수는 yfinance의 download 메서드를 사용하면 쉽게 가능하다. download 메서드의 투입변수는 ticker, startdate, enddate 정도이다. 여기서 ticker 가 중요한데, ticker 는 yahoo finance에서 각 금융자산의 고유식별코드이다. S&P500 지수의 ticker는 yahoo finance (https://finance.yahoo.com/)에서 S&P500 지수를 검색하면 아래 그림과 같이 확인할 수 있다.
결국 아래와 같이 "^GSPC"를 ticker 로 넣고 아래와 같이 코드를 짜면, 2007-06-01부터 2009-06-30까지의 S&P500 지수의 종가 데이터를 확인할 수 있다.
#yfinance 라이브러리 입수 import yfinance as yf asset = "^GSPC" startdate = "2007-06-01" enddate = "2009-06-30" asset_price = yf.download(asset, start=startdate, end=enddate) print(asset_price)
변동성 계산
yf.download 로 입수한 아래 그림과 같은 데이터의 조정 종가(="Adj Close")를 가지고 변동성을 측정할 수 있다. 변동성 측정 시 주의할 점은 종가 자체의 변동성을 측정하는 것이 아니라 종가를 갖고 측정한 일일 수익률의 변동성을 측정해야 한다는 점이다. 지수의 수준에 변화를 받지 않고 상대적인 가격의 움직임을 측정해야 하기 때문이다.
S&P500 지수의 조정 종가의 요소간 변화율은 pandas의 pct_change 메서드를 사용해서 쉽게 구할 수 있고, 이 데이터들의 표준편차는 numpy의 std(표준편차) 메서드를 사용해서 구할 수 있다. 결과적으로 아래와 같은 코드를 구현할 수 있는데, SNP500 ELS001이라는 Class를 만들고 ticker를 변수로 받는 els라는 클래스 인스턴스를 만든 뒤 그 안에 Get_Variance라는 함수를 구현한 코드이다.
import yfinance as yf import numpy as np # SNP500ELS001 클래스 선언 class SNP500ELS001(): # 클래스 인스턴스 설정 시 아래 els 처럼 ticker를 넣어야 함 def __init__(self, ticker: str): self.ticker = ticker # Get_Variance 함수 설정 def Get_Variance(self, startdate: str, enddate: str): # 아래 시작일과 종료일 입력받아서 종가 데이터 입수 asset_price = yf.download(self.ticker, start=startdate, end=enddate) # 종가 데이터를 통한 일일 변화율 산출(dropna 로 null 값 제거) asset_returns = asset_price["Adj Close"].pct_change().dropna() # 변화율 데이터를 이용한 표준편차 계산 asset_vol = np.std(asset_returns) return asset_vol if __name__=="__main__": els = SNP500ELS001("^GSPC") vol = els.Get_Variance("2007-06-01","2009-06-30") print(vol)
반응형'금융퀀트 > 자산평가&프로그램매매' 카테고리의 다른 글
NPV 계산기 (0) 2023.12.24 파이썬을 활용한 주가 경로 구하기: ELS Valuation2 (0) 2023.12.16 ELS 가치평가 하기: ELS는 진짜 위험할까? (0) 2023.12.12 듀레이션 계산기 (0) 2023.08.11 선물거래: 코스피 200 선물 이론가 산출하기 (0) 2023.03.04