파이썬으로 주가를 시뮬레이션 해 보았습니다.

파이썬을 사용하여 미래의 주가를 시뮬레이션하려고합니다.

Python, 주식의 이야기입니다만, 거기까지 어려운 내용까지는 밟지 않으므로 부담없이 읽어 주시면 좋겠습니다.

배경



마지막 기사에서 다음을 알았습니다.
  • 상장 지수 펀드 TOPIX (1308)의 2011/7/22 ~ 2021/7/21 데이터에 대한 분석
  • 전 데이터의 5%를 이상, 95%를 정상이라고 가정하고, OneClassSVM에서 정상 상태와 이상 상태로 나누는 것으로, 각각의 상태내에서는 주가의 리턴(전일 비율)이 정규 분포하고 있는 것 확인 됨
  • 정상상태에서 주가의 전일 비율은
  • 평균 : 1.0005478168389164
  • 표준편차: 0.01024285501985374

  • 비정상 상태에서 주가의 전일 비율은
  • 평균 : 0.9971137713072488
  • 표준편차:0.029152921438795287

  • 모든 데이터의 5%가 비정상 상태


  • 이 지식을 바탕으로 상장 지수 펀드 TOPIX의 미래 주가를 시뮬레이션합니다.

    시뮬레이션을 위한 함수 만들기



    먼저 위의 지식을 바탕으로 시뮬레이션을 위한 함수를 작성합니다. 이 함수를 실행하면 분포에 따른 주가의 전일 비율이 반환됩니다.
    # 関数を定義
    def make_return():
        loc1 = 1.0005478168389164
        loc2 = 0.9971137713072488
        scale1 = 0.01024285501985374
        scale2 = 0.029152921438795287
    
        # 5%の確率で異常状態の正規分布からサンプリング
        if np.random.rand() < 0.05:
            a  =np.random.normal(loc2,scale2)
            svm_result = -1
        # 95%の確率で正常状態の正規分布からサンプリング
        else:
            a = np.random.normal(loc1, scale1)
            svm_result = 1
        return a, svm_result
    

    이 함수를 10000번 실행한 결과를 시각화합니다. 정상·이상의 2개의 정규 분포를 작성할 수 있는 것을 확인할 수 있었습니다.
    # 10000回シミュレーションを実行
    return_list = []
    svm_list = []
    for i in range(10000):
        a, svm_result = make_return()
        return_list.append(a)
        svm_list.append(svm_result)
    
    return_list = np.array(return_list)
    df_sim  =pd.DataFrame({'return':return_list, 'svm':svm_list})
    
    # シミュレーションの結果確認
    plt.hist(df_sim[df_sim['svm'] == 1]['return'], bins = 30)
    plt.hist(df_sim[df_sim['svm'] == -1]['return'], bins = 30)
    plt.show()
    



    시뮬레이션 실행



    20년간의 시뮬레이션을 1000회 실행합니다.
    # 結果の箱を作成
    df_sim1 = pd.DataFrame()
    
    from tqdm import tqdm
    
    # 1000回シミュレーションを実行
    for j in tqdm(range(1000)):
        return_list = []
    
        #1年間を240日と考えて、20年後までをシミュレーションする
        for i in range(240 * 20):
            a,svm_result = make_return()
            return_list.append(a)
        return_list = np.array(return_list)
        df_sim1[j] = return_list
    
    # 累積リターンを計算
    df_sim2 = df_sim1.cumprod()
    df_sim2.head()
    



    시뮬레이션 결과 시각화



    우선 1년간의 시뮬레이션 결과를 시각화합니다. 가로축이 몇일 후인지를 나타내고, 세로축이 주가가 몇 배가 되는지를 나타냅니다. 1년 후에 1배를 밑돌아 버려, 손실이 되어 버리는 그래프의 색은 적색으로 하고 있습니다.
    # 結果を可視化
    plt.figure(figsize = (15, 4))
    num = 0
    for i in df_sim2.columns:
        # 1年後までを可視化
        temp=df_sim2[i].iloc[:240 * 1]
    
        # 最終結果が1以下の場合はグラフを赤色に変更
        if temp.iloc[-1] < 1:
            plt.plot(temp.index, temp, alpha = 0.2, c = 'r')
            num += 1
        else:
            plt.plot(temp.index, temp, alpha = 0.2, c = 'g')
    
    print("損失が出る確率:{}/1000".format(num)) 
    print("中央値:{:.3f}倍".format(df_sim2.iloc[240 * 1 - 1].median()))
    plt.title('シミュレーション結果(1年間)')
    plt.ylabel('倍')
    plt.xlabel('日')
    plt.show()
    

    1000회 시뮬레이션의 결과, 1년 후에 손해를 입을 확률은 34.1%, 중앙값에서는 주가가 1.078배, 즉 리턴이 7.8%인 것을 알 수 있습니다.



    마찬가지로 5년 후, 10년 후, 20년 후까지의 시뮬레이션을 그래프로 하면 다음과 같이 됩니다.
    20년 후에는 손해를 입을 확률은 5.2%까지 떨어지고, 1000회 시뮬레이션한 경우의 중앙값에서는 주가가 4.125배, 즉 리턴이 312.5%인 것을 알 수 있습니다.






    요약



    파이썬과 기계 학습을 사용하여 장기 투자의 이점을 보여줄 수있었습니다!
  • 주식의 기대 수익은 비정상적인 상태에서 부정적이지만, 가미해도 총 기대 수익이 더해집니다.
  • 따라서 구입하고 장기 보유하는 것만으로 손해를 입을 확률이 줄어든다
  • 20 년 계속 유지하면 손해 확률은 5.2 %로 가격이 4 배가 될 확률이 높다
  • 좋은 웹페이지 즐겨찾기