『フィナンシャルモデリング』をPythonで実装してみた(1)株価データをインポート


はじめに

サイモンベニンガ著『ファイナンシャル・モデリング』(2017、ロキガ書房)の内容をPythonで実装してみました。本記事は本のp191-196に該当します。

1. Yahoo Financeから時系列データを読み込む

(参照:https://qiita.com/ympnov22/items/0dd0dfd1785015e8b36f

まず、これから必要になるライブラリをインポートします。

import pandas as pd
import pandas_datareader.data as pdr
import matplotlib.pyplot as plt
%matplotlib inline

今回はpandasのdatareaderを用いて株価情報を読み取ります。

#Yahoo FinanceからGoogleの2011/01/01~2012/12/31までのデータを取得する
google = pdr.DataReader('GOOGL', 'yahoo', '2011/1/1', '2012/1/1')
apple = pdr.DataReader('AAPL', 'yahoo', '2011/1/1', '2012/1/1')

pdr.DataReaderの引数は(name, data_source, start_date, end_date)の4つで、

  • name: 取り出したい株の銘柄
  • data_source: データの取り出し元(今回はyahoo)
  • start_date: データ取得の開始日(今回は2011/01/01)
  • end_date: データ取得の終了日(今回は2012/01/01)

となっています。
上のコードを実行することで、googleという変数には2011/01/01~2012/01/01のグーグル社の株価情報がpandas.DataFrameの形で入りました。appleも同様です。
ちなみにこのDataFrameは

のような形になっています。

2. 日次収益率を求める

日次リターンの計算には先ほど読み込んだDataFrameの'Adj Close' (調整後終値) という列を使用します。

#調整後終値を抽出する
gg_adjClose = google[['Adj Close']]
app_adjClose = apple[['Adj Close']]

DataFrameから特定の列を取り出したら、pct_change()というpandasのメソッドを使って前日からの増分を計算します。また、今後のためにrename()メソッドを使ってカラムの名前を"Adj Close"から"Goolge"に変更しておきます。

#日次リターンを求める。データフレームの最初の行がNaNになるのでdropna()する。
gg_daily_pct_change = gg_adjClose.pct_change().dropna()
#列の名前を変更
gg_daily = gg_daily_pct_change.rename(columns={'Adj Close': 'Google'})

Appleも同様です。

app_daily_pct_change = app_adjClose.pct_change().dropna()
app_daily = app_daily_pct_change.rename(columns={'Adj Close': 'Apple'})

比較しやすくするために二社のデータを横に連結し、dailyという一つのDataFrameを作ります。

#2社分のデータを結合
daily = pd.concat([gg_daily, app_daily], axis = 1)

以上でこんな感じの日次収益率のDataFrameが出来上がりました。

統計量を求める

平均、標準偏差、共分散、相関関数などの基本的な統計量を求めます。

#基本統計量
daily.describe()

このコードを実行すると

上からデータ数、平均、標準偏差、最小値、第一四分位数、中央値、第三四分位数、最大値が表示されます。

共分散と相関係数は次のように求められます。

#共分散
cov = daily.cov()['Google']['Apple']
#相関係数
corr = daily.corr()['Google']['Apple']

4. 二社の傾向線を引く

matplotlibを使って日次収益率の散布図を作ってみましょう。

apple = daily['Apple']
google = daily['Google']
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.scatter(x=apple, y=google)
ax.grid()
ax.set_xlabel('Apple')
ax.set_ylabel('Google')

このコードを実行すると散布図ができます。

上のコードに次のコードを追加すれば傾向直線が引けます。

ax.plot(apple, np.poly1d(np.polyfit(apple, google, 1))(apple), color="red", label='trend line')

完成です!

宣伝

SmartTrade社では毎週水曜日18:00から勉強会を行っています。(https://python-algo.connpass.com/)