エクセルマクロ(Excel VBA)で株式指標(RSI)を計算する
本記事について
4本値データから、RSIを計算する。テクニカルトレーダーなら一度はやったことがあると思います。しかしこの計算、文字で書くのは簡単ですが
- 前日との差を求める
- 全日差のうちプラスの値のみ足し合わせる
- 全日差のうち、マイナスの値のみ足し合わせる
- プラスの和 / ( プラスの和+マイナスの和 ) × 100 を計算する
これらの計算は一発ではできず、途中式をエクセル上に残しておかなければなりません。
非表示セルにしてもよいですが、後から見返したときに大量の「中間式」があると分かりにくい・・・
本記事では、そういった「面倒な部分」を全てマクロ(VBA)にお任せして、エクセルシートを簡潔にすることを目的とします。
マクロを使用した場合と使用しない場合の比較
マクロを使用しない場合(エクセル関数のみ)
全日差を求めた後、SUMIFS関数を用いてプラスのみ、マイナスのみの合計を求めてからRSIを計算しています。
RSIを求めたいだけなのに、途中式のための行が3行も増えてしまいました。
後から見返したら、何をしているのか分からなくなる原因です。
マクロを使用した場合
マクロを使用した場合、以下の一行でRSIを求めることができます
=RSI(先頭セル, RSIの日数)
今回紹介するコードは、下図のように昇順でデータを並べ、最新のデータを先頭セルとして選択すれば、下方向にデータを引っ張ってくる仕様になっています。
##ソースコード
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