ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 일주일 뒤 코스피 지수는?: 몬테카를로시뮬레이션 실습
    금융퀀트/자산평가&프로그램매매 2022. 5. 22. 11:32
    반응형

    몬테카를로 시뮬레이션의 개념 

    몬테카를로 시뮬레이션은 "무작위 변수"를 "반복적으로" 투입하여 나온 "결괏값을 정리"하여 정답을 찾는 일련의 과정이다. 정확한 개념 설명은 이 블로그의 글인 "몬테카를로 시뮬레이션의 직관적인 이해"를 참고하면 된다. 개념 설명 글에서는 엑셀을 이용해서 몬테카를로 시뮬레이션을 구현해 봤는데 이번에는 파이썬을 이용해서 몬테카를로 시뮬레이션을 실습해 보겠다.

    라이브러리 소개 

    Numpy

    Numpy(넘파이)는 행렬, 다차원 배열을 다루는 라이브러리이다. 우리는 대부분의 데이터를 직사각형으로 배열(행렬)해서 정리하기 때문에 ( 엑셀을 떠올리면 직관적으로 이해가 될 것 같다. ) 데이터 다룰 때 거의 쓴다고 보면 된다. 이번에는 난수 생성을 위해서 사용한다.

    SciPy

    SciPy(사이파이)는 공학 계산을 위한 파이썬 라이브러리로 Numpy, Matplotlib 등과 같이 쓰인다. 일주일 간의 주가 경로를 보간하기 위해서 사용한다. ( SciPy를 이용한 보간법이 궁금하다면 "선형보간법 연습 : 파이썬 구현(라이브러리 이용)
    "을 참고하면 된다.

    Matplotlib

    Matplotlib는 데이터를 시각화하는데 많이 쓰인다. 쉽게 생각해서 그래프를 쉽게 그려주는 도구라고 생각하면 된다. 

    위 라이브러리는 보통 Anaconda를 설치하면 기본적으로 제공되지만 혹시나 없는 경우 anaconda prompt를 켜서 아래와 같은 명령어를 치면 설치가 된다. 

    pip install scipy
    pip install numpy
    pip install matplotlib

     

    주가 예측해 보기 : 몬테카를로 시뮬레이션 실습예제

    기초 데이터 : KRX 정보 데이터 시스템(http://data.krx.co.kr/)

    KRX에서는 시계열 주가 데이터를 아래와 같이 엑셀로 제공하고 있다. 

    그림1: 코스피 지수

    엑셀 2015년 1 월부터 코스피 지수의 표준편차는 엑셀의 STDEV.S , 평균은 AVERAGE 함수를 통해서 구할 수 있다. 그 결과 2015년부터 2022년 5월까지 계산한 코스피 등락률의 표준편차는 0.0102605, 평균은 0.0002303 ( % 아님 )이다. 

    자세한 작업은 아래 파일을 첨부했으니 궁금하신 분들은 확인하시면 될 것 같다. 

    코스피지수_변동성_평균_구하기.xlsx
    0.19MB

    일주일 뒤 코스피 지수 예측

    무작위 변수 설정

    위에서 구한 표준편차, 평균, numpy 라이브러리를 이용해서 등락률을 무작위로 뽑아보자. 먼저 numpy 라이브러리에서 random 모듈의 randn 함수는 평균이 0, 표준편차가 1인 표준 정규분포에서 난수를 뽑아준다.

    np.random.randn(1)

     

    위와 같은 코드를 쓰면 평균이 0 표준편차가 1인 표준 정규분포에서 난수 하나를 뽑을 수 있는 것이다.

    그런데 2015년부터 코스피 지수는 평균이 0.0002303 표준편차는 0.0102605 이므로 위 함수에 아래와 같이 반영을 해주면 평균이 0.0002303, 표준편차가 0.0102605 인 표준 정규분포에서 난수 하나를 뽑을 수 있다. 

    0.0102605*np.random.randn(1)+0.0002303

     

    일주일 동안 코스피지수 예상하기

    위에서 설정한 난수 설정 규칙을 통해서 아래와 같이 파이썬을 통해서 주가 경로를 그려볼 수 있다. 아래 코드는 시뮬레이션을 100번 하는 것을 가정했는데, N 만 바꿔주는 1,000번, 10,000번도 시뮬레이션이 가능하다.

    # numpy 라이브러리 사용
    import numpy as np
    # matplotlib 라이브러리 사용
    import matplotlib.pyplot as plt
    # scipy 라이브러리 사용
    from scipy import interpolate
    
    # 시뮬레이션 횟수
    N = 100
    # 기준일 코스피 지수 : 2022.05.20일 종가
    S0 = 2639.29
    
    # 0 이 시작일 7이 일주일 뒤
    x = [0,1,2,3,4,5,6,7]
    
    # 난수를 생성하는 함수
    def change():
        rate = 0.0102605*np.random.randn(1)+0.0002303
        return rate
    
    for i in range(N):
        # 최초 기준일 주가
        S0 = S0
        # 기준일 주가에서 난수를 이용해서 변화율을 구하고 
        # 기준일 주가 * 변화율로 변화량을 구한뒤 기준일 주가에 합산해 주면
        # 다음날의 주가가 됨
        S1 = S0 + S0 * change()
        # 같은 과정을 반복 2 일째의 주가 예상가 도출
        S2 = S1 + S1 * change()
        # 같은 과정을 반복 3 일째의 주가 예상가 도출
        S3 = S2 + S2 * change()
        # 같은 과정을 반복 4 일째의 주가 예상가 도출
        S4 = S3 + S3 * change()
        # 같은 과정을 반복 5 일째의 주가 예상가 도출
        S5 = S4 + S4 * change()
        # 같은 과정을 반복 6 일째의 주가 예상가 도출
        S6 = S5 + S5 * change()
        # 같은 과정을 반복 7 일째의 주가 예상가 도출
        S7 = S6 + S6 * change()
        # 일자별 주가를 y 값으로 설정
        y = [S0,S1,S2,S3,S4,S5,S6,S7]
        # 도출된 y 값을 선형보간하여 연결
        path = interpolate.interp1d(x,y)
        y_path = path(x)
        # 그래프 생성
        plt.plot(x,y_path)
        
    # 그래프 보여주기
    plt.show()

     

    일주일 뒤 코스피 지수 예측

    일주일 뒤 코스피 지수는 'S_final"이라는 변수를 두고, 아래와 같이 시뮬레이션 별로 마지막 "S7"(7일 차 주가 예상치)를 전부 더한 뒤 그것을 시뮬레이션 횟수로 나눠주면 된다. 시뮬레이션으로 도출한 값들의 평균값을 7일차 주가로 보는 것이다.

    # numpy 라이브러리 사용
    import numpy as np
    # matplotlib 라이브러리 사용
    import matplotlib.pyplot as plt
    
    # 시뮬레이션 횟수
    N = 100
    # 기준일 코스피 지수 : 2022.05.20일 종가
    S0 = 2639.29
    
    # 시뮬레이션별 7일차 값을 더하기 위한 변수
    S_final = 0
    # 0 이 시작일 7이 일주일 뒤
    x = [0,1,2,3,4,5,6,7]
    
    # 난수를 생성하는 함수
    def change():
        rate = 0.0102605*np.random.randn(1)+0.0002303
        return rate
    
    for i in range(N):
        # 최초 기준일 주가
        S0 = S0
        # 기준일 주가에서 난수를 이용해서 변화율을 구하고 
        # 기준일 주가 * 변화율로 변화량을 구한뒤 기준일 주가에 합산해 주면
        # 다음날의 주가가 됨
        S1 = S0 + S0 * change()
        # 같은 과정을 반복 2 일째의 주가 예상가 도출
        S2 = S1 + S1 * change()
        # 같은 과정을 반복 3 일째의 주가 예상가 도출
        S3 = S2 + S2 * change()
        # 같은 과정을 반복 4 일째의 주가 예상가 도출
        S4 = S3 + S3 * change()
        # 같은 과정을 반복 5 일째의 주가 예상가 도출
        S5 = S4 + S4 * change()
        # 같은 과정을 반복 6 일째의 주가 예상가 도출
        S6 = S5 + S5 * change()
        # 같은 과정을 반복 7 일째의 주가 예상가 도출
        S7 = S6 + S6 * change()
        # 일자별 주가를 y 값으로 설정
        y = [S0,S1,S2,S3,S4,S5,S6,S7]
        # 시뮬레이션 별 S7의 값 합산
        S_final = S_final + S7
    
    # 시뮬레이션 별 7일차 주가 (S7)의 값을 전부 더해서 시뮬레이션 횟수로 나누기
    print(S_final/N)

     

    매번 뽑아내는 난수가 다를 것이기 때문에 위 코드를 실행할 때마다 다른 값이 나올 것이다. 시뮬레이션 횟수를 1,000번으로 하고 두 번 정도 실행해보니 2643.13, 2641.43 가 나오는데, 일주일 뒤에는 이 시뮬레이션 상으로는 일주일 뒤에 주가는 오를 것 같다.

    반응형
Designed by Tistory.