ポートフォリオのリバランス：効果を計算してみた（株価取得編）

## リバランスって？

[「なぜ長期投資には「リバランス」が必要？」](https://www.wealthnavi.com/contents/column/38/)から引用すると・・

・最適なポートフォリオ（資産の組み合わせ）は放っておくと崩れる
・ポートフォリオを最適な状態に戻すのがリバランス
・リバランスによって、リスクを取りすぎることを防げる

投資をする上でなんだか重要そうな雰囲気・・ただ、実際どんな効果があるの？おいしいの？
ということで、試しに過去の株価データを使って計算してみたので紹介します。

注：将来どうなるかは保証するものではありませんのでご注意ください。
取引ルールなどはざっくり加味したつもりですが、細かい点についてご容赦下ください。


### 目次

- ポートフォリオのリバランス：効果を計算してみた（株価取得編）（本記事）
- [ポートフォリオのリバランス：効果を計算してみた（リバランス編）](https://qiita.com/eigs/items/e9496dac362331e61cc7)

### 実行環境
- MATLAB R2019a (本体のみ）
- [Historical Stock Data Download (alternate Method)](https://jp.mathworks.com/matlabcentral/fileexchange/37502-historical-stock-data-download-alternate-method?s_eid=PSM_29435) の get_yahoo_stockdata3 関数

### 仮想ポートフォリオ

上で引用した WealthNavi (注：関係者ではありません）が提供している中程度にリスクを取ったポートフォリオを例に試してみます。

| 銘柄名        |  割合   |
|:--------------|:--------:|
| VTI（米国株）  |  31.0% |
| VEA（日欧株）  | 23.4% |
| VWO（新興国株）|  6.1% |
| AGG（米国債券）| 27.7% |
| GLD（金）      | 6.8% |
| IYR（不動産）  | 5.0% |


この解説でのリバランスは、株価の値動きにより想定割合を超えた株を売り、想定割合に達していない株を買うことを前提とし、追加資金は投入しない前提で行います。実際にはいろいろややこしいことがあるとは思いますが、ここでは思い切っておつりなく売り買いが成り立つ想定で行きます。

WealthNavi では、自動で実施してくれることが１つのウリのようです。もちろんそれなりの手数料がかかりますが・・。


## 結果どうなった？

結果から先に紹介します。


- 黄色、リバランスを実施せずほったらかしたケース（ベース）：**+76%**
- 青色、毎週リバランスを実施したケース：**+82%**
- 赤色、毎週リバランスを実施し、手数料・税金が無かったと仮定したケース：**+95%**

![results.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/622a0151-676b-4637-9f89-2845c20bae34.png)

上の図は2007年7月末に上表の割合で一括投資した時のパフォーマンス（配当込み）です。10,000ドル投資していれば、ほったらかしで 7,600ドル の利益、毎週リバランスを実施したとして 8,200ドル の利益（それぞれ税引前）との結果に。リバランスに関わる手数料・税金で 1,300 ドル持っていかれるという結果に。

リバランスに関わる取引手数料は 0.54%、キャピタルゲインや配当にかかる税金は20%として「ざっくり」加味してます。

そんなに差がつかないもんだな・・・いや、リバランス自体はパフォーマンス向上に効果ありそうだけど**手数料・税金の影響が大きい**ですね。~~できるだけ証券会社・国にお金をもっていかないようにすることが最重要ですね。~~

2009年-2012年付近は
（手数料・税金なしのケース）＜（手数料・税金ありのケース）
と不思議な現象となっていますが、こちらはざっくり「損益通算」してしまっていることが影響しています。リーマンショックの株価下落によって売却時に損が出てしまった際に、税金が還付されているイメージです。


ちなみに、±15％までバランスが崩れたときにだけリバランスを実施するとした時の結果がこちら。

![results15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/6a52d6e9-4ba2-7371-8ef6-dfc1c97d1bf8.png)


- 黄色、リバランスを実施せずほったらかしたケース（ベース）：**+76%**
- 青色、15%の崩れでリバランスを実施したケース：**+100%**
- 赤色、15%の崩れでリバランスを実施し、手数料・税金が無かったと仮定したケース：**+117%**

10,000ドル投資していれば、ほったらかしで 7,600ドルの利益に比べて 10,000ドルの利益（税引前）。リバランスに関わる手数料・税金で 1,700ドル。リバランスの頻度もほどほどが良いようです。やっぱり手数料・税金の影響は大きいですね。


## 1. 株価取得編
さて、前置きはともかく、本題の株価情報を取得する部分のコードを解説します。

### 1.1 株価情報の取得

ここでは Yahoo! Finance から HTML をパースして情報を取ってきてくれる関数をCaptain Awesome さんが公開してくれていたのでこちらを使います。

[Historical Stock Data Download (alternate Method)](https://jp.mathworks.com/matlabcentral/fileexchange/37502-historical-stock-data-download-alternate-method?s_eid=PSM_29435)

試しに VTI の株価を取得してみます。

```matlab:sample.m
vti = get_yahoo_stockdata3('vti','01-Mar-2008','01-Aug-2019','monthly');
```
で以下の変数が作られます。2007年7月30日から 2019年7月29日までのデータが取れていそう。

![vtiCapture.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/ad038783-7cdf-2070-2535-664b725c5463.jpeg)

このままだと扱いにくいので日付データを datetime 型に変換してプロットしてみますと、、2009年以降の伸びが素晴らしいですね。ちなみに VTI とは Vanguard Total Stock Market ETF と呼ばれ、米国株式市場そのものに連動する商品だと思っていただければOK.

```matlab:timetableVTI.m
time = datetime(vti.DateTime,'ConvertFrom','datenum');
plot(time, vti.closePrice)
grid on
title('VTI ($) : 2007 - 2019');
```
![vti_sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/87796b05-c990-73e4-4bb3-f50a7b764e07.png)


### 1.2 全株価情報（配当情報込み）の取得

今回必要な 6 銘柄の情報を、週ごとに取得してみます。ここでは後の処理をしやすいようにすべて timetable 型に確保します。 t*** が株価情報、 t***D は配当金情報。

```matlab:
[tvti,tvtiD] = createtimetable('vti','01-Aug-2007','01-Aug-2019','weekly');
[tvea,tveaD] = createtimetable('vea','01-Aug-2007','01-Aug-2019','weekly');
[tvwo,tvwoD] = createtimetable('vwo','01-Aug-2007','01-Aug-2019','weekly');
[tagg,taggD] = createtimetable('agg','01-Aug-2007','01-Aug-2019','weekly');
[tgld,tgldD] = createtimetable('gld','01-Aug-2007','01-Aug-2019','weekly');
[tiyr,tiyrD] = createtimetable('iyr','01-Aug-2007','01-Aug-2019','weekly');
```

株価と配当情報をそれぞれ 1 つの変数に纏めて、時系列を合わせるために retime を使っています。配当金と株価も週単位の時系列データにしました。

```matlab:
pricedata = synchronize(tvti,tvea,tvwo,tagg,tgld,tiyr);
pricedata = retime(pricedata,'weekly','nearest');
divdata = synchronize(tvtiD,tveaD,tvwoD,taggD,tgldD,tiyrD);
divdata = retime(divdata,'weekly','sum');
```

変数エディタで確認するとこんな感じ

![pricedata.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/5472f006-66c5-217a-1df9-aba9cc6ccdbf.jpeg)
![divdata.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/7df82387-d730-9a97-95ed-eefee6e41eea.jpeg)


プロットしてみます。

```matlab:plotallstock.m
stackedplot(pricedata);
grid on
```

![stocks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/118edb72-3edc-8912-0f74-bd2a717121aa.png)



Yahoo! Finance の情報を timetable 型に纏めた関数 createtimetable.m は以下。

```matlab:createtimetable.m
function [ttick, ttickD] = createtimetable(tickname,d1,d2,freq)

data = get_yahoo_stockdata3(tickname,d1,d2,freq);

time = datetime(data.DateTime,'ConvertFrom','datenum');
ttick = timetable(time,data.openPrice,'VariableNames',{data.ticker});

if isempty(data.dividends)
    ttickD = timetable(time([1,end]),[0;0],'VariableNames',{[data.ticker,'D']});
else
    timeD = datetime(data.dividends.DateTime,'ConvertFrom','datenum');
    ttickD = timetable(timeD,data.dividends.Amount,...
        'VariableNames',{[data.ticker,'D']});
end

end
```

次はリバランス部分を解説する予定。