株式会社シスアナコム

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

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

VBAで移動平均、乖離率、最高値、最安値などを計算する

      2015/04/19

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

VBAで移動平均、乖離率、最高値、最安値などを計算する

引き続き、Microsoft ACCESSのVBAを使って株価分析のプログラムを作成しました。

まだまだ基本的なプログラムしか作成できていませんが、少しずつ増やしていく予定です。

未来の株価を配列へ格納する

未来の株価と言っても、未来を予測する訳ではありません。

過去の特定日を基準として、それよりも過去の株価を配列へ格納するプログラムを作りましたが、今回はその日を基準として、それよりも後の株価を配列へ格納するプログラムを作成しました。

Sub SetFutureKabukaInfo(CD As String, YMD As Date, TERM As Integer)
'T_株式_日々情報からKabukaInfo配列へデータを格納する
'過去の株価情報を削除しないで追加する
'TERM:取得期間(1~255)

    Dim DB As DAO.Database
    Dim RS As DAO.Recordset
    Dim YYYYMMDD As Date
    Dim DCNT As Integer
    Dim I As Integer
    Dim DTMP As Integer

    If Not IsMarket(YMD) Or TERM < 1 Or TERM > 255 Then Exit Sub
    '年月日が市場休場日なら処理を中止
    '取得期間範囲外なら処理を中止

    Set DB = CurrentDb
    Set RS = DB.OpenRecordset("T_株式_日々情報", dbOpenTable)
    RS.Index = "PrimaryKey"
    'データベース、レコードを開いて、主キーをセット

    I = 1: DCNT = 1
    Do Until DCNT = TERM + 1
        YYYYMMDD = DateSerial(Year(YMD), Month(YMD), Day(YMD) + I)
        '日付を作成
        If IsMarket(YYYYMMDD) Then
        '市場開催日?
            RS.Seek "=", CD, YYYYMMDD
            If RS.NoMatch Then Exit Do
            '市場開催日なのにレコードが存在しなければループを中断
            KabukaInfo(DCNT, CHajimene) = RS![始値]
            KabukaInfo(DCNT, CTakane) = RS![高値]
            KabukaInfo(DCNT, CYasune) = RS![安値]
            KabukaInfo(DCNT, COwarine) = RS![終値]
            KabukaInfo(DCNT, CDekidaka) = RS![出来高]
            'レコードから配列へデータをコピー
            DCNT = DCNT + 1
        End If
        I = I + 1
    Loop

    For I = 1 To TERM
        If KabukaInfo(I, CDekidaka) > 0 Then DTMP = I
        '出来高が存在する日を記憶しておく
        If KabukaInfo(I, CDekidaka) = 0 Then
            KabukaInfo(I, CHajimene) = KabukaInfo(DTMP, CHajimene)
            KabukaInfo(I, CTakane) = KabukaInfo(DTMP, CTakane)
            KabukaInfo(I, CYasune) = KabukaInfo(DTMP, CYasune)
            KabukaInfo(I, COwarine) = KabukaInfo(DTMP, COwarine)
        End If
        '出来高が存在しない日があれば、直近の出来高が存在する日のデータをコピー
    Next I

End Sub

過去の株価を配列へ格納するプログラムとよく似ていますが、配列をクリアしないで情報を追加している点が違います。

当面はあまり使わないプログラムかもしれません。

移動平均と乖離率を計算する

以前、25日移動平均を計算するプログラムを作りましたが、25日に限定する必要もないので、期間を自由に変更できるように改良しました。

Function GetMA(STRT As Integer, TERM As Integer) As Currency
'移動平均を計算する
'STRT:指定年月日から見た開始日(当日なら0,前日なら-1)
'TERM:対象期間(STRTから過去何営業日間かを指定,<=0,25日移動平均なら-24を指定)

    Dim C As Currency
    Dim I As Integer

    If (STRT + TERM) < -255 Or STRT > 255 Or TERM > 0 Then
        GetMA = 0
        Exit Function
    End If

    C = 0
    For I = STRT To (STRT + TERM) Step -1
        If KabukaInfo(I, COwarine) = 0 Then
            GetMA = 0
            Exit Function
            '計算期間に終値が判断できなければ処理を中止
        Else
            C = C + KabukaInfo(I, COwarine)
        End If
    Next I

    GetMA = C / Abs(TERM - 1)

