ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬을 활용한 주가 변동성 구하기: 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를 통해서 라이브러리를 설치하는 것이 좋다.

    그림1: 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 지수를 검색하면 아래 그림과 같이 확인할 수 있다.

    그림2: yahoo finance ticker 확인

    결국 아래와 같이 "^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")를 가지고 변동성을 측정할 수 있다. 변동성 측정 시 주의할 점은 종가 자체의 변동성을 측정하는 것이 아니라 종가를 갖고 측정한 일일 수익률의 변동성을 측정해야 한다는 점이다. 지수의 수준에 변화를 받지 않고 상대적인 가격의 움직임을 측정해야 하기 때문이다.

    그림3: S&P500 종가데이터의 입수

    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)
    반응형
Designed by Tistory.