Teploobmen’s diary

興味のあること、調べたことなど、雑多にまとめていきます。調べている内容の途中経過を書くこともあります。

投資主体別売買動向を解析してみる―ネ申エクセルとの闘い

 安倍政権が苦境に立たされているせいか、以前書いた民進党の金融政策が実施された場合の記事の閲覧数が伸びてきている。

 

teploobmen.hatenablog.com

  ただ、この記事ではあくまで「こういったことが起こりうる」という可能性の列挙にとどまった。だがこの機会に、民進党の金融政策が実施された場合、株価にどのような影響があるのか、可能性でなくデータでより詳細に分析してみたいと思う。

 だが、それにはまずデータの整理が必要だ。そこで、今回はデータの整理をしようかと思う。こんなことを考えなければよかったと作業を始めてから気がついた。

1.解析対象のデータ

 日銀、GPIF双方の動向と株価の関係を関係を調べるために、まずこれまでの売買の動向と株価の関係を知る必要がある。日銀はHPでその売買の履歴を知ることができる。だが、GPIFは

 そこで、投資主体別売買動ならば日銀、GPIF双方の動向をしることができる。と思ったのが間違いの始まりだった。

 これは、東証のHPで入手できる。このデータは、東証一部に上場する全銘柄の時価総額を基に計算されるため、投資主体別売買動向と比較するデータとして有用なはずだ。

 

 

2.ネ申エクセルとの闘い

2.0.ダウンロード時の闘い

 分析対象が定まったところで、データを手に入れよう。・・・と思ったら日本の会社でTOPIXのデータを公開しているところが無い・・・・仕方がないのでGoogleFinanceで手に入れる。・・・何か間違っている気がするのだが・・・

 続いて投資主体別売買動向だが・・・うん、週次、月次、年次と分けてデータを保管してくれてるのは嬉しいよ。だけどこの公開の仕方は無いでしょ・・・

 

f:id:Teploobmen:20170726210306p:plain

 しかもCSVでなくXLSファイルで公開されている・・・それにとどまらず中身はみんな大好きネ申エクセル!!