End Function

経過日数を指定する方法をどうするか迷いましたが、過去を指定する場合はマイナス、未来を指定する場合はプラスという考え方にしました。

期間はその日だけなら0、過去25日間なら-24というような指定方法にしました。

移動平均を計算するプログラムを使って、乖離率を計算するプログラムも作りました。

Function GetDivMA(STRT As Integer, TERM As Integer) As Currency
'移動平均乖離率を計算する
'STRT:指定年月日から見た開始日(当日なら0,前日なら-1)
'TERM:対象期間(STRTから過去何営業日間かを指定,<=0,25日移動平均なら-24を指定)

    Dim MA As Currency

    MA = GetMA(STRT, TERM)
    GetDivMA = (KabukaInfo(STRT, COwarine) - MA) / MA * 100

End Function

乖離率とは株価が移動平均からどれくらい離れているかを計算したものです。

最高値と最安値を取得する

あと、指定した期間の最高値と最安値を取得するプログラムを作りました。

Function GetMaxTakane(STRT As Integer, TERM As Integer) As Currency
'指定した日から過去何日間かの最高値を取得する
'STRT:指定年月日から見た開始日(当日なら0,前日なら-1)
'TERM:対象期間(STRTから過去何営業日間かを指定,<0)

    Dim C As Currency
    Dim I As Integer

    If (STRT + TERM) < -255 Or STRT > 255 Or TERM >= 0 Then
        GetMaxTakane = 0
        Exit Function
    End If

    C = KabukaInfo(STRT, CTakane)
    For I = STRT To STRT + TERM Step -1
        If KabukaInfo(I, CTakane) = 0 Then
            GetMaxTakane = 0
            Exit Function
            '高値が判断できなければ処理を中止
        ElseIf C < KabukaInfo(I, CTakane) Then
            C = KabukaInfo(I, CTakane)
        End If
    Next I

    GetMaxTakane = C

End Function
Function GetMinYasune(STRT As Integer, TERM As Integer) As Currency
'指定した日から過去何日間かの最安値を取得する
'STRT:指定年月日から見た開始日(当日なら0,前日なら-1)
'TERM:対象期間(STRTから過去何営業日間かを指定,<0)

    Dim C As Currency
    Dim I As Integer

    If (STRT + TERM) < -255 Or STRT > 255 Or TERM >= 0 Then
        GetMinYasune = 0
        Exit Function
    End If

    C = KabukaInfo(STRT, CYasune)
    For I = STRT To STRT + TERM Step -1
        If KabukaInfo(I, CYasune) = 0 Then
            GetMinYasune = 0
            Exit Function
            '安値が判断できなければ処理
        ElseIf C > KabukaInfo(I, CYasune) Then
            C = KabukaInfo(I, CYasune)
        End If
    Next I

    GetMinYasune = C

End Function

たぶん抵抗線突破の判断やストキャスティクスの計算などに使えると思います。

実行結果を確認

いつも通り、トヨタ自動車の株価を使って実行結果を確認します。

基準日は2014年9月1日。

イミディエイトウィンドウから以下のようにして、過去と未来の株価を配列へセットして作成したプログラムを実行しました。

CALL SetKabukaInfo("7203",#2014/09/01#,-255)
CALL SetFutureKabukaInfo("7203",#2014/09/01#,255)
?GetMA(0,-24)
 6001.96
?GetMA(-5,-74)
 5915.6667
?GetMA(5,-199)
 5931.625
?GetDivMA(0,-24)
-0.7657
?GetDivMA(-5,-74)
 1.172
?GetDivMA(5,-199)
 2.9566
?GetMaxTakane(0,-8)
 6024
?GetMinYasune(0,-8)
 5911

実行結果は以下の通りです。

  • 基準日の25日移動平均
  • 5営業日前(2014年8月25日)の75日移動平均
  • 5営業日後(2014年9月8日)の200日移動平均
  • 基準日の25日移動平均乖離率
  • 5営業日前の75日移動平均乖離率
  • 5営業日後の200日移動平均乖離率
  • 基準日を含めて過去9日間の最高値
  • 基準日を含めて過去9日間の最安値

今回はここまで。

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

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


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

Message

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