[[418764]] この記事では、主にPythonを使用してビリビリの株価を分析する方法について説明します。株価データの基礎分析を行い、matplotlib描画ライブラリと組み合わせて視覚化し、機械学習手法であるモンテカルロシミュレーションを使用して、今後1年間の株価動向を予測します。 インストールnumpy、pandas、matplotlib、scipy などの Python データ サイエンス ツールキットをインストールする必要があります。 - #公式アカウントをフォロー: Kuankebang、「ソースコード」と返信すると、この記事の完全なソースコードをダウンロードできます。
- numpyをnpとしてインポートする
- pandasをpdとしてインポートする
- 数学からインポートsqrt
- matplotlib.pyplot をpltとしてインポートします。
- scipy.statsからnormをインポート
- pandas_datareaderからデータをインポートする
分析対象は、2018年の上場から2021年現在までのビリビリ(銘柄コード:BILI)のデータです。データはYahooから提供されています。ここでは、pd.to_datetime を使用して、データ セットの時間を時系列に変換し、株価分析を容易にしています。 - BILI = data.DataReader( 'BILI' , 'yahoo' , start= '2018/3/29' ,)
- BILI.index =pd.to_datetime( BILI.index )
まず、head() メソッドを使用して、データ セットの構造を確認します。データ セットには、株式の始値、終値、1 日の最小値と最大値、取引量などの情報が含まれています。この記事の下部にある QR コードをスキャンして、完全なソース コードと Jupyter Notebook ファイルをダウンロードしてください。 始値トレンドmatplotlib を使用してデータを視覚化できます。plt.legend は画像の凡例を設定するために使用されます。loc は凡例の位置です。upper right は凡例が右上隅にあることを意味します。チャートからわかるように、ビリビリ株は2020年12月から2021年2月にかけて急成長し、その後株価は下落しました。 - plt.figure(図サイズ=(16,6))
- BILI[ '開く' ].plot()
- plt.legend([ 'BILI' ],loc= '右上' )
株式取引量株の取引量を見てみましょう。 - plt.figure(図サイズ=(16,6))
- BILI[ 'ボリューム' ].plot()
- plt.legend([ 'BILI' ],loc= '右上' )
- plt.xlim( BILI.インデックス[0], BILI.インデックス[ -1])
株式総取引量以下の銘柄の総取引量を分析してみましょう。グラフを見ると、2021年1月から5月までのある日の総取引額が過去最高を記録したことが一目瞭然です。 - BILI[ '総取引量' ]=BILI[ '始値' ]*BILI[ '取引量' ]
-
- plt.figure(図サイズ=(16,6))
- BILI[ '合計取引' ].plot()
-
- plt.legend([ 'BILI' ],loc= '右上' )
- plt.xlim( BILI.インデックス[0], BILI.インデックス[ -1])
次に、argmax() を使用して、取引金額が最大となる日付を取得します。 - BILI[ '合計取引' ].argmax()
出力は次のようになります。 - タイムスタンプ( '2021-02-25 00:00:00' )
ニュースを調べたところ、2021年2月25日に、ビリビリ(NASDAQ: BILI)が2020年12月31日までの第4四半期および通期の監査対象外財務報告書を発表したことがわかりました。財務報告が発表された後、ビリビリの米国株式市場での株価は時間外取引で5%以上上昇した。 終値とその移動平均BILI 株の終値とその移動平均が以下にプロットされています。移動平均を取得するには、DataFrame の rolling() 関数を使用できます。 - BILI[ '閉じる' ].plot(figsize=(16,6),xlim=(BILI.index [ 0],BILI.index [ -1]))
- BILI[ 'Close' ].rolling(50).mean().plot(label= 'BILI MA50' )
- BILI[ 'Close' ].rolling(200).mean().plot(label= 'BILI MA200' )
- plt.凡例()
株式の利益率以下では、各株の日次リターンを計算し、ヒストグラムで表示します。日次収益率を計算する方法は3つあります。1つ目は計算式を直接使う方法、2つ目は金融分野専用のサードパーティライブラリのffn.to_returns関数をインポートする方法、3つ目はpandasが提供するpct_change(1)関数を使って計算する方法です。この記事の下部にある QR コードをスキャンして、完全なソース コードと Jupyter Notebook ファイルをダウンロードしてください。 - #公式アカウントをフォロー:Kuankebang、「ソースコード」と返信すると完全なソースコードが取得でき、計算式を直接使用できます
- BILI[ '戻り' ]=(BILI[ '終値' ]-BILI[ '終値' ].shift(1))/BILI[ '終値' ].shift(1)
- BILI = BILI.dropna()
-
- #金融分野専用のサードパーティライブラリをインポートするffn.to_returns関数の計算
- ffnをインポートする
- BILI[ '戻る' ] = ffn.to_returns(BILI[ '閉じる' ])
-
- #計算にはpandasの独自の関数pct_change(1)を使用する
- BILI[ '戻る' ]=BILI[ '閉じる' ].pct_change()
- BILI = BILI.dropna()
-
- #公式アカウントをフォロー: Kuankebang、「ソースコード」と返信すると、この記事の完全なソースコードをダウンロードできます。
- plt.hist(BILI[ 'Return' ],bins=50)
箱ひげ図を使って収益率を観察することもできる - box_df = pd.concat([BILI[ 'Return' ]],axis=1)
- box_df.columns = [ 'BILIリターンズ' ]
- box_df.plot(種類= 'box' 、図サイズ=(8,11)、カラーマップ= 'jet' )
株式の累積収益をプロットする - BILI[ '累積リターン' ]=(1+BILI[ 'リターン' ]).cumprod()
-
- BILI[ '累積リターン' ].plot(label= 'BILI' ,figsize=(16,8),title= '累積リターン' )
- plt.凡例()
株式の年間複利成長率と収益の年間変動率株式の年間複利成長率と収益の年間変動率を計算します。 - #公式アカウントをフォロー: Quantcom、「ソースコード」と返信すると完全なソースコードが取得でき、複合年間成長率を計算できます
- 日数 = ( BILI.index [-1] - BILI.index [ 0]).日数
- cagr = ((((BILI[ 'Adj Close' ][-1]) / BILI[ 'Adj Close' ][1])) ** (365.0/日)) - 1
- print ( 'CAGR =' ,str(round(cagr)*100)+ "%" )
- ミュー = cagr
-
- #リターンの年間変動率を計算する
- BILI[ 'リターン' ] = BILI[ '調整終値' ].pct_change()
- vol = BILI[ '戻り値' ]*sqrt(252)
- print ( "年間ボラティリティ =" ,str(round(vol,4)*100)+ "%" )
CAGR = 71.72%年間変動率 = 65.14% モンテカルロシミュレーションを使用した株価動向の予測正規分布に従う毎日の収益のランダム抽出に基づいて、次の取引年 (252 日間) の基礎価格シリーズの進化の単一のシミュレーションを予測してみましょう。最初のグラフに示されている単一の線シリーズによって表されます。 2 番目のグラフは、1 年間にわたるこれらのランダムな毎日のリターンのヒストグラムをプロットします。この記事の下部にある QR コードをスキャンして、完全なソース コードと Jupyter Notebook ファイルをダウンロードしてください。 - S = BILI[ 'Adj Close' ][-1] #開始株価(最終日の実際の株価)
- T = 252 #取引日数
- mu = 0.7172 #年平均成長率
- vol = 0.6514 #年間ボラティリティ
-
- #公式アカウントをフォロー: Quantcom、「ソースコード」と返信して完全なソースコードを取得し、ランダム正規分布を使用して毎日の収入リストを作成します
- daily_returns = np.random.normal((mu/T),vol/math.sqrt(T))+1
-
- #公式アカウントをフォロー: Kuankebang、「ソースコード」と返信すると、この記事の完全なソースコードをダウンロードできます。
- 価格リスト = [S]
-
- daily_returnsのxについて:
- 価格リスト.append(価格リスト[-1]*x)
-
- #価格系列の折れ線グラフを生成する
-
- plt.plot(価格リスト)
- plt.show()
日次収益のヒストグラムを生成する - plt.hist(毎日の戻り値-1, 100)
- plt.show()
ビリビリ株価の今後の動向を予測する1,000回のシミュレーション。 - numpyをnpとしてインポートする
- インポート数学
- matplotlib.pyplot をpltとしてインポートします。
- scipy.statsからnormをインポート
-
- #公式アカウントをフォロー: Kuankebang、「ソースコード」と返信すると、この記事の完全なソースコードをダウンロードできます。
- S = BILI[ 'Adj Close' ][-1] #開始株価(最終日の実際の株価)
- T = 252 #取引日数
- mu = 0.7172 #年平均成長率
- vol = 0.6514 #年間ボラティリティ
-
- #シミュレーションの実行回数を選択します - 私は1000を選択しました
- iが範囲(1000)内にある場合:
- #ランダム正規分布を使用して日次リターンのリストを作成する
- daily_returns = np.random.normal(mu/T,vol/math.sqrt(T))+1
-
- #開始価格を設定し、上記のランダムな毎日のリターンによって生成された価格リストを作成します
- 価格表 = [S]
-
- daily_returnsのxについて:
- 価格リスト.append(価格リスト[-1]*x)
-
- # 個々の実行からデータをプロットします。最後にプロットします
- plt.plot(価格リスト)
-
- #上記で作成した複数の価格シリーズのグラフを表示します
- plt.show()
ビリビリ株価の今後の動向を予測する10,000回のシミュレーション。 - numpyをnpとしてインポートする
- インポート数学
- matplotlib.pyplot をpltとしてインポートします。
- scipy.statsからnormをインポート
-
- #公式アカウントをフォロー: Kuankebang、「ソースコード」と返信すると、この記事の完全なソースコードをダウンロードできます。
- 結果 = []
-
- #変数を定義する
- S = BILI[ 'Adj Close' ][-1] #開始株価(最終日の実際の株価)
- T = 252 #取引日数
- mu = 0.7172 #年平均成長率
- vol = 0.6514 #年間ボラティリティ
-
- #シミュレーションする実行回数を選択します - 10000を選択します
- iが範囲(10000)内にある場合:
- #ランダム正規分布を使用して日次リターンのリストを作成する
- daily_returns = np.random.normal(mu/T,vol/math.sqrt(T))+1
-
- #開始価格を設定し、上記のランダムな毎日のリターンによって生成された価格リストを作成します
- 価格表 = [S]
-
- daily_returnsのxについて:
- 価格リスト.append(価格リスト[-1]*x)
-
- # 個々の実行からデータをプロットします。最後にプロットします
- plt.plot(価格リスト)
-
- #各シミュレーション実行の終了値を、最初に作成した空のリストに追加します
- 結果を追加します(価格リスト[-1])
-
- #上記で作成した複数の価格シリーズのグラフを表示します
- plt.show()
複数のシミュレーション用に、株価の終値のヒストグラムを作成します。 - plt.hist(結果、ビン=50)
- plt.show()
numpy の mean 関数を使用して平均の分布を計算し、「期待値」を取得します。 - print(round(np.mean(結果)))
- 139.18
- NumPyの「パーセンタイル」関数を使用して5%と95%の分位数を計算する
- print( "5% の分位数 =" ,np.percentile(result,5))print( "95% の分位数 =" ,np.percentile(result,95))
-
- 5% 分位数 = 38.33550814175252
- 95% 分位数 = 326.44060907630484
先ほど計算した 2 つの分位数をヒストグラムにプロットして、視覚的に表現してみましょう。 - plt.hist(結果、ビン=100)
- plt.axvline(np.percentile(result,5)、色= 'r' 、線のスタイル= '破線' )
- plt.axvline(np.percentile(result,95)、色= 'r' 、線のスタイル= '破線' )
- plt.show()
上記の結果から、ビリビリ(BILI)の株価が最終的に 38.33 米ドルを下回る確率は 5%、326.44 米ドルを上回る確率は 5% であることがわかります。株価が 326.44 ドルを超えた場合の利益を追いかけるために、株価が 38.33 ドルを下回った場合に 5% の損失を被るリスクを負う覚悟はありますか? |