ExcelVBAで一目均衡表を計算する

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

今回はテクニカル分析の一目均衡表をVBAを使って計算する方法を紹介します。
一目均衡表は基準線、 転換線、先行スパン1、先行スパン2、遅行スパンの5つの線からなる指標です。
三役好転、三役逆転と呼ばれるシグナルでトレンドを確認して売買するなどの使われ方をします。

前準備

分析データの準備

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

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

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

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

A列は、年月日(昇順)、B列は始値、C列は高値、D列は安値、E列は終値です。F~J列に基準線、 転換線、先行スパン1、先行スパン2、遅行スパンの計算した結果を出力します。

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

一目均衡表のプログラムコード

プログラムコードは4つのプロシージャからなります。下記のプログラムをコピー&ペーストしてF5でプログラムを実行すると基準線、 転換線、先行スパン1、先行スパン2、遅行スパンの計算結果がシートのF~J列に貼り付けられます。

  • テクニカル分析のメインのプロシージャ(TechnicalAnalysisCalc)
  • 一目均衡表の計算のプロシージャ(IchimokuCalc)
  • 最大値を計算するプロシージャ(MaxCalc)
  • 最小値を計算するプロシージャ(MinCalc)
Sub TechnicalAnalysisCalc()
'テクニカル指標の計算

    '定数の定義
    Const FIRSTROW As Long = 2 'データ開始の行
    Const MaxP_C As Long = 3 '高値の列数
    Const MinP_C As Long = 4 '安値の列数
    Const CloseP_C As Long = 5 '終値の列数
    Const Ichimoku_C As Long = 6   '一目均衡表を出力する最初の列


    '変数の定義
    Dim ChartData As Variant    'チャートデータを格納する配列
    Dim LastRow As Long         '最終行を格納する変数
    Dim IchiTenP, IchiStdP, IchiSen2P As Long '一目均衡表の各種期間を格納する変数

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

    '変数の初期化
    IchiTenP = 9   '転換線の期間(必要に応じて変更してください)
    IchiStdP = 26 '基準線の期間(必要に応じて変更してください)
    IchiSen2P = 52   '先行スパン2の期間(必要に応じて変更してください)
    LastRow = Cells(Cells(Rows.Count, 1).Row, 1).End(xlUp).Row '最終行の取得
    
    'チャートデータの取得(年月日から終値のデータを取得)
    ChartData = Range(Cells(FIRSTROW, 1), Cells(LastRow, CloseP_C))
    
    '一目均衡表の計算結果の出力
    Range(Cells(FIRSTROW, Ichimoku_C), Cells(LastRow + IchiSen2P, Ichimoku_C + 4)) = IchimokuCalc(ChartData, MaxP_C, MinP_C, CloseP_C, IchiTenP, IchiStdP, IchiSen2P)
End Sub

Function IchimokuCalc(ChartData, MaxNum, MinNum, CloseNum, TenPeriod, StdPeriod, Sen2Period)
    
    '変数の定義
    Dim RowNum As Long
    Dim SenPeriod As Long
    Dim ChikoPeriod As Long
    Dim CDRowNum As Long
    Dim Result As Variant   '結果を格納する配列
    
    '最終行の取得
    CDRowNum = UBound(ChartData, 1)

    '初期化
    SenPeriod = StdPeriod
    ChikoPeriod = StdPeriod
    
    '変数の再定義(動的配列)
    ReDim Result(1 To CDRowNum + Sen2Period, 4)


    '基準線の計算
    For RowNum = StdPeriod To CDRowNum
        Result(RowNum, 0) = (MaxCalc(ChartData, MaxNum, RowNum - StdPeriod + 1, RowNum) + MinCalc(ChartData, MinNum, RowNum - StdPeriod + 1, RowNum)) / 2
    Next RowNum

    '転換線の計算
    For RowNum = TenPeriod To CDRowNum
        Result(RowNum, 1) = (MaxCalc(ChartData, MaxNum, RowNum - TenPeriod + 1, RowNum) + MinCalc(ChartData, MinNum, RowNum - TenPeriod + 1, RowNum)) / 2
    Next RowNum

    '先行スパン1の計算
    For RowNum = SenPeriod To CDRowNum
        Result(RowNum + SenPeriod, 2) = (Result(RowNum, 0) + Result(RowNum, 1)) / 2
    Next RowNum

    '先行スパン2の計算
    For RowNum = Sen2Period To CDRowNum
        Result(RowNum + SenPeriod, 3) = (MaxCalc(ChartData, MaxNum, RowNum - Sen2Period + 1, RowNum) + MinCalc(ChartData, MinNum, RowNum - Sen2Period + 1, RowNum)) / 2
    Next RowNum

    '遅行線の計算
    For RowNum = ChikoPeriod To CDRowNum
        Result(RowNum - ChikoPeriod + 1, 4) = ChartData(RowNum, CloseNum)
    Next RowNum
    
    '結果をセルに出力する
    IchimokuCalc = Result


End Function

Function MaxCalc(myArray, columnNum, startNum, endNum)
'最大値を算出する関数

    Dim MaxValue As Double
    Dim i As Long
    
    '最大値の初期値の入力
    MaxValue = myArray(startNum, columnNum)
    
    '最大値をMaxValueに代入
    For i = startNum To endNum
        If myArray(i, columnNum) > MaxValue Then
            MaxValue = myArray(i, columnNum)
        End If
    Next i
    
    MaxCalc = MaxValue
    
End Function

Function MinCalc(myArray, columnNum, startNum, endNum)
'最小値を算出する関数

    Dim MinValue As Double
    Dim i As Long
    
    '最小値の初期値の入力
    MinValue = myArray(startNum, columnNum)
    
    '最小値をMaxValueに代入
    For i = startNum To endNum
        If myArray(i, columnNum) < MinValue Then
            MinValue = myArray(i, columnNum)
        End If
    Next i
    
    MinCalc = MinValue
    
End Function

TechnicalAnalysisCalcの概要

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

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

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

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

変数の初期化をしています。
一目均衡表の転換線の期間、基準線の期間、先行スパン2の期間の3つがあります。転換線の期間は9、基準線の期間は26、先行スパン2は52に設定しています。必要に応じて変更してください。
分析するデータの最終行もここで取得・設定しています。

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

Ichimokucalcを呼び出して、一目均衡表の計算を実行し結果をシートに張り付けています。

IchimokuCalcの概要

基準線、 転換線、先行スパン1、先行スパン2、遅行スパンを計算しその結果を返すプロシージャです。

まずはチャートのデータ数を取得しています。
先行スパンの期間と遅行線の期間に基準線の期間を代入し初期化しています。
ReDimを使って結果を格納する配列の要素数の規定しています。

基準線、 転換線、先行スパン1、先行スパン2、遅行スパンを計算を計算し、Resultに計算結果を格納しています。

5つの線は下記のルールに基づき計算します。

  • 基準線:過去26日間の最高値+最安値)÷2
  • 転換線:過去9日間の最高値+最安値)÷2
  • 先行スパン1:{(転換値+基準値)÷2}を26日先行させる
  • 先行スパン2:{(過去52日間の最高値+最安値)÷2}を26日先行させる
  • 遅行線=:当日の終値を26日遅行させる

基準線、転換線、先行スパン2の計算で用いる最高値、最安値はそれぞれMaxCalc、MinCalcのプロシージャを呼び出して計算します。

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

MaxCalcの概要

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

指定された範囲で数値の大きさを比較し、最大の値をを返します。

MinCalcの概要

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

指定された範囲で数値の大きさを比較し、最小の値をを返します。

コメントを残す

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