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

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

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

（参照：https://qiita.com/ympnov22/items/0dd0dfd1785015e8b36f ）

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

```python
import pandas as pd
import pandas_datareader.data as pdr
import matplotlib.pyplot as plt
%matplotlib inline
```
今回はpandasのdatareaderを用いて株価情報を読み取ります。

```python
#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)の４つで、

- **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は
<img width="541" alt="スクリーンショット 2019-04-29 午後5.20.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355309/8a9f28d1-2c54-686d-c2e2-df6af2655e77.png">
のような形になっています。

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

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

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

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

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

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

```python
#2社分のデータを結合
daily = pd.concat([gg_daily, app_daily], axis = 1)
```
以上でこんな感じの日次収益率のDataFrameが出来上がりました。
<img width="233" alt="スクリーンショット 2019-04-29 午後5.37.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355309/470ac7a0-d467-476a-3abd-fbe6ee7e8acc.png">


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

```python
#基本統計量
daily.describe()
```

このコードを実行すると
<img width="220" alt="スクリーンショット 2019-04-29 午後5.43.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355309/c34df81c-b034-8411-578a-ad81ae9eaf2a.png">

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

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

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

#4. 二社の傾向線を引く
matplotlibを使って日次収益率の散布図を作ってみましょう。

```python
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')
```

このコードを実行すると散布図ができます。
<img width="432" alt="スクリーンショット 2019-04-29 午後6.01.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355309/1b457c9b-85d1-4e09-e6f4-d65a26f8d160.png">

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

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

<img width="458" alt="スクリーンショット 2019-04-29 午後6.04.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355309/cb7e65f9-4ce9-38ee-bb73-128962ded973.png">


完成です！

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