株式会社シスアナコム

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

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

VBAで優待銘柄の売買をチェックする

      2015/04/19

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

VBAで優待銘柄の売買をチェックする

前回作ったACCESSのVBAプログラムで、株主優待銘柄の権利付き最終日を取得できるようになりました。

これを使って、権利付き最終日からA営業日前に購入して、B営業日前に売却するとどうなるかチェックできるプログラムを作りました。

その前に売買結果を残すプログラムを改良

その前に、少し前に作った株式の売買を行って結果を残すプログラムを改良しました。

買値と売値を記録に残してなかったのを残すようにしました。

Function BuyTheStock(STRT As Integer, TERM As Integer, Kabusuu As Currency) As Currency
'株式の売買を行って結果を返す(始値で購入して、始値で売ると仮定)
'STRT:当日から見た開始日(当日なら0、前日なら-1)
'TERM:保有期間(STRTから何営業日間保有するかを指定,>0,25日間なら24を指定)
'Kabusuu:購入株数
'戻り値:損益額
    
    Dim BY As Currency
    Dim SL As Currency
    Dim RET As Currency
    Dim S As String
    
    If STRT < -255 Or (STRT + TERM) > 255 Or TERM <= 0 Then
        BuyTheStock = 0
        Exit Function
    End If
    'パラメタのチェック
    
    If KabukaInfo(STRT + TERM, CHajimene) = 0 Or KabukaInfo(STRT, CHajimene) = 0 Then
        BuyTheStock = 0
        Exit Function
    End If
    '始値を取得できなければ処理を中止
    
    SL = KabukaInfo(STRT + TERM, CHajimene)
    BY = KabukaInfo(STRT, CHajimene)
    '買値と売値を取得
    RET = (SL - BY) * Kabusuu
    If RET > 0 Then S = "○ " Else S = "× "
    S = S & "開始=" & CStr(STRT) & " 期間=" & CStr(TERM) & " 買値=" & CStr(BY) & " 売値=" & CStr(SL) & " 株数=" & CStr(Kabusuu) & " 結果=" & CStr(RET)
    
    Call OutputLogFile("BuyTheStock", S)
    '処理結果を確認用ファイルへ出力

    BuyTheStock = RET

End Function

株主優待銘柄

銘柄コード、年、1年の何番目の優待か、権利付き最終日の何営業日前に購入するか、権利付き最終日の何営業日前に売却するかをパラメタにして、勝ち負けを判定します。

まだあまりチェックしてないので、バグがあるかも(汗)

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

    Dim DB As DAO.Database
    Dim RS As DAO.Recordset
    Dim KenriYMD As Date
    Dim SellYMD As Date
    Dim C As Currency
    Dim S As String
    Dim RET As Integer
    
    RET = 0
    
    If T <= 0 Or TERM1 > 0 Or TERM2 > 0 Then
        CheckYuutai = RET
        Exit Function
    End If
    'パラメタのチェック
    
    Set DB = CurrentDb
    Set RS = DB.OpenRecordset("T_株式_基本情報", dbOpenTable)
    
    RS.Index = "PrimaryKey"
    RS.Seek "=", CD
    If RS.NoMatch Then
        CheckYuutai = RET
        Exit Function
    End If
    '銘柄コードで基本情報を検索
    
    KenriYMD = GetYuutaiYMD(RS![優待権利確定月], T, YYYY)
    If KenriYMD = 0 Then
        CheckYuutai = RET
        Exit Function
    End If
    '権利確定日(通常は月末)を取得
    
    SellYMD = GetMarketDate(KenriYMD, -3 + TERM2)
    If SellYMD > LastDate Then
        CheckYuutai = RET
        Exit Function
    End If
    '売却日付(権利付き最終日=3営業日+TERM2前)を取得
    
    Call SetKabukaInfo(CD, SellYMD, -255)
    '売却日付を基準として株価データを取得
    
    If KabukaInfo(0, CHajimene) <> 0 Then
        S = "銘柄コード=" & CD & " 売却年月日=" & CStr(SellYMD)
        Call OutputLogFile("BuyTheStock", S)
        C = BuyTheStock(TERM1, -TERM1, RS![単元株数])
        If C > 0 Then
            RET = 1
        ElseIf C = 0 Then
            RET = 0
        Else
            RET = -1
        End If
    Else
        RET = 0
    End If

    CheckYuutai = RET

End Function

グローバル変数「LastDate」には、取り込んだ日々データの最終日(この記事を書いた時点では2014年12月19日)をセットしておきます。

実行結果

様々な企業が株主優待を実施していますが、代表的で人気の高い銘柄はマクドナルド(銘柄コード:2702)だと思います。

マクドナルドの優待を権利付き最終日の20営業日前に購入して、権利付き最終日で売却したらどうなるかをチェックします。

6月と12月が権利確定月で、「優待権利確定月」フィールドには「12月,6月」という文字列が入っています。

今年12月はまだ権利付き最終日が来てませんので、今年の6月でチェックしてみました。

? CheckYuutai("2702",2014,2,-20,0)
 1 

権利付き最終日の20営業日前に購入して、権利付き最終日に売却すると勝ちでした。

処理結果ログファイルには以下のように出力されます。

2014/12/21-21:03:48:銘柄コード=2702 売却年月日=2014/06/25
2014/12/21-21:03:48:○ 開始=-20 期間=20 買値=2877 売値=2902 株数=100 結果=2500

年末で少し忙しくなっていますが、もし時間があれば、次回は全銘柄に対して色んな条件でチェックしてみます。

今回はここまで。

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

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


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

Message

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