アセットアロケーションを組むよ~まずはExcelの日付処理だ

最近ファイナンス教育を受け、投資信託を始めることを決意した。

投資信託アセットアロケーション(資産配分)を決定し、ドルコスト平均法で積立を行うスタイルで行くつもりだ。すなわちアセットアロケーションをいかに決定するかが鍵となる。

 

アセットアロケーションはあらゆるアセットクラスから自分の投資スタイルに合わせた配分を決定しなければならない。配分を決めるには利益率(リターン)と標準偏差(リスク)を知る必要がある為、過去データを入手し、分析しなければならない。

 

過去データを入手する方法① Yahooファイナンス

メリット・・・かんたんにアクセスでき、月毎、日毎と指定して抽出できる。

デメリット・・・CSVで落とせないため、コピーペーストに労力がかかる。

 

過去データを入手する方法② SBI証券

メリット・・・CSVで落とせる

デメリット・・・登録が必要。データが勤務日毎である。

 

わたしはSBI証券を利用している。そして勤務日毎のデータからいかに各月の初日のデータを抽出するかに悩んでいる。そこを解決すれば楽にデータを分析できると踏んだ。

 

f:id:ponsukechu:20180513124320p:plain

初めに思い付いたのはDay関数でフィルタをかけ、1でフィルタをかけることだ。

これで毎月1日を取り出すことができる。

 

…と思ったが、それでは1日が休業日だった場合にうまく抽出できない。歯抜けの月がでてしまう。

 

こうなったらマクロを組もうと思った

結果としてA(日付列)のループで月初めの勤務日かどうかを判定し、E列に結果を出力する。

 

なんとか試行錯誤して完成しました(汚いけど...)

 

Public Sub FirstWork()
Dim RefRow, RowAmount As Integer
Dim BottomDate, JudgeDate As Date

RefRow = 9
RowAmount = 2460
JudgeDate = Sheets(1).Cells(RefRow, 1).Value


Dim i As Integer
i = 0
Dim LoopDate As Integer
LoopDate = 1
Dim d1 As Date

BottomDate = Sheets(1).Cells(RefRow + RowAmount - 1, 1).Value
Dim OffsetDay As Integer
OffsetDay = Day(BottomDate)
BottomDate = DateAdd("d", -OffsetDay + 1, BottomDate)
BottomDate = DateAdd("m", 1, BottomDate)
Do

d1 = Sheets(1).Cells(RefRow + i, 1).Value

If Year(d1) = Year(JudgeDate) And Month(d1) = Month(JudgeDate) Then
OffsetDay = Day(JudgeDate)
JudgeDate = DateAdd("m", 1, JudgeDate)
JudgeDate = DateAdd("d", -OffsetDay + 1, JudgeDate)
Sheets(1).Cells(RefRow + i, 5).Value = "True"
Else
Sheets(1).Cells(RefRow + i, 5).Value = "False"
End If
i = i + 1
Loop Until JudgeDate = BottomDate
End Sub

 

 

f:id:ponsukechu:20180513185933p:plain

出力結果をTrueとしてフィルタをかけた