#はじめに
サイモンベニンガ著『ファイナンシャル・モデリング』(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/)