LoginSignup
0
1

More than 3 years have passed since last update.

エクセルマクロ(Excel VBA)で株式指標(RSI)を計算する

Last updated at Posted at 2019-08-12

エクセルマクロ(Excel VBA)で株式指標(RSI)を計算する

本記事について

4本値データから、RSIを計算する。テクニカルトレーダーなら一度はやったことがあると思います。しかしこの計算、文字で書くのは簡単ですが

  • 前日との差を求める
  • 全日差のうちプラスの値のみ足し合わせる
  • 全日差のうち、マイナスの値のみ足し合わせる
  • プラスの和 / ( プラスの和+マイナスの和 ) × 100 を計算する

これらの計算は一発ではできず、途中式をエクセル上に残しておかなければなりません。
非表示セルにしてもよいですが、後から見返したときに大量の「中間式」があると分かりにくい・・・
本記事では、そういった「面倒な部分」を全てマクロ(VBA)にお任せして、エクセルシートを簡潔にすることを目的とします。

マクロを使用した場合と使用しない場合の比較

マクロを使用しない場合(エクセル関数のみ)

全日差を求めた後、SUMIFS関数を用いてプラスのみ、マイナスのみの合計を求めてからRSIを計算しています。
RSIを求めたいだけなのに、途中式のための行が3行も増えてしまいました。
後から見返したら、何をしているのか分からなくなる原因です。
before.png

マクロを使用した場合

マクロを使用した場合、以下の一行でRSIを求めることができます
=RSI(先頭セル, RSIの日数)
今回紹介するコードは、下図のように昇順でデータを並べ、最新のデータを先頭セルとして選択すれば、下方向にデータを引っ張ってくる仕様になっています。
after.png

ソースコード

RSI.bas
' RSIを計算する
' arg RSIを求める先頭セル(先頭セルから下方向に計算する)
' day RSIの日数
Function RSI(先頭セル As Range, RSIの日数 As Long) As Double

    ' 計算対象セルを保存する
    Dim calcCell As Range
    ' プラスの差分の和
    Dim plusSum As Long
    plusSum = 0
    ' プラスマイナスの差分の和
    Dim allSum As Long
    allSum = 0
    ' 差分を保存する
    Dim delta As Long
    delta = 0

    Dim i As Long
    For i = 0 To RSIの日数 - 1
        ' 計算対象セルを日数分ずらしていく
        Set calcCell = Cells(先頭セル(1).Row + i, 先頭セル(1).Column)

        ' 該当足のデータが数値以外・空白のセルの場合エラー
        If (Not IsNumeric(calcCell)) Or IsEmpty(calcCell) Then
            RSI = CVErr(xlErrNA)
            Exit Function
        End If

        ' 一本前のデータが数値以外・空白のセルの場合エラー
        If (Not IsNumeric(calcCell.Offset(1))) Or IsEmpty(calcCell.Offset(1)) Then
            RSI = CVErr(xlErrNA)
            Exit Function
        End If

        ' 一本前の値との差を求める
        delta = calcCell.Value - calcCell.Offset(1).Value

        ' プラスの場合、差分を追加
        If 0 < delta Then
            plusSum = plusSum + delta
        End If

        ' プラマイ関係なく、差分の絶対値を追加
        allSum = allSum + Math.Abs(delta)
    Next

    ' RSIを計算する
    RSI = plusSum / allSum * 100

End Function
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1