pandas-datareaderで取得した株価から、収益率と累積収益率を計算する

##1.日経平均を取得してグラフ描画する
```python:test1.py
!pip install pandas_datareader

import matplotlib.pyplot as plt
import matplotlib.style as style
from datetime import datetime
import pandas_datareader.data as web

style.use('fivethirtyeight')
        
st='2018/01/01'
ed='2018/12/31'

df=web.DataReader('NIKKEI225','fred',st,ed)
df=df.fillna(method='ffill')
df.plot()

```
・pandas-datareaderを用いて株価データを取得
・日経平均は、セントルイス連邦準備銀行の[FRED](https://fred.stlouisfed.org/)から取得
・matplotlibのスタイルは「[fivethirtyeight](https://matplotlib.org/examples/style_sheets/plot_fivethirtyeight.html)」を使用。
　※538：アメリカの統計学者[ネイトシルバー](https://ja.wikipedia.org/wiki/%E3%83%8D%E3%82%A4%E3%83%88%E3%83%BB%E3%82%B7%E3%83%AB%E3%83%90%E3%83%BC)のサイトFiveThirtyEight.comより
・株価は値が付かないケースもあるので、欠損値を埋める作業が必要。
・pandasには、fillna()が用意されている。`method='ffill'`、つまり前営業日の値で埋める処理を施す。

※出力結果：2018/01/04〜2018/11/23_nikkei225
![20181125_1.png](https://qiita-image-store.s3.amazonaws.com/0/91974/3e3c392d-ce92-74ee-d5bb-1362b5acf5e1.png)
2月と10月に大きく下落していますね...

##2.収益率と累積収益率を計算する
```python:test2.py
#
!pip install pandas_datareader

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.style as style
from datetime import datetime
import pandas_datareader.data as web

style.use('fivethirtyeight')

def culc(df):
        x=df.fillna(method='ffill').dropna()
        
        #変化率
        stk_ret=x.pct_change()
        g=stk_ret.plot()
        g.axhline(y = 0, color = 'black', linewidth = 1.3, alpha = .7)
        
        #累積積
        cum_ret_d=(1+stk_ret).cumprod()
        cum_ret_d.iloc[0]=1
        g=cum_ret_d.plot()
        g.axhline(y = 1.0, color = 'black', linewidth = 1.3, alpha = .7)
        
st='2018/01/01'
ed='2018/12/31'
ds=['DJIA','NIKKEI225']

df = web.DataReader(ds,'fred',st,ed)
culc(df)

```
・ダウ平均(DJIA)と日経平均(NIKKEI225)を取得
・複数の銘柄を取得する場合は、リストlistにしてDatareaderで引数指定すれば取得可能
・株価(指数)の日々の収益率を計算するには、dfの変化率を<font color=red>pct_change()</font>で算出すれば可能
・ある時点を1(100)として、そこからの累積収益率を求める場合は、dfの変化率を<font color=red>pct_change()</font>で算出して、それを<font color=red>cumprod()</font>で累積積を算出すればOK
・dfのpct_change()を算出すると、dfの１件目の値は、最初の項目なので変化率が計算できずにNaNになる。ゆえに累積積をcumprod()で算出した後に１をセットしておく
・pct_changeのpctは<font color=blue>percent</font>(パーセント)の略、cumprodは<font color=blue>cumulative product</font>(累積的な積)の略っぽい。
・グラフ上にYの実線を入れたい場合は、axhline(）で描画する

※収益率の算出結果：pct_change()
![20181125_2.png](https://qiita-image-store.s3.amazonaws.com/0/91974/eb271c0a-8b90-ce05-4577-e32ac24fc3fc.png)

※累積収益率の算出結果：pct_change()→ cumprod()
![20181125_3.png](https://qiita-image-store.s3.amazonaws.com/0/91974/97ece901-99cb-a1ae-22f2-96a730a284e6.png)

・累積収益率を計算する趣旨としては、例えばダウや日経平均など数値水準や通貨単位が異なるものを、任意の日を１もしくは100とした場合の、そこからの変化の推移を比較することが可能という点と。その任意の日から株式(orETFなど)をバイアンドホールドした場合の収益結果を示すことが可能という点である。
・上記グラフの場合だと、ダウと日経平均に連動のETFを2018年1月1日に1株ずつ購入し現在まで保有し続けた場合の収益結果を直感的に図示することが可能。(現実には売買単位100株とかあるので、１株で買える買えないというのはあるのだが、結果を単純化するという意味で1株ということになる)
・ここでいう「収益率」というのは<font color=blue>キャピタルゲイン</font>の事であり、インカムゲイン配当収益は加味していない。もっと言うと証券会社への売買手数料や税金(譲渡課税や配当課税)もここでは考慮していない。

##3.複数銘柄で組成したPFの収益率と累積収益率を計算する
```python:test3.py
#
!pip install pandas_datareader

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.style as style
from datetime import datetime
import pandas_datareader.data as web

style.use('fivethirtyeight')

def culc(df):
        x=df.fillna(method='ffill').dropna()
        stk_ret=x.pct_change()
        cum_ret_d=(1+stk_ret).cumprod()
        cum_ret_d.iloc[0]=1
        g=cum_ret_d.plot()
        g.axhline(y = 1.0, color = 'black', linewidth = 1.3, alpha = .7)

st='2018/01/01'
ed='2018/12/31'
ds=['DJIA','NIKKEI225']

df = web.DataReader(ds,'fred',st,ed)
culc(df)

#2914:JT
#7201:Nissan

#２銘柄の株価取得
df = web.DataReader(['2914.JP','7201.JP'],'stooq')
#print(df.items)

x=df['Close']
x=x.sort_index(ascending=True)
x=x['2018-03-25':]
x=x.T
fd=x.sum()
culc(fd)

```
・日本株式の複数銘柄の株価を取得したい場合、pandas_datareaderを用いてStooqから取得
・複数銘柄をリストにしてpandas_datareaderを用いてStooqから取得すると、結果のデータセットはxyzの3次元オブジェクトが返ってくるので、上記ではまず終値[Close]を指定してDateと終値の２次元オブジェクトにして、そのあと３/２５以降のレコードを利用するようにしている。あとdfの並び順が降順だったので、set_indexを指定して昇順に変更している。
・複数銘柄の株価の収益率と累積収益率を計算する場合は、pct_change()で変化率を計算した上で、cumprod()で累積の積を計算するという流れは一緒なのだが。収益率を算出する前に、最初にdfを<font color=red>転置(transpose)</font>したものを<font color=red>sum()</font>で各銘柄の株価の合計値を算出しておくのがポイント。
・df(データフレーム)はベクトルオブジェクトなので、行列の転置は超簡単に行える。
・上記の例では、配当利回りが高い(と言われている２銘柄)2914_JTと7201_日産自動車の株を３/２５（権利落ち直前日）に１株ずつ購入して保有し続けた場合のpfの累積収益率を算出しグラフ描画している(該当pfは黄色)
※注：売買単位100株なので現実には１株だけ買うのは無理です
・JTは12月決算なので、正確に言うと ３月２５日に購入してもしなくても配当には関係なしです。~~ただJTは１月２月に株価爆下げしているので、１月に購入していた場合、もっと悲惨な状況になっていたことかと。いや購入タイミングって重要ですよねー~~

![20181125_4.png](https://qiita-image-store.s3.amazonaws.com/0/91974/113af17f-fa5e-16bb-06c0-4c4ff928b6f0.png)

・上記ではPFにJTと日産自動車の２銘柄のバイアンドホールドの累積収益率を算出したが、もちろんPFはロングショートでも可能です。pandas-datareader（FREDやstooq）ではTOPIXの値が取得できないのだけれども。例えば日経平均を1株買い、かつTOPIXを１株売るといったNT倍率チックなPFでも収益率は計算可能で、ショートするTOPIXの列の値に係数(-1)を掛けた上で、転置T→ sum()をしてあげれば計算可能かと思われ。
・ていうかTOPIXの値、どうやって調達すればいいのだろうか？

##4.余談
ちなみに以下グラフは１年前、2017年のダウ平均と日経平均の累積収益率の推移です↓
![20181124_5.png](https://qiita-image-store.s3.amazonaws.com/0/91974/7bdb754d-d863-9080-a48b-730902ee3ecc.png)
ほぼ右肩上がりというか、ゴルティロックス（適温相場）というか。