ランダムの森

20代エンジニアです。プログラミングについて主に書いてます。

持ち株会入会資産シミュレーションのpythonコード

持ち株会入会資産シミュレーションを行ったpythonコードをつらつらと書いていきます。
本編こちらです↓
dorei-kaiho.hatenablog.com

必要なライブラリーをインポート。

import numpy as np
import pandas as pd
import random
import matplotlib.pyplot as plt
%matplotlib inline  

まずは株価の変動のデータテーブルを作る関数です。stock_price[-1] + random.uniform(-100,100)で前日の終値からランダムで-100~+100を加えます。それを最後まで繰り返すことでランダムウォーク株価ができます。時間は単純に0から720まで。1ヶ月4週間20日×36ヶ月=720日分で計算。

def create_stock_price(initial_price = 4000):
    #今回は初期値を4000円とする
    stock_price = [initial_price]
    random.seed()
    for i in range(720):
        #株価は前日の株価から100円前後の範囲で変動するとする
        stock_price.append(stock_price[-1] + random.uniform(-100,100))
    df = pd.DataFrame(stock_price,columns = ['stock_price'])
    df['TIME'] = df.index
    df = df.loc[:,['TIME','stock_price']]
    #df.plot(x = 'TIME',y = 'stock_price', style = 'ko',markersize = 1)
    return df

月々の5万円買付による取得株数を計算。奨励金は10%とする。

def get_stock(stock_price,one_pay = 50000, incentive = 0.1):
    #奨励金は10%で一回の買付で獲得する株数を計算します
    share_get = (1 + incentive) * one_pay/stock_price
    return share_get

次に1ヶ月に一回株買付を行い、100株溜まった瞬間い現金化するという関数です。買い付けを行わない日は株価の変動によって資産評価が動きます。

def create_df(df):
    stock_price = df['stock_price'].values.tolist()
    stock_share = [0]
    stock_asset = [0]
    cash_asset = [0]
    asset = [0]
    payment = [0]

    for t in range(len(stock_price)):
        #日々株価変動
        current_stock_price = stock_price[t]
        if t % 20 ==0:
            #1ヶ月に一回株買付
            stock_share.append(stock_share[-1] + get_stock(current_stock_price))
            payment.append(payment[-1] + 50000)
            #保有株が100株を超えたら即時現金化
            if stock_share[-1] >= 100:
                cash_asset.append(cash_asset[-1] + current_stock_price * 100)
                stock_share[-1] = stock_share[-1] -100
            else:
                cash_asset.append(cash_asset[-1])
        else:
            #買付時以外は現金資産は一定、株式資産は株価で変動
            stock_share.append(stock_share[-1])
            cash_asset.append(cash_asset[-1])
            payment.append(payment[-1])
        stock_asset.append(stock_share[-1] * current_stock_price)
        asset.append(cash_asset[-1] + stock_asset[-1])
        #資産増加に対して入金した額を引いてメリット額の推移を算出
        benefit = np.array(asset) - np.array(payment)
    df['cash_asset'] = cash_asset[1:]
    df['stock_asset'] = stock_asset[1:]
    df['total_asset'] = asset[1:]
    df['payment'] = payment[1:]
    df['benefit'] = benefit[1:]
    return df

上記で作った関数を使ってシミュレーションを100回行います。ちなみにパソコンなので1000回でも10000回でもシミュレーション可能です。

final_benefit = []
#シミュレーション100回行う
for i in range(100):
    #create_df(create_stock_price()).plot(x = 'TIME',y = 'benefit', style = 'ko',markersize = 1)
    #シミュレーション最終日の利益を計算(月々の単純貯蓄と比較)
    final_benefit.append(create_df(create_stock_price())['benefit'].iloc[-1])
    #if create_df(create_stock_price())['benefit'].iloc[-1] < 0:
        #create_df(create_stock_price()).plot(x = 'TIME',y = 'stock_price', style = 'k:',markersize = 1)

最後に月々の単純貯蓄と比較した時の利益額をヒストグラムにします。

plt.hist(np.array(final_benefit),bins = 50)

output>
f:id:doreikaiho:20190105153721p:plain:h240