前回までExcelVBAで単純移動平均線、ボリンジャーバンド、MACD、一目均衡表、RSI、ストキャスティクスの計算を紹介しました。
今回はテクニカル分析のRCIをVBAを使って計算する方法を紹介します。
RCI(Rank Correlation Index(順位相関指数))はトレンドを判断するのに使用される指標です。
各線は-100~100の範囲で表すことができ、数値が小さいほど売り圧力が強く、大きいほど買い圧力が強いと言われています。
一般的に短期線、中期線、長期線を組合わせて相場のトレンドを判断するのに使われたりします。
目次
前準備
分析データの準備
まずは、分析する株価または為替のデータを準備する必要があります。
日経平均ならばこちらからCSVデータをダウンロードすることができます。もし、手元に分析したいデータがなければ、こちらで1年間程度の日足のデータを準備してください。
シートにデータを追加する
分析データを入手したら下記の順番でデータをシートに張り付けましょう。
A列は、年月日(昇順)、B列は始値、C列は高値、D列は安値、E列は終値です。F~H列に短期、中期、長期のRCIを計算した結果を出力します。
B~Eの順番はエクセルでローソク足のグラフを作成するときの並び順に合わせています。
RCIのプログラムコード
プログラムコードは2つのプロシージャからなります。下記のプログラムをコピー&ペーストしてF5でプログラムを実行すると短期、中期、長期のRCIの計算結果がシートのF~H列に貼り付けられます。
- テクニカル分析のメインのプロシージャ(TechnicalAnalysisCalc)
- RCIの計算のプロシージャ(RCICalc)
Sub TechnicalAnalysisCalc()
'テクニカル指標の計算
'定数の定義
Const FIRSTROW As Long = 2 'データ開始の行
Const CloseP_C As Long = 5 '終値の列数
Const RCI_C As Long = 6 '短期の単純移動平均線を出力する列
'変数の定義
Dim ChartData As Variant 'チャートデータを格納する配列
Dim LastRow As Long '最終行を格納する変数
Dim RciShortP, RciMediumP, RciLongP As Long 'RCIの期間を格納する変数
'アクティブワークシートの設定(シート名が、Sheet1のとき。シート名が違う場合は変更して下さい)
Worksheets("Sheet1").Select
'SMAの過去の計算データクリア
Range(Cells(FIRSTROW, RCI_C), Cells(Rows.Count, RCI_C + 2)).Clear
'変数の初期化
RciShortP = 9 'RCIの期間(必要に応じて変更してください)
RciMediumP = 26 'RCIの期間(必要に応じて変更してください)
RciLongP = 52 'RCIの期間(必要に応じて変更してください)
LastRow = Cells(Cells(Rows.Count, 1).Row, 1).End(xlUp).Row '最終行の取得
'チャートデータの取得(年月日から終値のデータを取得)
ChartData = Range(Cells(FIRSTROW, 1), Cells(LastRow, CloseP_C))
'RCIの計算(短期、中期、長期)
Range(Cells(FIRSTROW, RCI_C), Cells(LastRow, RCI_C)) = RCICalc(ChartData, CloseP_C, RciShortP)
Range(Cells(FIRSTROW, RCI_C + 1), Cells(LastRow, RCI_C + 1)) = RCICalc(ChartData, CloseP_C, RciMediumP)
Range(Cells(FIRSTROW, RCI_C + 2), Cells(LastRow, RCI_C + 2)) = RCICalc(ChartData, CloseP_C, RciLongP)
End Sub
Function RCICalc(ChartData, columnNum, Period)
'変数の定義
Dim CDRowNum As Long 'チャートデータの行数
Dim RowNum As Long '計算している行
Dim PRowNum As Long '一時計算用の配列の行
Dim i, j As Long 'ソート時に使用
Dim SumV As Long 'RCIのSUMの値
Dim RciCal As Variant 'RCIの途中計算結果の格納
Dim RciCalTemp As Variant 'RCIの途中計算結果の格納(ソート時)
Dim Result As Variant '結果を格納する配列
'チャートデータ数の取得
CDRowNum = UBound(ChartData, 1)
'結果を格納する配列の要素数を規定する
ReDim RciCal(1 To Period, 2)
ReDim RciCalTemp(0 To 1)
ReDim Result(1 To CDRowNum, 1)
'RCIの計算
For RowNum = Period To CDRowNum
'価格と日付順位を配列に格納(日付は今が1過去になれば数値が大きくなる)
For PRowNum = 1 To Period
RciCal(PRowNum, 0) = ChartData(RowNum - PRowNum + 1, columnNum)
RciCal(PRowNum, 1) = PRowNum
Next PRowNum
'価格を降順に並べ変える(バブルソート)
For i = 1 To Period - 1
For j = i + 1 To Period
If RciCal(j, 0) > RciCal(i, 0) Then
RciCalTemp(0) = RciCal(i, 0)
RciCalTemp(1) = RciCal(i, 1)
RciCal(i, 0) = RciCal(j, 0)
RciCal(i, 1) = RciCal(j, 1)
RciCal(j, 0) = RciCalTemp(0)
RciCal(j, 1) = RciCalTemp(1)
End If
Next j
Next i
'RCIのSUMを計算する
SumV = 0 'SumVを初期化
For PRowNum = 1 To Period
SumV = SumV + (RciCal(PRowNum, 1) - PRowNum) ^ 2
Next PRowNum
'RCIを計算し、結果を配列に格納する
Result(RowNum, 0) = (1 - (6 * SumV) / (Period ^ 3 - Period)) * 100
Next RowNum
'結果を返す
RCICalc = Result
End Function
TechnicalAnalysisCalcの概要
メインのプロシージャです。
定数はシートの列の位置を規定しています。列位置が変わってもここの数値を変更するだけで正常に動きます。
分析するデータが張り付けられているシート(Sheet1)をアクティブにしています。シート名を変更したときは、ここを変更してください。
既に計算データがあること想定して、データをクリアしています。
変数の初期化をしています。
RCIは短期、中期、長期の期間の3つがあります。短期は9、中期は26、長期は52に設定しています。必要に応じて変更してください。
分析するデータの最終行もここで取得・設定しています。
分析するデータをセルから配列に格納しています。
RCICalcを呼び出して、RCIの計算を実行し結果をシートに張り付けています。
RCICalcの概要
RCIを計算しその結果を返すプロシージャです。
まずはチャートのデータ数を取得しています。
ReDimを使って計算途中の結果や最終結果を格納する配列の要素数の規定しています。
RCIを計算しResultに計算結果を格納しています。
RCIは下記の式で計算できます。
nは期間です。
SUMは日付順位(現在は1として過去になるにつれて順位が大きくなる)と価格順位の差の2乗の合計となります。
SUMは下図のように計算できます。
この図の合計(198)が期間を9日としたときの2022年1月17日のSUMとなります。
コードでは、RciCalに価格と日時順位を代入します。その後、価格を降順になるようにRciCalの価格と日時順位を並び替えています。この順番が価格順位となりますので、日時順位と価格順位の差を2乗して合計し、SumVに代入します。
SumVと期間からRCIを計算し結果を配列に格納します。
最後に、結果を格納した配列を返します。