ExcelVBAでボリンジャーバンドを計算する

前回はExcelVBAで単純移動平均線の計算をしました。

ExcelVBAで単純移動平均線(SMA)を計算する

今回はテクニカル分析のボリンジャーバンドをVBAを使って計算する方法を紹介します。
ボリンジャーバンドは標準偏差を計算してバンドを描きます。バンドウォークでトレンドを確認したり、バンドを抜けたときの反発を狙うなどが代表的な使い方です。

前準備

分析データの準備

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

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

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

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

A列は、年月日(昇順)、B列は始値、C列は高値、D列は安値、E列は終値です。F~L列にボリンジャーバンドの計算した結果を出力します。

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

ボリンジャーバンドのプログラムコード

プログラムコードは4つのプロシージャからなります。下記のプログラムをコピー&ペーストしてF5でプログラムを実行するとボリンジャーバンドの中心線、±1σ、±2σ、±3σの計算結果がシートのF~L列に貼り付けられます。

  • テクニカル分析のメインのプロシージャ(TechnicalAnalysisCalc)
  • ボリンジャーバンドのの計算のプロシージャ(BBcalc)
  • 平均値を計算するプロシージャ(AverageCalc)
  • 標準偏差を計算するプロシージャ(StDevPCalc)
Sub TechnicalAnalysisCalc()
'テクニカル指標の計算

    '定数の定義
    Const FIRSTROW As Long = 2 'データ開始の行
    Const CloseP_C As Long = 5 '終値の列数
    Const BB_C As Long = 6   'ボリンジャーバンドを出力する最初の列


    '変数の定義
    Dim ChartData As Variant    'チャートデータを格納する配列
    Dim LastRow As Long         '最終行を格納する変数
    Dim BBTerm As Long 'ボリンジャーバンドの期間を格納する変数

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

    '変数の初期化
    BBTerm = 20   'ボリンジャーバンドの期間(必要に応じて変更してください))
    LastRow = Cells(Cells(Rows.Count, 1).Row, 1).End(xlUp).Row '最終行の取得
    
    'チャートデータの取得(年月日から終値のデータを取得)
    ChartData = Range(Cells(FIRSTROW, 1), Cells(LastRow, CloseP_C))
    
    'ボリンジャーバンドのシートへの出力
    Range(Cells(FIRSTROW, BB_C), Cells(LastRow, BB_C + 6)) = BBcalc(ChartData, CloseP_C, BBTerm)

End Sub

Function BBcalc(ChartData, columnNum, Period)
'引数の概要
'ChartDataはチャートのデータ、CDNumはChartDataの移動平均線を計算する対象データの列、startRowは、columNumは計算結果を書込む列、Periodは移動平均線の期間
    
    '変数の定義
    Dim CDRowNum As Long 'チャートデータの行数
    Dim RowNum As Long  '計算している行
    Dim StDev As Double '標準偏差
    Dim Result As Variant   '結果を格納する配列
    
    'チャートデータ数の取得
    CDRowNum = UBound(ChartData, 1)

    '移動平均線を格納する配列の要素数を規定する
    ReDim Result(1 To CDRowNum, 6)
        
    '移動平均線の計算
    For RowNum = Period To CDRowNum
        Result(RowNum, 0) = AverageCalc(ChartData, columnNum, RowNum - Period + 1, RowNum) '平均値を計算し、結果を配列に格納する
        StDev = StDevPCalc(ChartData, columnNum, RowNum - Period + 1, RowNum)  '標準偏差の計算
        Result(RowNum, 1) = Result(RowNum, 0) + StDev
        Result(RowNum, 2) = Result(RowNum, 0) - StDev
        Result(RowNum, 3) = Result(RowNum, 0) + 2 * StDev
        Result(RowNum, 4) = Result(RowNum, 0) - 2 * StDev
        Result(RowNum, 5) = Result(RowNum, 0) + 3 * StDev
        Result(RowNum, 6) = Result(RowNum, 0) - 3 * StDev
    Next RowNum
    
    '結果を返す
    BBcalc = Result

End Function

Function AverageCalc(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
    
    '合計値を合計した数で割って平均値を算出し平均値を算出。平均値を返す。
    AverageCalc = SumArr / (endNum - startNum + 1)

End Function


Function StDevPCalc(myArray, columnNum, startNum, endNum) As Double
'myArrayは元データ、columnNum計算する要素の指定, starwNumは計算をスタートの配列の位置, endNumは計算が終わる配列の位置

'変数の定義
    Dim i As Long
    Dim DiffSum As Double
    Dim Ave As Double
    
    '合計の初期化
    DiffSum = 0
    
    '平均値の計算
    Ave = AverageCalc(myArray, columnNum, startNum, endNum)
    
    '平均との差の2乗の合計を計算
    For i = startNum To endNum
        DiffSum = DiffSum + (myArray(i, columnNum) - Ave) ^ 2
    Next i
    
    '標準偏差を計算して返す
    StDevPCalc = (DiffSum / (endNum - startNum + 1)) ^ 0.5

End Function

TechnicalAnalysisCalcの概要

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

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

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

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

変数の初期化をしています。
ボリンジャーバンドの期間は標準的な期間の20としています。変更したい場合はここの数字を変更してください。
分析するデータの最終行もここで取得・設定しています。

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

BBcalcを呼び出して、ボリンジャーバンドの計算を実行し結果をセルに張り付けています。

単純移動平均線とボリンジャーバンドを同時に計算したい場合は、次の記事を参考にこのプロシージャに単純移動平均線の計算のコードも組込みましょう。

ExcelVBAで単純移動平均線(SMA)を計算する

BBclalcの概要

ボリンジャーバンドを計算しその結果を返すプロシージャです。

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

計算結果を格納する配列の行数と列数を規定します。列数はボリンジャーバンドが7本から成るので一つ少ない6を指定しています。

指定された期間の平均値をAverageCalcを呼び出して計算し結果を配列に格納しています。
指定された期間の標準偏差(σ)をStDevPCalcを呼び出して計算し、StDev変数に格納します。
平均値にそれぞれ±σ、±2σ、±3σした値を足した値を配列に格納します。
これを最終行まで計算を繰返します。

最後に、結果を確認した配列を返します。

AverageCalcの概要

このプロシージャは単純移動平均線の計算の時と全く同じです。

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

配列のstartNumからendNumまでの値を合計して、合計した要素数で割ることで平均値を計算しています。

StDevPCalcの概要

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

AverageCalcを呼び出して平均値を計算します。

配列のstartNumからendNumまでの値と平均値の差の2乗した値を合計し、合計した要素数で割った値を0.5乗することで標準偏差を計算しています。

コメントを残す

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