さすがIT後進国日本だ!!俺たちにできないことを平然とやってのける、そこにしびれる憧れるぅ(棒

f:id:Teploobmen:20170726210538p:plain

 これが114ヶ月分あるんだぜ・・・嘘みたいだろ・・・

 というわけで右手にマウス、左手はキーボードのCtrl、F4、Enterを抑えながらひたすらダウンロードを始める。・・手が大きくて得したのは久々だ・・・

 

2.1.ネ申エクセルとの闘い

 ダウンロードしきったは良いものの、データは加工できなければ意味がない。だがネ申エクセルの唯一の救いはデータのある場所が固定されているところだ。例えば、全体の売買動向は次のセルに書かれている。

 売り:X9

 買い:AN9

 差引:売り越しならX10、買い越しならAN10

 これらのデータのうち、必要なものは差引のデータだが、余計な分岐が現れてしまう。そこで、折角表計算ソフト(重要)を使っているのだから、売買のデータを両方共抽出し、あとから引き算すれば良い。

 また、ファイル名には規則性があり、2014年以前の金額ベースの月次データならば"J_stk2_m"という文字列に続いて4桁の年月が入るようだ。例えば、2007年1月ならファイル名は"J_stk2_m0701"となる。これなら楽勝だ。

 ただ、2014年からフォーマットが変わっているが、条件分岐で対応した。

f:id:Teploobmen:20170726210855p:plain

 これをTOPIXの月次データと比較する。

 

 

3.解析結果

 と、紆余曲折を経て得たデータを分析してみたいと思う。分析方法としては、まず以下の式により、月次騰落率を計算する。

\frac{月末株価-月初株価}{月初株価}\times 100

 これを縦軸にとり、横軸には各投資主体の売買金額の差額をとり、散布図を作成した上で、最小二乗法を用いた一次の線形近似曲線を引いた。ただし、売買金額の差額は、 プラスならば買い越し、マイナスならば売り越しを意味する。

 また、図中に記載のR^2値の平方根を求めることで、相関の強度を求めた。

 

3.1.全体の売買動向と月次株価

 まず、全体の売買動向と月次株価だが、やや強い正の相関があった。

 

f:id:Teploobmen:20170726043959p:plain

 

3.2.個人売買動向との比較

 続いて、個人の売買動向とTOPIXの比較だ。こちらは弱い負の相関が得られた。

f:id:Teploobmen:20170726044105p:plain

 一般に、個人は逆張りをすることで知られており、この売買動向に違和感はない。 

 

3.3.海外投資家売買動向との比較

 今度は、海外投資家の売買動向との比較をみてみよう。こちらは正の相関がみられた。

f:id:Teploobmen:20170726045051p:plain

 このデータも、海外投資家は順張りをするという一般論と矛盾しない。

 

3.4.信託銀行との比較

 つぎに、GPIFや日銀の売買動向を代行しているとされている信託銀行を見てみよう。こちらは弱い負の相関が得られた。

f:id:Teploobmen:20170726045446p:plain

 日銀は、TOPIXが下げたときに介入することで知られている。

東証株価指数(TOPIX)が午前の取引終了時(午前11時30分)に前日比でおおむね1%以上下げると日銀がETF買い入れに動く

5頭のクジラ、どこに 株安局面、消えた存在感 :日本経済新聞

 また、GPIFの行う現代ポートフォリオ法に基づいた投資法は、単純に逆張り投資をしているものとして知られている*1。したがって、これらの情報とデータに矛盾はないといえる。

 

3.5.自己との比較

 最後に、証券会社等が行う取引を反映した自己と株価を比較してみよう。全くの無相関である。こちらは考察が不可能だ。

f:id:Teploobmen:20170726051332p:plain

 

4.まとめと課題

 以上のことから、

 ただし、問題は因果関係が不明な点だ。例えば、売りポジが増えれば価格への下落圧力が高くなるが、価格の下落圧力があるから売りポジを増やしているのかもしれない。あくまで参考程度に留めておこう。

 また、日銀のETF買いは、「信託銀行」ではなく「自己」として反映されているという情報もある。こちらへの検証も必要かもしれない(やるとは言ってない)

kabu.nsjournal.jp

 

 

おまけ VBAのコード

 せっかく作ったのでコードを公開する。ただし、月次データにしか対応していないので注意してほしい。書き込み先がJ列以降になっているのは隣にTOPIXのデータとかを置いていたため。


Sub eleseCell()
    Dim i As Long
    i = 2
    Do While Cells(i, 1) <> ""
        If Range("B" & i) = "" Then
            Rows(i).Delete
            i = i - 1

        End If
        
        i = i + 1
    Loop
    i = 1
    Do While Cells(i, 1) <> ""
        Range("B" & i) = Range("E" & i + 1)
        Rows(i + 1).Delete
        i = i + 1
    Loop

    Columns(3).Delete
    Columns(3).Delete
End Sub

Sub main()
    Dim Y, M, row As Integer    'Yは年、Mは月の変数。YearとMonthは別に関数があるため避けた。rowは書き込み先の行番号
    row = 1
    For i = 17 To 14 Step -1
        If i = 17 Then
            For j = 6 To 1 Step -1
                Call getValue(getStr(i, j), row, "E14", "E13", "E31", "E30", True)
                row = row + 1
            Next j
        Else
            For j = 12 To 1 Step -1
                Call getValue(getStr(i, j), row, "E14", "E13", "E31", "E30", True)
                row = row + 1
            Next j
        End If
    Next i
    For i = 13 To 7 Step -1
        For j = 12 To 1 Step -1
            Call getValue(getStr(i, j), row, "CZ9", "CJ9", "CB21", "BP21", False)
            row = row + 1
        Next j
    Next i

End Sub
Private Function getStr(ByVal Y As Integer, ByVal M As Integer) As String   '年月を所定のフォーマットに直す
    getStr = getZero(Y) & getZero(M)
End Function

Private Function getZero(ByVal n As Integer) As String  '入力された数字が1桁の時、頭に0をつけた文字列に直す
    Dim Tex As String
    If n < 10 Then
        Tex = "0" & CStr(n)
    Else
        Tex = CStr(n)
    End If
    getZero = Tex
End Function

Sub getValue(ByVal bookNum As String, ByVal row As Integer, ByVal buyTotal As String, ByVal sellTotal As String, ByVal buyTrust As String, ByVal sellTrust As String, ByVal isNew As Boolean)
    'bookNum ファイル番号
    'row 保存する行を指定
    'buyTotal or sellTotal  全体の売買動向(を調べて終わらせるつもりだった)が書かれたセルを指定
    'buyTrust or sellTrust 全体の売買動向(を調べて終わらせるつもりだった)が書かれたセルを指定
    'isNew バージョンの新旧。2014年度以降ならTrue、以前ならFalse
    Dim obj As Object   'オブジェクト名保存
    Application.ScreenUpdating = False
    If isNew = False Then
        Workbooks.Open ("ここにファイルの保存先のパスを入れる\J_stk2_m" & bookNum & ".xls") 
    Else 
    Workbooks.Open ("C:\Users\哲郎\Downloads\投資主体別売買動向\stock_val_1_m" & bookNum & ".xls")
    EndIf 
    Set obj = ActiveWorkbook.Worksheets(1) 
    ThisWorkbook.Activate 
    Range("G" & row) = obj.Range(buyTotal)
    Range("H" & row) = obj.Range(sellTotal) 
    Range("I" & row) = obj.Range(buyTrust) 
    Range("J" & row) = obj.Range(sellTrust) 
    If isNew = False Then 
        Workbooks("J_stk2_m" & bookNum & ".xls").Close 
    Else 
        Workbooks("stock_val_1_m" & bookNum & ".xls").Close 
    End If Application.ScreenUpdating = True 
End Sub 

 

 

*1:Adaptive Asset Allocation Policies, William F. Sharpe,November 2009