株式会社シスアナコム

情報システムに関することなら、どんなことでも適切に助言いたします!

この投稿は1年以上前に公開されました。
現在では状況や内容が変わっている可能性があります。
ご注意下さい。m(_ _)m

VBAで全優待銘柄の傾向を分析する

      2015/04/19

「ゼロからの週末プログラマー」に掲載していた記事を改訂して掲載しています。

VBAで全優待銘柄の傾向を分析する

前回、株主優待銘柄の勝ち負けを判定するプログラムを作りました。

これを改良して、全優待銘柄に対して株価の傾向を分析するプログラムを作ります。

勝ち負けの結果を記録する

その前に、勝ち負けの結果を記録するために、グローバルな配列変数を作成して表示するためのプログラムを作りました。

Dim Result(-1 To 1, 1) As Currency

Sub ShowResult()
'分析結果を表示する

    Debug.Print "勝数=" & Result(1, 0)
    Debug.Print "分数=" & Result(0, 0)
    Debug.Print "負数=" & Result(-1, 0)
    Debug.Print "勝額=" & Result(1, 1)
    Debug.Print "負額=" & Result(-1, 1)

End Sub

全株主優待銘柄をチェックする

前回のプログラムを改良して、全優待銘柄を対象にするため、2つのサブルーチンにプログラムを分割しました。

Sub CheckYuutaiAll(TERM1 As Integer, TERM2 As Integer)
'株主優待銘柄について、以下の条件で購入したらどうなるかチェック
' 権利付き最終日からTERM1営業日前に購入
' 権利付き最終日からTERM2営業日前に売却

    If TERM1 > 0 Or TERM2 > 0 Then Exit Sub
    'パラメタのチェック

    Dim DB As DAO.Database
    Dim RS As DAO.Recordset
    Dim KenriYMD As Date
    Dim YYYY As Integer
    Dim I As Integer

    Erase Result
    '結果をリセット

    Set DB = CurrentDb
    Set RS = DB.OpenRecordset("T_株式_基本情報", dbOpenSnapshot)

    Do Until RS.EOF

        If RS![優待] Then
            For YYYY = 2012 To 2014
                I = 1
                KenriYMD = GetYuutaiYMD(RS![優待権利確定月], I, YYYY)
                '権利確定日(通常は月末)を取得
                Do Until KenriYMD = 0
                    Call CheckYuutai(RS![銘柄コード], RS![単元株数], KenriYMD, TERM1, TERM2)
                    I = I + 1
                    KenriYMD = GetYuutaiYMD(RS![優待権利確定月], I, YYYY)
                Loop
            Next YYYY
        End If

        RS.MoveNext
        DoEvents
    Loop

    Call ShowResult

End Sub

Sub CheckYuutai(CD As String, Tangen As Currency, KenriYMD As Date, TERM1 As Integer, TERM2 As Integer)
'株主優待銘柄について、以下の条件で購入したらどうなるかチェック
' 権利付き最終日からTERM1営業日前に購入
' 権利付き最終日からTERM2営業日前に売却
'CD:銘柄コード
'Tangen:単元株数
'KenriYMD:権利確定月末日
'TERM1:購入(営業日、<=0、3営業日前なら-3を指定)
'TERM2:売却(営業日、<=0、3営業日前なら-3を指定)
'戻り値:0...エラー/引き分け,1...勝ち,-1...負け

    Dim SellYMD As Date
    Dim C As Currency
    Dim S As String

    SellYMD = GetMarketDate(KenriYMD, -3 + TERM2)
    If SellYMD > LastDate Then Exit Sub
    '売却日付(権利付き最終日=3営業日+TERM2前)を取得

    Call SetKabukaInfo(CD, SellYMD, -255)
    '売却日付を基準として株価データを取得

    If KabukaInfo(0, CHajimene) <> 0 Then
        S = "銘柄コード=" & CD & " 売却年月日=" & CStr(SellYMD)
        Call OutputLogFile("BuyTheStock", S)
        C = BuyTheStock(TERM1 - TERM2, -TERM1 + TERM2, Tangen)
        If C > 0 Then
        '勝ち
            Result(1, 0) = Result(1, 0) + 1
            Result(1, 1) = Result(1, 1) + C
        ElseIf C < 0 Then
        '負け
            Result(-1, 0) = Result(-1, 0) + 1
            Result(-1, 1) = Result(-1, 1) + C
        Else
        '引き分け
            Result(0, 0) = Result(0, 0) + 1
        End If
    End If

End Sub

現時点で株主優待を実施している銘柄を対象にして、2012年~2014年まで3年間の株価動向をチェックできます。

過去の時点で株主優待を実施していない場合や、株主優待の制度が変わっていてもチェックの対象になってしまうので、完璧ではありませんが、3年間の傾向は分析できるはず。

分析その1:権利付き最終日のX営業日前に購入

まずは購入タイミングについて。

何営業日前に購入すると勝率が高いかを分析します。

パラメタTERM1に13営業日前~103営業日前まで10営業日毎に値を変えてみます。
パラメタTERM2は3営業日前で固定。

エクセルで実行結果から勝率を計算して表にしてみた結果がこちら。
Yuutai01
60営業日前~80営業日前ぐらいが勝率が高くなりました。

20営業日で1か月と考えると、3~4か月ぐらい前に購入すると勝率が高くなることが分かりました。

優待銘柄を現物で保有すると資金が押さえられてしまうので、できる限り保有期間を短くするという事を考えれば「3か月前」が最も効率が良い事が分かります。

それにしても、勝率が8割近いというのは凄い事です。

経験的な話で申し訳ありませんが、手数料や税金等を考慮すると勝率が7割を超えないと実践では使えないと考えています。

なので、グラフから判断して、少なくとも1か月半ほど前には優待銘柄を購入しておかないと勝つのは難しいと思います。

分析その2:権利付き最終日のX営業日前に売却

次に売却タイミングについて。

何営業日前に売却すると勝率が高いかを分析します。

パラメタTERM1は30営業日保有するように設定。
パラメタTERM2は0~6営業日前まで値を変えてみます。

エクセルで実行結果から勝率を計算して表にしてみた結果がこちら。
Yuutai02

パラメタTERM1で60営業日保有するようにした場合はこちら。
Yuutai04

ほぼ誤差の範囲内というグラフで微妙な結果ですが、どちらのグラフも1営業日前が最も勝率が高くなっています。

株主優待投資の結論

これが私の株主優待投資に対する結論です。

3か月前に購入して権利付き最終日の前日に売却する

ただし、過去3年間の株価を分析した結果ですし、完璧な分析結果でもありませんので、ご注意下さい。

勝率8割への挑戦

次回以降の方針ですが、全銘柄の株価チェックを行う方法がだいたい分かりましたので、株主優待投資の勝率「8割」を上回る投資方法があるのか探してみます。

ただし、本当に勝率8割を上回るような投資方法があったら、自分で資金をかき集めて実践するので、ここでは公表しません(笑)

色んな条件で検証してみて、勝率8割に到達できなかった場合は公表します。

今回はここまで。

 - ACCESSデータベース, 週末プログラマー

↓ブログランキングに参加しています!


ネット・PC(全般) ブログランキングへ
にほんブログ村 IT技術ブログ ITコンサルティングへ
にほんブログ村

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です