前回は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乗することで標準偏差を計算しています。