ExcelVBAでRSIを計算する

前回までExcelVBAで単純移動平均線、ボリンジャーバンド、MACD、一目均衡表の計算を紹介しました。

今回はテクニカル分析のRSI(Relative Strength Index)をVBAを使って計算する方法を紹介します。
RSIは相場の過熱感(買われ過ぎや売られ過ぎ)を分析するオシレーター系のテクニカル分析です。
0~100の範囲で表すことができ、一般的に数値が小さいほど売られすぎ、大きいほど買われ過ぎとなります。

前準備

分析データの準備

まずは、分析する株価または為替のデータを準備する必要があります。

日経平均ならばこちらからCSVデータをダウンロードすることができます。もし、手元に分析したいデータがなければ、こちらで1年間程度の日足のデータを準備してください。

シートにデータを追加する

分析データを入手したら下記の順番でデータをシートに張り付けましょう。

A列は、年月日(昇順)、B列は始値、C列は高値、D列は安値、E列は終値です。F列にRSIの計算した結果を出力します。

B~Eの順番はエクセルでローソク足のグラフを作成するときの並び順に合わせています。

RSIのプログラムコード

プログラムコードは3つのプロシージャからなります。下記のプログラムをコピー&ペーストしてF5でプログラムを実行するとRSIの計算結果がシートのF列に貼り付けられます。

  • テクニカル分析のメインのプロシージャ(TechnicalAnalysisCalc)
  • RSIを計算するのプロシージャ(RSICalc)
  • 合計を計算するプロシージャ(SumCalc)
Sub TechnicalAnalysisCalc()
'テクニカル指標の計算

    '定数の定義
    Const FIRSTROW As Long = 2 'データ開始の行
    Const CloseP_C As Long = 5 '終値の列数
    Const RSI_C As Long = 6   'RSIを出力する列


    '変数の定義
    Dim chartData As Variant    'チャートデータを格納する配列
    Dim LastRow As Long         '最終行を格納する変数
    Dim RsiPeriod As Long 'RSIの期間を格納する変数

    'アクティブワークシートの設定(シート名が、Sheet1のとき。シート名が違う場合は変更して下さい)
    Worksheets("Sheet1").Select
    
    'SMAの過去の計算データクリア
    Range(Cells(FIRSTROW, RSI_C), Cells(Rows.Count, RSI_C)).Clear

    '変数の初期化
    RsiPeriod = 14   'RSIの期間(必要に応じて変更してください)
    LastRow = Cells(Cells(Rows.Count, 1).Row, 1).End(xlUp).Row '最終行の取得
    
    'チャートデータの取得(年月日から終値のデータを取得)
    chartData = Range(Cells(FIRSTROW, 1), Cells(LastRow, CloseP_C))
    
    'RSIの結果の出力
    Range(Cells(FIRSTROW, RSI_C), Cells(LastRow, RSI_C)) = RSICalc(chartData, CloseP_C, RsiPeriod)
 
End Sub

Function RSICalc(chartData, columnNum, Period)

    '変数の定義
    Dim RowNum As Long
    Dim CDRowNum As Long
    Dim Diff As Double  'ひとつ前の値との差
    Dim UpSum As Double '決められた期間の上昇値の合計
    Dim DownSum As Double '決められた期間の下降値の合計
    Dim RsiCal As Variant 'RSIの途中計算結果を格納する配列
    Dim Result As Variant '結果を格納する配列
    
    '配列数の要素数を取得
    CDRowNum = UBound(chartData, 1)
    
    '変数の再定義
    ReDim RsiCal(1 To CDRowNum, 2)
    ReDim Result(1 To CDRowNum, 1)

    'RSIの計算
    For RowNum = 2 To CDRowNum
        'RSIの計算に必要な値
        Diff = chartData(RowNum, columnNum) - chartData(RowNum - 1, columnNum)
        If Diff >= 0 Then
            RsiCal(RowNum, 0) = Diff
            RsiCal(RowNum, 1) = 0
        Else
            RsiCal(RowNum, 0) = 0
            RsiCal(RowNum, 1) = -1 * Diff
        End If
        
        'RSIの計算
        If RowNum >= Period + 1 Then
        
            UpSum = SumCalc(RsiCal, 0, RowNum - Period + 1, RowNum)
            DownSum = SumCalc(RsiCal, 1, RowNum - Period + 1, RowNum)

            Result(RowNum, 0) = 100 * UpSum / (UpSum + DownSum)
        End If
    Next RowNum
    
    '結果を返す
    RSICalc = Result

End Function


Function SumCalc(myArray, columnNum, startNum, endNum) As Double
'引数の概要
'myArrayは元データ、columnNum計算する要素の指定, starwNumは計算をスタートの配列の位置, endNumは計算が終わる配列の位置
    
    '変数の定義
    Dim i As Long
    Dim SumArr As Double
    
    '合計の初期化
    SumArr = 0

    '平均する数値の合計を計算
    For i = startNum To endNum
        SumArr = SumArr + myArray(i, columnNum)
    Next i
    
    '合計値を合計した数で割って平均値を算出し平均値を算出。平均値を返す。
    SumCalc = SumArr

End Function

TechnicalAnalysisCalcの概要

メインのプロシージャです。

定数はシートの列の位置を規定しています。列位置が変わってもここの数値を変更するだけで正常に動きます。

分析するデータが張り付けられているシート(Sheet1)をアクティブにしています。シート名を変更したときは、ここを変更してください。

既に計算データがあること想定して、データをクリアしています。

変数の初期化をしています。
RSIの期間は14に設定しています。必要に応じて変更してください。
分析するデータの最終行もここで取得・設定しています。

分析するデータをセルから配列に格納しています。

RSICalcを呼び出して、RSIの計算を実行し結果をシートに張り付けています。

RSICalcの概要

RSIを計算しその結果を返すプロシージャです。

まずはチャートのデータ数を取得しています。

ReDimを使って結果を格納する配列の要素数の規定しています。

RSIの計算式は下記です。

A:RSIの期間(一般には14)の値上がり幅の合計
B:RSIの期間(一般には14)の値上がり幅の合計

まずは、ひとつ前の値との差を計算しプラスかマイナスを判定します。
プラスならそのままの値を、マイナスなら-1を変えた値をそれぞれ配列のRsiCalに格納します。

上記のRsiに格納された値をSumCalcを呼び出し合計してAとBを計算します。

AとBからRSIを計算し配列に格納します。

最後に、結果を格納した配列を返します。

SumCalcの概要

このプロシージャは配列の指定された範囲の合計値を計算し、その結果を返すプロシージャです。

コメントを残す

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