ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [7강] 이산형 확률변수-이항분포와 베르누이 시행
    기초지식/Quantopian(강의노트) 2025. 4. 5. 21:37
    반응형

    이항분포(Binomial Distribution)와 확률함수

    성공/실패, 수익/손실처럼 양자택일로 표현되는 결과들을 모델링할 경우가 있다. 이 양자택일 실험을 한 번 수행한 것을 베르누이 시행이라고 하는데, 결과는 성공 또는 실패가 된다. 이항분포는 이 베르누이 시행을 n 번 수행한 결과이다. 이때 총 성공한 횟수를 X이고, 각각의 성공확률을 p라고 한다면 X는 아래와 같이 표현할 수 있다.( X가 될 수 있는 값은 0 ~ n 이다.) 

    식1: 베르누이 시행에서 X값 표현

    이항분포에서는 조합(Combination)을 이용해서 확률질량함수(PMF)를 나타낼 수 있다. 총 n 번의 시행에서 k 번 성공할 수 있는 확률은 n 번의 시도에서 무작위로 k 번의 성공을 뽑아내는 것과 같으므로 아래 식 2와 같이 조합을 사용해서 나타낼 수 있는 것이다.

    식2: n번 수행에서 k번 성공할 수 있는 경우의 수

    각각의 사건은 독립사건이라는 것을 이용해서 성공확률을 고려한 확률질량함수를 만들면 아래와 같이 나타낼 수 있다.

    식3: 이항분포의 확률질량함수

    이때 성공 확률이 0.3처럼 0.5가 아닌 경우 분포는 비대칭이 된다. p = 0.3과 같이 성공 확률이 낮으면 대부분 실패 쪽으로 치우치게 된다.

    numpy의 binomial이라는 함수에 시도 횟수(n), 성공확률(p), 수행을 반복해서 결과를 받는 횟수를 넣으면 간단하게 이항분포를 구현할 수 있다. 아래는 이항분포를 만들어내는 bernoulliTrial이라는 함수를 구현한 것이다.   

    import numpy as np
    import matplotlib.pyplot as plt
    
    def bernoulliTrial(numberOfTrials: int, probabilityOfSuccess: float, numberOfSamples: int):
        samples = np.random.binomial(numberOfTrials, probabilityOfSuccess, numberOfSamples)
        return samples

    bernoulliTrial 함수에 변수로 시도 횟수 6, 성공확률 0.5, 수행을 반복하는 횟수 2를 넣으면 아래 그림 1과 같은 결과를 얻을 수 있다. 이는 첫 번째 수행에서 6번 시도한 결과 5번 성공이 나왔고, 두 번째 수행에서는 4번 성공이 나왔다는 뜻이다. 

    그림1: bernoulliTrial 함수 실행 결과

    이항 모델과 주가 예측

    이항분포는 주가 경로를 예측하는 모델에 사용될 수 있다. 매 시점마다 주가는 오르거나 내리는데, 이는 베르누이 시행이 계속 반복되는 것으로 볼 수 있기 때문이다. 초기 주가를 S_0라고 한다면 이항분포에 따라 결정되는 k 값을 이용해서 주가를 아래와 같은 형태로 표현할 수 있다.

    식4: 이항분포를 활용한 미래 주가 표현식

    이항 모델에 따른 주가 예상치는 위의 bernoulliTrial이라는 함수를 이용해서 쉽게 만들어볼 수 있다. 주식이 오를지 내릴지는 1/2인 상황에서 6 일 후의 주가를 예측한다고 하면, n = 6이고 p = 0.5가 된다. 예측을 10회 수행했다고 하면, 주가 상승 일수인 k를 구할 수 있다.(10회 수행했으니까 10개의 항목을 가진 list 형태로 만들어질 것이다.) 만들어진 k 를 위 식에 넣으면 6 일 뒤의 주가를 예측할 수 있다.

    n = 6
    samples = bernoulliTrial(n, 0.50, 10)
    StockProbabilities = []
    S_0 = 2465.42
    u = 1.01
    d = 0.99
    for k in samples:
        S_n = S_0 * (u**k) * (d**(n-k))
        StockProbabilities.append(S_n)
    StockProbabilities
    plt.hist(StockProbabilities,  align = 'left')
    plt.xlabel('Value')
    plt.ylabel('Occurences')
    plt.legend(['Stock Process']);

     코드를 통해서 구현한 6일 뒤의 주가는 아래 그림 2와 같이 나타낼 수 있다.(코드를 실행할 때마다 다른 값이 나올 것이다.)

    그림2: 6일 뒤 주가 예측 결과값 예시

    반응형
Designed by Tistory.